summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-08-31 13:16:24 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-08-31 13:16:24 -0400
commitc75a270a82fdf7f92d118c61237fea034cbc17f3 (patch)
tree691a074cd6e8e3b43d61ec9f370c6ca0518590fc
parent0a880566f5889cdeb6fa3f96f5916c39dbb16b38 (diff)
Bump inja; trdata and trpoke to json
-rw-r--r--arm9/asm/unk_02038C78.s2
-rw-r--r--arm9/asm/unk_0204AB0C.s2
-rw-r--r--arm9/asm/unk_0206ABC4.s24
-rw-r--r--arm9/global.inc6
-rw-r--r--arm9/modules/11/asm/module_11_thumb2.s4
-rw-r--r--arm9/modules/67/asm/module_67.s2
-rw-r--r--files/poketool/trainer/trdata.json20472
-rw-r--r--files/poketool/trainer/trdata.json.txt22
-rw-r--r--files/poketool/trainer/trdata/.knarcignore2
-rw-r--r--files/poketool/trainer/trdata/narc_0000.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0001.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0002.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0003.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0004.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0005.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0006.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0007.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0008.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0009.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0010.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0011.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0012.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0013.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0014.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0015.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0016.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0017.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0018.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0019.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0020.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0021.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0022.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0023.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0024.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0025.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0026.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0027.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0028.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0029.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0030.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0031.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0032.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0033.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0034.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0035.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0036.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0037.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0038.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0039.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0040.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0041.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0042.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0043.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0044.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0045.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0046.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0047.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0048.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0049.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0050.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0051.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0052.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0053.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0054.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0055.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0056.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0057.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0058.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0059.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0060.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0061.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0062.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0063.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0064.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0065.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0066.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0067.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0068.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0069.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0070.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0071.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0072.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0073.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0074.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0075.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0076.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0077.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0078.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0079.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0080.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0081.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0082.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0083.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0084.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0085.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0086.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0087.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0088.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0089.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0090.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0091.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0092.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0093.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0094.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0095.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0096.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0097.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0098.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0099.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0100.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0101.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0102.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0103.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0104.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0105.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0106.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0107.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0108.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0109.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0110.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0111.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0112.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0113.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0114.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0115.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0116.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0117.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0118.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0119.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0120.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0121.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0122.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0123.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0124.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0125.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0126.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0127.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0128.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0129.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0130.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0131.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0132.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0133.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0134.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0135.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0136.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0137.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0138.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0139.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0140.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0141.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0142.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0143.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0144.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0145.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0146.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0147.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0148.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0149.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0150.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0151.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0152.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0153.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0154.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0155.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0156.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0157.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0158.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0159.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0160.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0161.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0162.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0163.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0164.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0165.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0166.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0167.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0168.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0169.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0170.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0171.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0172.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0173.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0174.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0175.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0176.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0177.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0178.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0179.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0180.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0181.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0182.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0183.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0184.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0185.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0186.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0187.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0188.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0189.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0190.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0191.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0192.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0193.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0194.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0195.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0196.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0197.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0198.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0199.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0200.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0201.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0202.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0203.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0204.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0205.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0206.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0207.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0208.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0209.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0210.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0211.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0212.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0213.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0214.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0215.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0216.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0217.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0218.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0219.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0220.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0221.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0222.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0223.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0224.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0225.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0226.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0227.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0228.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0229.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0230.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0231.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0232.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0233.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0234.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0235.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0236.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0237.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0238.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0239.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0240.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0241.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0242.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0243.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0244.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0245.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0246.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0247.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0248.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0249.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0250.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0251.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0252.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0253.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0254.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0255.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0256.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0257.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0258.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0259.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0260.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0261.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0262.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0263.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0264.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0265.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0266.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0267.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0268.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0269.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0270.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0271.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0272.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0273.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0274.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0275.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0276.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0277.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0278.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0279.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0280.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0281.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0282.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0283.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0284.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0285.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0286.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0287.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0288.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0289.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0290.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0291.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0292.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0293.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0294.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0295.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0296.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0297.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0298.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0299.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0300.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0301.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0302.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0303.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0304.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0305.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0306.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0307.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0308.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0309.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0310.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0311.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0312.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0313.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0314.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0315.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0316.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0317.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0318.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0319.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0320.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0321.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0322.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0323.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0324.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0325.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0326.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0327.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0328.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0329.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0330.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0331.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0332.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0333.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0334.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0335.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0336.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0337.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0338.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0339.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0340.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0341.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0342.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0343.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0344.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0345.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0346.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0347.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0348.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0349.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0350.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0351.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0352.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0353.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0354.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0355.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0356.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0357.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0358.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0359.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0360.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0361.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0362.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0363.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0364.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0365.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0366.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0367.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0368.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0369.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0370.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0371.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0372.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0373.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0374.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0375.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0376.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0377.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0378.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0379.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0380.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0381.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0382.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0383.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0384.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0385.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0386.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0387.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0388.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0389.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0390.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0391.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0392.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0393.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0394.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0395.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0396.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0397.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0398.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0399.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0400.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0401.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0402.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0403.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0404.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0405.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0406.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0407.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0408.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0409.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0410.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0411.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0412.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0413.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0414.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0415.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0416.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0417.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0418.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0419.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0420.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0421.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0422.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0423.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0424.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0425.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0426.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0427.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0428.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0429.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0430.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0431.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0432.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0433.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0434.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0435.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0436.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0437.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0438.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0439.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0440.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0441.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0442.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0443.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0444.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0445.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0446.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0447.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0448.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0449.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0450.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0451.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0452.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0453.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0454.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0455.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0456.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0457.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0458.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0459.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0460.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0461.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0462.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0463.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0464.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0465.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0466.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0467.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0468.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0469.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0470.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0471.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0472.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0473.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0474.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0475.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0476.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0477.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0478.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0479.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0480.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0481.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0482.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0483.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0484.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0485.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0486.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0487.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0488.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0489.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0490.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0491.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0492.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0493.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0494.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0495.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0496.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0497.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0498.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0499.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0500.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0501.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0502.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0503.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0504.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0505.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0506.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0507.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0508.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0509.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0510.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0511.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0512.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0513.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0514.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0515.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0516.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0517.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0518.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0519.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0520.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0521.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0522.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0523.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0524.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0525.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0526.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0527.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0528.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0529.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0530.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0531.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0532.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0533.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0534.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0535.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0536.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0537.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0538.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0539.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0540.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0541.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0542.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0543.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0544.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0545.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0546.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0547.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0548.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0549.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0550.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0551.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0552.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0553.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0554.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0555.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0556.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0557.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0558.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0559.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0560.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0561.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0562.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0563.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0564.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0565.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0566.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0567.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0568.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0569.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0570.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0571.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0572.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0573.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0574.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0575.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0576.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0577.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0578.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0579.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0580.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0581.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0582.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0583.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0584.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0585.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0586.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0587.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0588.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0589.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0590.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0591.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0592.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0593.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0594.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0595.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0596.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0597.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0598.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0599.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0600.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0601.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0602.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0603.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0604.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0605.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0606.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0607.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0608.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0609.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0610.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0611.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0612.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0613.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0614.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0615.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0616.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0617.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0618.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0619.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0620.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0621.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0622.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0623.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0624.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0625.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0626.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0627.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0628.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0629.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0630.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0631.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0632.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0633.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0634.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0635.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0636.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0637.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0638.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0639.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0640.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0641.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0642.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0643.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0644.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0645.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0646.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0647.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0648.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0649.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0650.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0651.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0652.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0653.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0654.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0655.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0656.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0657.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0658.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0659.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0660.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0661.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0662.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0663.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0664.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0665.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0666.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0667.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0668.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0669.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0670.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0671.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0672.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0673.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0674.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0675.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0676.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0677.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0678.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0679.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0680.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0681.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0682.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0683.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0684.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0685.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0686.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0687.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0688.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0689.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0690.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0691.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0692.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0693.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0694.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0695.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0696.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0697.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0698.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0699.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0700.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0701.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0702.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0703.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0704.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0705.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0706.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0707.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0708.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0709.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0710.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0711.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0712.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0713.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0714.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0715.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0716.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0717.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0718.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0719.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0720.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0721.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0722.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0723.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0724.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0725.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0726.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0727.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0728.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0729.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0730.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0731.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0732.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0733.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0734.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0735.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0736.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0737.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0738.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0739.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0740.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0741.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0742.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0743.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0744.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0745.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0746.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0747.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0748.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0749.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0750.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0751.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0752.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0753.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0754.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0755.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0756.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0757.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0758.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0759.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0760.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0761.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0762.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0763.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0764.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0765.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0766.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0767.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0768.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0769.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0770.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0771.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0772.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0773.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0774.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0775.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0776.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0777.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0778.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0779.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0780.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0781.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0782.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0783.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0784.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0785.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0786.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0787.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0788.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0789.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0790.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0791.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0792.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0793.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0794.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0795.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0796.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0797.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0798.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0799.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0800.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0801.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0802.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0803.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0804.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0805.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0806.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0807.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0808.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0809.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0810.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0811.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0812.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0813.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0814.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0815.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0816.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0817.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0818.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0819.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0820.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0821.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0822.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0823.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0824.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0825.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0826.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0827.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0828.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0829.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0830.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0831.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0832.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0833.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0834.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0835.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0836.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0837.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0838.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0839.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0840.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0841.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0842.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0843.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0844.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0845.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0846.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0847.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0848.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trdata/narc_0849.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke.json.txt52
-rw-r--r--files/poketool/trainer/trpoke/.knarcignore2
-rw-r--r--files/poketool/trainer/trpoke/narc_0000.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0001.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0002.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0003.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0004.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0005.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0006.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0007.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0008.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0009.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0010.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0011.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0012.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0013.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0014.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0015.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0016.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0017.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0018.binbin24 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0019.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0020.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0021.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0022.binbin36 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0023.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0024.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0025.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0026.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0027.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0028.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0029.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0030.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0031.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0032.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0033.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0034.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0035.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0036.binbin24 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0037.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0038.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0039.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0040.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0041.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0042.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0043.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0044.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0045.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0046.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0047.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0048.binbin32 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0049.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0050.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0051.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0052.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0053.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0054.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0055.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0056.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0057.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0058.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0059.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0060.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0061.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0062.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0063.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0064.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0065.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0066.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0067.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0068.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0069.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0070.binbin24 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0071.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0072.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0073.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0074.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0075.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0076.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0077.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0078.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0079.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0080.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0081.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0082.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0083.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0084.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0085.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0086.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0087.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0088.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0089.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0090.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0091.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0092.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0093.binbin24 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0094.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0095.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0096.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0097.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0098.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0099.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0100.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0101.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0102.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0103.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0104.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0105.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0106.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0107.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0108.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0109.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0110.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0111.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0112.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0113.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0114.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0115.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0116.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0117.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0118.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0119.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0120.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0121.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0122.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0123.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0124.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0125.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0126.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0127.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0128.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0129.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0130.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0131.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0132.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0133.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0134.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0135.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0136.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0137.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0138.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0139.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0140.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0141.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0142.binbin24 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0143.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0144.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0145.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0146.binbin24 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0147.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0148.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0149.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0150.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0151.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0152.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0153.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0154.binbin32 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0155.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0156.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0157.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0158.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0159.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0160.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0161.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0162.binbin24 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0163.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0164.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0165.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0166.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0167.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0168.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0169.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0170.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0171.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0172.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0173.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0174.binbin24 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0175.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0176.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0177.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0178.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0179.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0180.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0181.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0182.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0183.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0184.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0185.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0186.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0187.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0188.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0189.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0190.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0191.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0192.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0193.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0194.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0195.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0196.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0197.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0198.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0199.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0200.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0201.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0202.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0203.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0204.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0205.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0206.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0207.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0208.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0209.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0210.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0211.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0212.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0213.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0214.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0215.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0216.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0217.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0218.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0219.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0220.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0221.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0222.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0223.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0224.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0225.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0226.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0227.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0228.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0229.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0230.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0231.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0232.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0233.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0234.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0235.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0236.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0237.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0238.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0239.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0240.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0241.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0242.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0243.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0244.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0245.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0246.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0247.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0248.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0249.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0250.binbin48 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0251.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0252.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0253.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0254.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0255.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0256.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0257.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0258.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0259.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0260.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0261.binbin80 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0262.binbin80 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0263.binbin80 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0264.binbin80 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0265.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0266.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0267.binbin96 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0268.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0269.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0270.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0271.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0272.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0273.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0274.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0275.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0276.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0277.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0278.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0279.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0280.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0281.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0282.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0283.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0284.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0285.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0286.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0287.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0288.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0289.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0290.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0291.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0292.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0293.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0294.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0295.binbin32 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0296.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0297.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0298.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0299.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0300.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0301.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0302.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0303.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0304.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0305.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0306.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0307.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0308.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0309.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0310.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0311.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0312.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0313.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0314.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0315.binbin48 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0316.binbin48 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0317.binbin48 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0318.binbin48 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0319.binbin64 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0320.binbin64 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0321.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0322.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0323.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0324.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0325.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0326.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0327.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0328.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0329.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0330.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0331.binbin24 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0332.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0333.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0334.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0335.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0336.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0337.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0338.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0339.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0340.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0341.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0342.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0343.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0344.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0345.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0346.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0347.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0348.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0349.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0350.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0351.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0352.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0353.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0354.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0355.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0356.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0357.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0358.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0359.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0360.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0361.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0362.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0363.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0364.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0365.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0366.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0367.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0368.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0369.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0370.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0371.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0372.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0373.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0374.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0375.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0376.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0377.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0378.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0379.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0380.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0381.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0382.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0383.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0384.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0385.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0386.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0387.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0388.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0389.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0390.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0391.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0392.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0393.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0394.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0395.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0396.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0397.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0398.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0399.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0400.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0401.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0402.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0403.binbin48 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0404.binbin64 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0405.binbin48 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0406.binbin32 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0407.binbin48 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0408.binbin48 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0409.binbin48 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0410.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0411.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0412.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0413.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0414.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0415.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0416.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0417.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0418.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0419.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0420.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0421.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0422.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0423.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0424.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0425.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0426.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0427.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0428.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0429.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0430.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0431.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0432.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0433.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0434.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0435.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0436.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0437.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0438.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0439.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0440.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0441.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0442.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0443.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0444.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0445.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0446.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0447.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0448.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0449.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0450.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0451.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0452.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0453.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0454.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0455.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0456.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0457.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0458.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0459.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0460.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0461.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0462.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0463.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0464.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0465.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0466.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0467.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0468.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0469.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0470.binbin56 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0471.binbin56 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0472.binbin56 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0473.binbin56 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0474.binbin56 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0475.binbin56 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0476.binbin72 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0477.binbin72 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0478.binbin72 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0479.binbin84 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0480.binbin84 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0481.binbin84 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0482.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0483.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0484.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0485.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0486.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0487.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0488.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0489.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0490.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0491.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0492.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0493.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0494.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0495.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0496.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0497.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0498.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0499.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0500.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0501.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0502.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0503.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0504.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0505.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0506.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0507.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0508.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0509.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0510.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0511.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0512.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0513.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0514.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0515.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0516.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0517.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0518.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0519.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0520.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0521.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0522.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0523.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0524.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0525.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0526.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0527.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0528.binbin48 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0529.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0530.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0531.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0532.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0533.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0534.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0535.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0536.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0537.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0538.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0539.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0540.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0541.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0542.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0543.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0544.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0545.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0546.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0547.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0548.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0549.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0550.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0551.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0552.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0553.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0554.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0555.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0556.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0557.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0558.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0559.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0560.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0561.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0562.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0563.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0564.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0565.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0566.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0567.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0568.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0569.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0570.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0571.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0572.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0573.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0574.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0575.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0576.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0577.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0578.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0579.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0580.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0581.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0582.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0583.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0584.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0585.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0586.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0587.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0588.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0589.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0590.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0591.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0592.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0593.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0594.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0595.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0596.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0597.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0598.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0599.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0600.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0601.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0602.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0603.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0604.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0605.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0606.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0607.binbin84 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0608.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0609.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0610.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0611.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0612.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0613.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0614.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0615.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0616.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0617.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0618.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0619.binbin84 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0620.binbin84 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0621.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0622.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0623.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0624.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0625.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0626.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0627.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0628.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0629.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0630.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0631.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0632.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0633.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0634.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0635.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0636.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0637.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0638.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0639.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0640.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0641.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0642.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0643.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0644.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0645.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0646.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0647.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0648.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0649.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0650.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0651.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0652.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0653.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0654.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0655.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0656.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0657.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0658.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0659.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0660.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0661.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0662.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0663.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0664.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0665.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0666.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0667.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0668.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0669.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0670.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0671.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0672.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0673.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0674.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0675.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0676.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0677.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0678.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0679.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0680.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0681.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0682.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0683.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0684.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0685.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0686.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0687.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0688.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0689.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0690.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0691.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0692.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0693.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0694.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0695.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0696.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0697.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0698.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0699.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0700.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0701.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0702.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0703.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0704.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0705.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0706.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0707.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0708.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0709.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0710.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0711.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0712.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0713.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0714.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0715.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0716.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0717.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0718.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0719.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0720.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0721.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0722.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0723.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0724.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0725.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0726.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0727.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0728.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0729.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0730.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0731.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0732.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0733.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0734.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0735.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0736.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0737.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0738.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0739.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0740.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0741.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0742.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0743.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0744.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0745.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0746.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0747.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0748.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0749.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0750.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0751.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0752.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0753.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0754.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0755.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0756.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0757.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0758.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0759.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0760.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0761.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0762.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0763.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0764.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0765.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0766.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0767.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0768.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0769.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0770.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0771.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0772.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0773.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0774.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0775.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0776.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0777.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0778.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0779.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0780.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0781.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0782.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0783.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0784.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0785.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0786.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0787.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0788.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0789.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0790.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0791.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0792.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0793.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0794.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0795.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0796.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0797.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0798.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0799.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0800.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0801.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0802.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0803.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0804.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0805.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0806.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0807.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0808.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0809.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0810.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0811.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0812.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0813.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0814.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0815.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0816.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0817.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0818.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0819.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0820.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0821.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0822.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0823.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0824.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0825.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0826.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0827.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0828.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0829.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0830.binbin28 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0831.binbin16 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0832.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0833.binbin44 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0834.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0835.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0836.binbin20 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0837.binbin84 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0838.binbin84 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0839.binbin84 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0840.binbin84 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0841.binbin84 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0842.binbin84 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0843.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0844.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0845.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0846.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0847.binbin8 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0848.binbin12 -> 0 bytes
-rw-r--r--files/poketool/trainer/trpoke/narc_0849.binbin12 -> 0 bytes
-rw-r--r--filesystem.mk15
-rw-r--r--include/trainer_data.h70
-rw-r--r--tools/jsonproc/inja.hpp5150
-rw-r--r--tools/jsonproc/jsonproc.cpp4
-rw-r--r--tools/jsonproc/nlohmann/json.hpp5967
1716 files changed, 28434 insertions, 3362 deletions
diff --git a/arm9/asm/unk_02038C78.s b/arm9/asm/unk_02038C78.s
index 73daf808..d16d93f2 100644
--- a/arm9/asm/unk_02038C78.s
+++ b/arm9/asm/unk_02038C78.s
@@ -2143,7 +2143,7 @@ _02039628: .word 0x00001388
FUN_0203962C: ; 0x0203962C
push {r3, lr}
mov r1, #0x9
- bl FUN_0206AC74
+ bl TrainerData_GetAttr
cmp r0, #0x0
beq _0203963C
mov r0, #0x1
diff --git a/arm9/asm/unk_0204AB0C.s b/arm9/asm/unk_0204AB0C.s
index 5da6e8d4..45702b12 100644
--- a/arm9/asm/unk_0204AB0C.s
+++ b/arm9/asm/unk_0204AB0C.s
@@ -304,7 +304,7 @@ _0204AD0A:
FUN_0204AD0C: ; 0x0204AD0C
push {r3-r5, lr}
mov r1, #0x1
- bl FUN_0206AC74
+ bl TrainerData_GetAttr
lsl r0, r0, #0x18
lsr r5, r0, #0x18
ldr r0, _0204AD38 ; =0x0000044D
diff --git a/arm9/asm/unk_0206ABC4.s b/arm9/asm/unk_0206ABC4.s
index 9d8b12d8..7ea69ce1 100644
--- a/arm9/asm/unk_0206ABC4.s
+++ b/arm9/asm/unk_0206ABC4.s
@@ -43,7 +43,7 @@ _0206ABF4:
cmp r0, #0x0
beq _0206AC48
add r1, sp, #0x14
- bl FUN_0206ADE0
+ bl TrainerData_ReadTrData
ldr r3, [sp, #0x8]
add r6, sp, #0x14
add r3, #0x28
@@ -77,7 +77,7 @@ _0206AC3E:
ldr r0, [sp, #0x0]
ldr r2, [sp, #0x4]
add r1, r7, #0x0
- bl FUN_0206AE0C
+ bl LoadTrainerParty
_0206AC48:
ldr r0, [sp, #0x8]
add r7, r7, #0x1
@@ -100,13 +100,13 @@ _0206AC48:
nop
_0206AC70: .word 0x0000022F
- thumb_func_start FUN_0206AC74
-FUN_0206AC74: ; 0x0206AC74
+ thumb_func_start TrainerData_GetAttr
+TrainerData_GetAttr: ; 0x0206AC74
push {r4-r5, lr}
sub sp, #0x34
add r5, r1, #0x0
add r1, sp, #0x0
- bl FUN_0206ADE0
+ bl TrainerData_ReadTrData
cmp r5, #0x9
bhi _0206ACCC
add r0, r5, r5
@@ -293,8 +293,8 @@ _0206ADD6:
nop
_0206ADDC: .word 0x0000022E
- thumb_func_start FUN_0206ADE0
-FUN_0206ADE0: ; 0x0206ADE0
+ thumb_func_start TrainerData_ReadTrData
+TrainerData_ReadTrData: ; 0x0206ADE0
ldr r3, _0206ADEC ; =ReadWholeNarcMemberByIdPair
add r2, r0, #0x0
add r0, r1, #0x0
@@ -303,8 +303,8 @@ FUN_0206ADE0: ; 0x0206ADE0
nop
_0206ADEC: .word ReadWholeNarcMemberByIdPair
- thumb_func_start FUN_0206ADF0
-FUN_0206ADF0: ; 0x0206ADF0
+ thumb_func_start TrainerData_ReadTrPoke
+TrainerData_ReadTrPoke: ; 0x0206ADF0
ldr r3, _0206ADFC ; =ReadWholeNarcMemberByIdPair
add r2, r0, #0x0
add r0, r1, #0x0
@@ -321,8 +321,8 @@ FUN_0206AE00: ; 0x0206AE00
nop
_0206AE08: .word UNK_020F8010
- thumb_func_start FUN_0206AE0C
-FUN_0206AE0C: ; 0x0206AE0C
+ thumb_func_start LoadTrainerParty
+LoadTrainerParty: ; 0x0206AE0C
push {r3-r7, lr}
sub sp, #0x50
add r7, r1, #0x0
@@ -345,7 +345,7 @@ FUN_0206AE0C: ; 0x0206AE0C
add r0, r4, r6
ldr r0, [r0, #0x18]
ldr r1, [sp, #0x4c]
- bl FUN_0206ADF0
+ bl TrainerData_ReadTrPoke
mov r0, #0x34
add r5, r7, #0x0
mul r5, r0
diff --git a/arm9/global.inc b/arm9/global.inc
index 1dc35362..c039fd35 100644
--- a/arm9/global.inc
+++ b/arm9/global.inc
@@ -4838,11 +4838,11 @@
.extern WazaGetMaxPp
.extern GetAttrFromWazaTbl
.extern FUN_0206ABC4
-.extern FUN_0206AC74
+.extern TrainerData_GetAttr
.extern FUN_0206ACD4
.extern FUN_0206AD4C
-.extern FUN_0206ADE0
-.extern FUN_0206ADF0
+.extern TrainerData_ReadTrData
+.extern TrainerData_ReadTrPoke
.extern FUN_0206AE00
.extern PCStorage_init
.extern PCStorage_sizeof
diff --git a/arm9/modules/11/asm/module_11_thumb2.s b/arm9/modules/11/asm/module_11_thumb2.s
index c342adc4..a962fbf2 100644
--- a/arm9/modules/11/asm/module_11_thumb2.s
+++ b/arm9/modules/11/asm/module_11_thumb2.s
@@ -11742,11 +11742,11 @@ MOD11_02234CFC: ; 0x02234CFC
str r0, [sp, #4]
ldrh r0, [r6, r0]
add r1, sp, #8
- bl FUN_0206ADE0
+ bl TrainerData_ReadTrData
ldr r0, [sp, #4]
add r1, r4, #0
ldrh r0, [r6, r0]
- bl FUN_0206ADF0
+ bl TrainerData_ReadTrPoke
add r0, sp, #8
ldrb r1, [r0]
cmp r1, #3
diff --git a/arm9/modules/67/asm/module_67.s b/arm9/modules/67/asm/module_67.s
index 997d785e..d71a7476 100644
--- a/arm9/modules/67/asm/module_67.s
+++ b/arm9/modules/67/asm/module_67.s
@@ -1701,7 +1701,7 @@ _021D822A:
mov r1, #1
lsl r0, r0, #0x10
lsr r0, r0, #0x11
- bl FUN_0206AC74
+ bl TrainerData_GetAttr
cmp r0, #0x3f
bne _021D828A
ldr r0, [r4, #0x50]
diff --git a/files/poketool/trainer/trdata.json b/files/poketool/trainer/trdata.json
new file mode 100644
index 00000000..2f2877a9
--- /dev/null
+++ b/files/poketool/trainer/trdata.json
@@ -0,0 +1,20472 @@
+{
+ "trdata": [
+ {
+ "index": 1,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_STARLY"
+ }
+ ]
+ },
+ {
+ "index": 2,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_SHINX"
+ }
+ ]
+ },
+ {
+ "index": 3,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 3,
+ "species": "SPECIES_BIDOOF"
+ },
+ {
+ "difficulty": 0,
+ "level": 3,
+ "species": "SPECIES_BIDOOF"
+ }
+ ]
+ },
+ {
+ "index": 4,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_BIDOOF"
+ },
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_ZUBAT"
+ }
+ ]
+ },
+ {
+ "index": 5,
+ "type": 0,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 6,
+ "type": 0,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 7,
+ "type": 0,
+ "class": 5,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 8,
+ "type": 0,
+ "class": 5,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 9,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 10,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_MAGIKARP"
+ },
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_STARLY"
+ }
+ ]
+ },
+ {
+ "index": 11,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 7,
+ "species": "SPECIES_BUDEW"
+ }
+ ]
+ },
+ {
+ "index": 12,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 7,
+ "species": "SPECIES_BIDOOF"
+ }
+ ]
+ },
+ {
+ "index": 13,
+ "type": 0,
+ "class": 6,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 7,
+ "species": "SPECIES_KRICKETOT"
+ },
+ {
+ "difficulty": 0,
+ "level": 7,
+ "species": "SPECIES_WURMPLE"
+ }
+ ]
+ },
+ {
+ "index": 14,
+ "type": 0,
+ "class": 7,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 7,
+ "species": "SPECIES_BUDEW"
+ },
+ {
+ "difficulty": 0,
+ "level": 7,
+ "species": "SPECIES_CHERUBI"
+ }
+ ]
+ },
+ {
+ "index": 15,
+ "type": 0,
+ "class": 8,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 9,
+ "species": "SPECIES_PACHIRISU"
+ },
+ {
+ "difficulty": 0,
+ "level": 9,
+ "species": "SPECIES_PACHIRISU"
+ }
+ ]
+ },
+ {
+ "index": 16,
+ "type": 1,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 14,
+ "species": "SPECIES_PONYTA",
+ "moves": [
+ "MOVE_EMBER",
+ "MOVE_TACKLE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 17,
+ "type": 1,
+ "class": 5,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 12,
+ "species": "SPECIES_SHINX",
+ "moves": [
+ "MOVE_SPARK",
+ "MOVE_TACKLE"
+ ]
+ },
+ {
+ "difficulty": 0,
+ "level": 12,
+ "species": "SPECIES_PACHIRISU",
+ "moves": [
+ "MOVE_SPARK",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_CHARM"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 18,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 11,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 11,
+ "species": "SPECIES_MACHOP"
+ },
+ {
+ "difficulty": 0,
+ "level": 11,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 11,
+ "species": "SPECIES_BIDOOF"
+ }
+ ]
+ },
+ {
+ "index": 19,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 14,
+ "species": "SPECIES_ONIX"
+ }
+ ]
+ },
+ {
+ "index": 20,
+ "type": 0,
+ "class": 10,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 15,
+ "species": "SPECIES_MACHOP"
+ }
+ ]
+ },
+ {
+ "index": 21,
+ "type": 0,
+ "class": 7,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 14,
+ "species": "SPECIES_BUDEW"
+ }
+ ]
+ },
+ {
+ "index": 22,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 10,
+ "species": "SPECIES_MAGIKARP"
+ },
+ {
+ "difficulty": 0,
+ "level": 10,
+ "species": "SPECIES_MAGIKARP"
+ },
+ {
+ "difficulty": 0,
+ "level": 10,
+ "species": "SPECIES_MAGIKARP"
+ },
+ {
+ "difficulty": 0,
+ "level": 10,
+ "species": "SPECIES_MAGIKARP"
+ },
+ {
+ "difficulty": 0,
+ "level": 10,
+ "species": "SPECIES_MAGIKARP"
+ },
+ {
+ "difficulty": 0,
+ "level": 10,
+ "species": "SPECIES_MAGIKARP"
+ }
+ ]
+ },
+ {
+ "index": 23,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 14,
+ "species": "SPECIES_GOLDEEN"
+ }
+ ]
+ },
+ {
+ "index": 24,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 10,
+ "species": "SPECIES_MAGIKARP"
+ },
+ {
+ "difficulty": 0,
+ "level": 13,
+ "species": "SPECIES_GOLDEEN"
+ },
+ {
+ "difficulty": 0,
+ "level": 10,
+ "species": "SPECIES_MAGIKARP"
+ }
+ ]
+ },
+ {
+ "index": 25,
+ "type": 0,
+ "class": 12,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_STARAVIA"
+ }
+ ]
+ },
+ {
+ "index": 26,
+ "type": 0,
+ "class": 12,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_PONYTA"
+ }
+ ]
+ },
+ {
+ "index": 27,
+ "type": 0,
+ "class": 12,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_STARLY"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_STARAVIA"
+ }
+ ]
+ },
+ {
+ "index": 28,
+ "type": 0,
+ "class": 12,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_ZUBAT"
+ }
+ ]
+ },
+ {
+ "index": 29,
+ "type": 0,
+ "class": 13,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_SHINX"
+ }
+ ]
+ },
+ {
+ "index": 30,
+ "type": 0,
+ "class": 13,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_STARLY"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_PONYTA"
+ }
+ ]
+ },
+ {
+ "index": 31,
+ "type": 0,
+ "class": 13,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_PIKACHU"
+ }
+ ]
+ },
+ {
+ "index": 32,
+ "type": 0,
+ "class": 13,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_SHINX"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_SHINX"
+ }
+ ]
+ },
+ {
+ "index": 33,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_STARLY"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_CHIMCHAR"
+ }
+ ]
+ },
+ {
+ "index": 34,
+ "type": 1,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_PONYTA",
+ "moves": [
+ "MOVE_EMBER",
+ "MOVE_TACKLE",
+ "MOVE_GROWL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 35,
+ "type": 1,
+ "class": 5,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_PACHIRISU",
+ "moves": [
+ "MOVE_SPARK",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_CHARM"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 36,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 16,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 16,
+ "species": "SPECIES_GEODUDE"
+ }
+ ]
+ },
+ {
+ "index": 37,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 16,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_BRONZOR"
+ }
+ ]
+ },
+ {
+ "index": 38,
+ "type": 0,
+ "class": 10,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 18,
+ "species": "SPECIES_MEDITITE"
+ },
+ {
+ "difficulty": 30,
+ "level": 18,
+ "species": "SPECIES_MACHOP"
+ }
+ ]
+ },
+ {
+ "index": 39,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_GEODUDE"
+ }
+ ]
+ },
+ {
+ "index": 40,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 35,
+ "species": "SPECIES_GOLBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 35,
+ "species": "SPECIES_GRAVELER"
+ },
+ {
+ "difficulty": 0,
+ "level": 35,
+ "species": "SPECIES_ONIX"
+ }
+ ]
+ },
+ {
+ "index": 41,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_ONIX"
+ }
+ ]
+ },
+ {
+ "index": 42,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 19,
+ "species": "SPECIES_MACHOP"
+ }
+ ]
+ },
+ {
+ "index": 43,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_BARBOACH"
+ },
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 44,
+ "type": 0,
+ "class": 7,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 16,
+ "species": "SPECIES_COMBEE"
+ },
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_ROSELIA"
+ }
+ ]
+ },
+ {
+ "index": 45,
+ "type": 0,
+ "class": 15,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_MIME_JR"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_BONSLY"
+ }
+ ]
+ },
+ {
+ "index": 46,
+ "type": 0,
+ "class": 16,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 16,
+ "species": "SPECIES_BONSLY"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_BUDEW"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_PICHU"
+ }
+ ]
+ },
+ {
+ "index": 47,
+ "type": 0,
+ "class": 17,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 16,
+ "species": "SPECIES_MIME_JR"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_BUDEW"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_CLEFFA"
+ }
+ ]
+ },
+ {
+ "index": 48,
+ "type": 0,
+ "class": 18,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 14,
+ "species": "SPECIES_BIDOOF"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_BIDOOF"
+ },
+ {
+ "difficulty": 0,
+ "level": 16,
+ "species": "SPECIES_BIDOOF"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_BIDOOF"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_BIDOOF"
+ }
+ ]
+ },
+ {
+ "index": 49,
+ "type": 0,
+ "class": 19,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_LUXIO"
+ }
+ ]
+ },
+ {
+ "index": 50,
+ "type": 0,
+ "class": 20,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 51,
+ "type": 0,
+ "class": 21,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 52,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 53,
+ "type": 0,
+ "class": 22,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_PIKACHU"
+ }
+ ]
+ },
+ {
+ "index": 54,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 55,
+ "type": 0,
+ "class": 23,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_MACHOP"
+ },
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_MEDITITE"
+ }
+ ]
+ },
+ {
+ "index": 56,
+ "type": 0,
+ "class": 16,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_PICHU"
+ },
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_PIKACHU"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_HAPPINY"
+ }
+ ]
+ },
+ {
+ "index": 57,
+ "type": 0,
+ "class": 17,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_CLEFFA"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_CLEFAIRY"
+ },
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_HAPPINY"
+ }
+ ]
+ },
+ {
+ "index": 58,
+ "type": 0,
+ "class": 18,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 59,
+ "type": 0,
+ "class": 19,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 60,
+ "type": 0,
+ "class": 20,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 61,
+ "type": 0,
+ "class": 21,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 62,
+ "type": 0,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 63,
+ "type": 0,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 64,
+ "type": 0,
+ "class": 26,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 65,
+ "type": 0,
+ "class": 8,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_PIKACHU"
+ },
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_CLEFAIRY"
+ }
+ ]
+ },
+ {
+ "index": 66,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 25,
+ "species": "SPECIES_MOTHIM",
+ "moves": [
+ "MOVE_CONFUSION",
+ "MOVE_SILVER_WIND",
+ "MOVE_POISON_POWDER"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 26,
+ "species": "SPECIES_ONIX",
+ "moves": [
+ "MOVE_SLAM",
+ "MOVE_ROCK_THROW",
+ "MOVE_SCREECH",
+ "MOVE_SANDSTORM"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 27,
+ "species": "SPECIES_LUXIO",
+ "moves": [
+ "MOVE_SPARK",
+ "MOVE_BITE",
+ "MOVE_LEER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 67,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 27,
+ "species": "SPECIES_PONYTA",
+ "moves": [
+ "MOVE_FIRE_SPIN",
+ "MOVE_STOMP",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 27,
+ "species": "SPECIES_GROTLE",
+ "moves": [
+ "MOVE_MEGA_DRAIN",
+ "MOVE_BITE",
+ "MOVE_CURSE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 68,
+ "type": 1,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 26,
+ "species": "SPECIES_BUIZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_SONIC_BOOM",
+ "MOVE_PURSUIT",
+ "MOVE_QUICK_ATTACK"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 26,
+ "species": "SPECIES_GIRAFARIG",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_STOMP",
+ "MOVE_AGILITY",
+ "MOVE_BATON_PASS"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 26,
+ "species": "SPECIES_MACHOKE",
+ "moves": [
+ "MOVE_KARATE_CHOP",
+ "MOVE_LOW_KICK",
+ "MOVE_LEER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 69,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 29,
+ "species": "SPECIES_MACHOKE"
+ }
+ ]
+ },
+ {
+ "index": 70,
+ "type": 0,
+ "class": 28,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 25,
+ "species": "SPECIES_SKORUPI"
+ },
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 25,
+ "species": "SPECIES_GOLBAT"
+ }
+ ]
+ },
+ {
+ "index": 71,
+ "type": 0,
+ "class": 28,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 25,
+ "species": "SPECIES_CROAGUNK"
+ },
+ {
+ "difficulty": 0,
+ "level": 25,
+ "species": "SPECIES_GOLBAT"
+ }
+ ]
+ },
+ {
+ "index": 72,
+ "type": 0,
+ "class": 28,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 27,
+ "species": "SPECIES_DUSTOX"
+ }
+ ]
+ },
+ {
+ "index": 73,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 39,
+ "species": "SPECIES_GIBLE"
+ }
+ ]
+ },
+ {
+ "index": 74,
+ "type": 0,
+ "class": 30,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 27,
+ "species": "SPECIES_HOOTHOOT"
+ },
+ {
+ "difficulty": 50,
+ "level": 27,
+ "species": "SPECIES_NOCTOWL"
+ }
+ ]
+ },
+ {
+ "index": 75,
+ "type": 0,
+ "class": 31,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 27,
+ "species": "SPECIES_GYARADOS"
+ },
+ {
+ "difficulty": 50,
+ "level": 27,
+ "species": "SPECIES_RAICHU"
+ }
+ ]
+ },
+ {
+ "index": 76,
+ "type": 0,
+ "class": 30,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 19,
+ "species": "SPECIES_HOOTHOOT"
+ }
+ ]
+ },
+ {
+ "index": 77,
+ "type": 0,
+ "class": 10,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 78,
+ "type": 0,
+ "class": 28,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 13,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 14,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_ZUBAT"
+ }
+ ]
+ },
+ {
+ "index": 79,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 28,
+ "species": "SPECIES_CROAGUNK"
+ },
+ {
+ "difficulty": 30,
+ "level": 27,
+ "species": "SPECIES_MEDITITE"
+ },
+ {
+ "difficulty": 30,
+ "level": 29,
+ "species": "SPECIES_MACHOKE"
+ }
+ ]
+ },
+ {
+ "index": 80,
+ "type": 0,
+ "class": 28,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 27,
+ "species": "SPECIES_SKORUPI"
+ },
+ {
+ "difficulty": 0,
+ "level": 27,
+ "species": "SPECIES_GOLBAT"
+ }
+ ]
+ },
+ {
+ "index": 81,
+ "type": 0,
+ "class": 30,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 31,
+ "species": "SPECIES_NOCTOWL"
+ }
+ ]
+ },
+ {
+ "index": 82,
+ "type": 0,
+ "class": 32,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_LUXIO"
+ }
+ ]
+ },
+ {
+ "index": 83,
+ "type": 0,
+ "class": 33,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_BUNEARY"
+ }
+ ]
+ },
+ {
+ "index": 84,
+ "type": 0,
+ "class": 34,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_CHATOT"
+ }
+ ]
+ },
+ {
+ "index": 85,
+ "type": 0,
+ "class": 35,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_ROSELIA"
+ }
+ ]
+ },
+ {
+ "index": 86,
+ "type": 0,
+ "class": 36,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 87,
+ "type": 0,
+ "class": 37,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 88,
+ "type": 0,
+ "class": 38,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_HOOTHOOT"
+ },
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_MACHOP"
+ }
+ ]
+ },
+ {
+ "index": 89,
+ "type": 0,
+ "class": 38,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_HOOTHOOT"
+ },
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_MACHOP"
+ }
+ ]
+ },
+ {
+ "index": 90,
+ "type": 0,
+ "class": 38,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_HOOTHOOT"
+ },
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_MEDITITE"
+ }
+ ]
+ },
+ {
+ "index": 91,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 92,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_GOLDEEN"
+ },
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_BARBOACH"
+ }
+ ]
+ },
+ {
+ "index": 93,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_BARBOACH"
+ },
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_BARBOACH"
+ },
+ {
+ "difficulty": 0,
+ "level": 20,
+ "species": "SPECIES_SHELLOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_BARBOACH"
+ }
+ ]
+ },
+ {
+ "index": 94,
+ "type": 0,
+ "class": 39,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 21,
+ "species": "SPECIES_LUXIO"
+ },
+ {
+ "difficulty": 50,
+ "level": 21,
+ "species": "SPECIES_BUIZEL"
+ }
+ ]
+ },
+ {
+ "index": 95,
+ "type": 0,
+ "class": 39,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 21,
+ "species": "SPECIES_PRINPLUP"
+ },
+ {
+ "difficulty": 50,
+ "level": 21,
+ "species": "SPECIES_PRINPLUP"
+ }
+ ]
+ },
+ {
+ "index": 96,
+ "type": 0,
+ "class": 40,
+ "unk2": 0,
+ "items": [],
+ "unkC": 0,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 21,
+ "species": "SPECIES_AIPOM"
+ },
+ {
+ "difficulty": 50,
+ "level": 21,
+ "species": "SPECIES_MARILL"
+ }
+ ]
+ },
+ {
+ "index": 97,
+ "type": 0,
+ "class": 40,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 98,
+ "type": 0,
+ "class": 41,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 99,
+ "type": 1,
+ "class": 41,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_CONFUSION",
+ "MOVE_DISABLE",
+ "MOVE_KINESIS",
+ "MOVE_ICE_PUNCH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 100,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 101,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 102,
+ "type": 0,
+ "class": 38,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_HOOTHOOT"
+ },
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_MEDITITE"
+ }
+ ]
+ },
+ {
+ "index": 103,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 30,
+ "species": "SPECIES_GYARADOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_GYARADOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 104,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 30,
+ "species": "SPECIES_GOLDUCK"
+ },
+ {
+ "difficulty": 0,
+ "level": 32,
+ "species": "SPECIES_GOLDUCK"
+ }
+ ]
+ },
+ {
+ "index": 105,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_MARILL"
+ },
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_AZUMARILL"
+ }
+ ]
+ },
+ {
+ "index": 106,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 32,
+ "species": "SPECIES_MARILL"
+ },
+ {
+ "difficulty": 0,
+ "level": 30,
+ "species": "SPECIES_PELIPPER"
+ }
+ ]
+ },
+ {
+ "index": 107,
+ "type": 0,
+ "class": 44,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_SHELLOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_SHELLOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 20,
+ "species": "SPECIES_SHELLOS"
+ }
+ ]
+ },
+ {
+ "index": 108,
+ "type": 1,
+ "class": 45,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_BIBAREL",
+ "moves": [
+ "MOVE_SURF",
+ "MOVE_HYPER_FANG",
+ "MOVE_HEADBUTT",
+ "MOVE_DEFENSE_CURL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 109,
+ "type": 0,
+ "class": 10,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 110,
+ "type": 0,
+ "class": 46,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_GYARADOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_MACHOP"
+ }
+ ]
+ },
+ {
+ "index": 111,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_MAGIKARP"
+ },
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_REMORAID"
+ },
+ {
+ "difficulty": 0,
+ "level": 22,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 112,
+ "type": 0,
+ "class": 47,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ },
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 113,
+ "type": 0,
+ "class": 48,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 24,
+ "species": "SPECIES_CRANIDOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 22,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_BRONZOR"
+ }
+ ]
+ },
+ {
+ "index": 114,
+ "type": 0,
+ "class": 48,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 26,
+ "species": "SPECIES_SHIELDON"
+ }
+ ]
+ },
+ {
+ "index": 115,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 116,
+ "type": 0,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 117,
+ "type": 0,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 118,
+ "type": 0,
+ "class": 5,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 119,
+ "type": 0,
+ "class": 49,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_HAUNTER"
+ },
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_KADABRA"
+ }
+ ]
+ },
+ {
+ "index": 120,
+ "type": 0,
+ "class": 50,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 22,
+ "species": "SPECIES_GASTLY"
+ },
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_MISDREAVUS"
+ },
+ {
+ "difficulty": 0,
+ "level": 24,
+ "species": "SPECIES_KADABRA"
+ }
+ ]
+ },
+ {
+ "index": 121,
+ "type": 1,
+ "class": 51,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 23,
+ "species": "SPECIES_GOLDEEN",
+ "moves": [
+ "MOVE_HORN_DRILL",
+ "MOVE_FLAIL"
+ ]
+ },
+ {
+ "difficulty": 30,
+ "level": 23,
+ "species": "SPECIES_GOLDEEN",
+ "moves": [
+ "MOVE_HORN_DRILL",
+ "MOVE_FLAIL"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 23,
+ "species": "SPECIES_GOLDEEN",
+ "moves": [
+ "MOVE_HORN_DRILL",
+ "MOVE_FLAIL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 122,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 123,
+ "type": 0,
+ "class": 51,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 124,
+ "type": 0,
+ "class": 36,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 125,
+ "type": 0,
+ "class": 36,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 126,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 127,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 23,
+ "species": "SPECIES_MEDITITE"
+ },
+ {
+ "difficulty": 30,
+ "level": 22,
+ "species": "SPECIES_MACHOP"
+ },
+ {
+ "difficulty": 30,
+ "level": 21,
+ "species": "SPECIES_MEDITITE"
+ }
+ ]
+ },
+ {
+ "index": 128,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 25,
+ "species": "SPECIES_CROAGUNK"
+ }
+ ]
+ },
+ {
+ "index": 129,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 21,
+ "species": "SPECIES_CROAGUNK"
+ },
+ {
+ "difficulty": 30,
+ "level": 23,
+ "species": "SPECIES_MEDITITE"
+ },
+ {
+ "difficulty": 30,
+ "level": 22,
+ "species": "SPECIES_MACHOP"
+ }
+ ]
+ },
+ {
+ "index": 130,
+ "type": 0,
+ "class": 19,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_STARAVIA"
+ }
+ ]
+ },
+ {
+ "index": 131,
+ "type": 0,
+ "class": 30,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 132,
+ "type": 1,
+ "class": 53,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 35,
+ "species": "SPECIES_AMBIPOM",
+ "moves": [
+ "MOVE_DOUBLE_HIT",
+ "MOVE_U_TURN",
+ "MOVE_SAND_ATTACK",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 35,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_DISABLE",
+ "MOVE_REFLECT",
+ "MOVE_RECOVER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 133,
+ "type": 1,
+ "class": 53,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 33,
+ "species": "SPECIES_MR_MIME",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_MIMIC",
+ "MOVE_REFLECT",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 34,
+ "species": "SPECIES_MACHOKE",
+ "moves": [
+ "MOVE_SUBMISSION",
+ "MOVE_LOW_KICK",
+ "MOVE_LEER",
+ "MOVE_ROCK_TOMB"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 35,
+ "species": "SPECIES_SNEASEL",
+ "moves": [
+ "MOVE_SLASH",
+ "MOVE_ICY_WIND",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_SCREECH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 134,
+ "type": 1,
+ "class": 54,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 37,
+ "species": "SPECIES_LOPUNNY",
+ "moves": [
+ "MOVE_DIZZY_PUNCH",
+ "MOVE_JUMP_KICK",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_MIRROR_COAT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 135,
+ "type": 1,
+ "class": 54,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 34,
+ "species": "SPECIES_GOLDUCK",
+ "moves": [
+ "MOVE_WATER_PULSE",
+ "MOVE_CONFUSION",
+ "MOVE_DISABLE",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 35,
+ "species": "SPECIES_PONYTA",
+ "moves": [
+ "MOVE_FIRE_SPIN",
+ "MOVE_TAKE_DOWN",
+ "MOVE_TAIL_WHIP",
+ "MOVE_WILL_O_WISP"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 33,
+ "species": "SPECIES_SUDOWOODO",
+ "moves": [
+ "MOVE_ROCK_SLIDE",
+ "MOVE_LOW_KICK",
+ "MOVE_FLAIL",
+ "MOVE_ENDURE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 136,
+ "type": 0,
+ "class": 55,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 35,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 35,
+ "species": "SPECIES_GRAVELER"
+ },
+ {
+ "difficulty": 0,
+ "level": 35,
+ "species": "SPECIES_SNOVER"
+ }
+ ]
+ },
+ {
+ "index": 137,
+ "type": 0,
+ "class": 55,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 35,
+ "species": "SPECIES_SNEASEL"
+ }
+ ]
+ },
+ {
+ "index": 138,
+ "type": 0,
+ "class": 56,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 36,
+ "species": "SPECIES_ROSELIA"
+ },
+ {
+ "difficulty": 0,
+ "level": 36,
+ "species": "SPECIES_SNOVER"
+ }
+ ]
+ },
+ {
+ "index": 139,
+ "type": 0,
+ "class": 56,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_STARAVIA"
+ }
+ ]
+ },
+ {
+ "index": 140,
+ "type": 1,
+ "class": 53,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 34,
+ "species": "SPECIES_RAICHU",
+ "moves": [
+ "MOVE_THUNDERBOLT",
+ "MOVE_SLAM",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_THUNDER_WAVE"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 36,
+ "species": "SPECIES_PELIPPER",
+ "moves": [
+ "MOVE_AERIAL_ACE",
+ "MOVE_WATER_PULSE",
+ "MOVE_SUPERSONIC",
+ "MOVE_ROOST"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 38,
+ "species": "SPECIES_HIPPOPOTAS",
+ "moves": [
+ "MOVE_EARTHQUAKE",
+ "MOVE_CRUNCH",
+ "MOVE_SAND_TOMB",
+ "MOVE_YAWN"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 141,
+ "type": 1,
+ "class": 54,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 37,
+ "species": "SPECIES_ROSELIA",
+ "moves": [
+ "MOVE_MEGA_DRAIN",
+ "MOVE_TOXIC_SPIKES",
+ "MOVE_INGRAIN",
+ "MOVE_GRASS_WHISTLE"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 37,
+ "species": "SPECIES_SEAKING",
+ "moves": [
+ "MOVE_WATER_PULSE",
+ "MOVE_POISON_JAB",
+ "MOVE_PECK",
+ "MOVE_AQUA_RING"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 142,
+ "type": 0,
+ "class": 55,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 34,
+ "species": "SPECIES_SNOVER"
+ },
+ {
+ "difficulty": 0,
+ "level": 33,
+ "species": "SPECIES_SNOVER"
+ },
+ {
+ "difficulty": 0,
+ "level": 34,
+ "species": "SPECIES_GOLDUCK"
+ },
+ {
+ "difficulty": 0,
+ "level": 35,
+ "species": "SPECIES_SNOVER"
+ }
+ ]
+ },
+ {
+ "index": 143,
+ "type": 0,
+ "class": 55,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 36,
+ "species": "SPECIES_MANTYKE"
+ },
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_SNEASEL"
+ }
+ ]
+ },
+ {
+ "index": 144,
+ "type": 0,
+ "class": 56,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 35,
+ "species": "SPECIES_MARILL"
+ },
+ {
+ "difficulty": 0,
+ "level": 35,
+ "species": "SPECIES_CLEFAIRY"
+ }
+ ]
+ },
+ {
+ "index": 145,
+ "type": 0,
+ "class": 56,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 37,
+ "species": "SPECIES_SNOVER"
+ }
+ ]
+ },
+ {
+ "index": 146,
+ "type": 0,
+ "class": 28,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 33,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 33,
+ "species": "SPECIES_GOLBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 34,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 36,
+ "species": "SPECIES_CROAGUNK"
+ }
+ ]
+ },
+ {
+ "index": 147,
+ "type": 0,
+ "class": 28,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 35,
+ "species": "SPECIES_SKORUPI"
+ },
+ {
+ "difficulty": 0,
+ "level": 35,
+ "species": "SPECIES_GOLBAT"
+ }
+ ]
+ },
+ {
+ "index": 148,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 36,
+ "species": "SPECIES_CROAGUNK"
+ },
+ {
+ "difficulty": 30,
+ "level": 35,
+ "species": "SPECIES_ONIX"
+ },
+ {
+ "difficulty": 30,
+ "level": 37,
+ "species": "SPECIES_MACHOKE"
+ }
+ ]
+ },
+ {
+ "index": 149,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 150,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 151,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 152,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 153,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_GYARADOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 154,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 26,
+ "species": "SPECIES_MAGIKARP"
+ },
+ {
+ "difficulty": 0,
+ "level": 26,
+ "species": "SPECIES_MAGIKARP"
+ },
+ {
+ "difficulty": 0,
+ "level": 26,
+ "species": "SPECIES_MAGIKARP"
+ },
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_GYARADOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 26,
+ "species": "SPECIES_MAGIKARP"
+ }
+ ]
+ },
+ {
+ "index": 155,
+ "type": 0,
+ "class": 47,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ },
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 156,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 157,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 158,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 159,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 26,
+ "species": "SPECIES_MANTYKE"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_REMORAID"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_TENTACOOL"
+ }
+ ]
+ },
+ {
+ "index": 160,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 161,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_PELIPPER"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_WHISCASH"
+ }
+ ]
+ },
+ {
+ "index": 162,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_GOLDEEN"
+ },
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_GOLDEEN"
+ },
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_GOLDEEN"
+ },
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_GOLDEEN"
+ }
+ ]
+ },
+ {
+ "index": 163,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_REMORAID"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_PSYDUCK"
+ }
+ ]
+ },
+ {
+ "index": 164,
+ "type": 1,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_BUIZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_SONIC_BOOM",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_ATTRACT"
+ ]
+ },
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_MEDICHAM",
+ "moves": [
+ "MOVE_CONFUSION",
+ "MOVE_BRICK_BREAK",
+ "MOVE_MEDITATE",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ },
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_SEAKING",
+ "moves": [
+ "MOVE_WATER_PULSE",
+ "MOVE_HORN_ATTACK",
+ "MOVE_AQUA_RING",
+ "MOVE_CAPTIVATE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 165,
+ "type": 0,
+ "class": 47,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ },
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 166,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 30,
+ "species": "SPECIES_SHELLOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 32,
+ "species": "SPECIES_GASTRODON"
+ }
+ ]
+ },
+ {
+ "index": 167,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 33,
+ "species": "SPECIES_GOLDUCK"
+ }
+ ]
+ },
+ {
+ "index": 168,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_MAGIKARP"
+ },
+ {
+ "difficulty": 0,
+ "level": 30,
+ "species": "SPECIES_FINNEON"
+ },
+ {
+ "difficulty": 0,
+ "level": 32,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 169,
+ "type": 0,
+ "class": 48,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 170,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 33,
+ "species": "SPECIES_STARAVIA",
+ "moves": [
+ "MOVE_TAKE_DOWN",
+ "MOVE_AERIAL_ACE",
+ "MOVE_ENDEAVOR",
+ "MOVE_QUICK_ATTACK"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 33,
+ "species": "SPECIES_GIRAFARIG",
+ "moves": [
+ "MOVE_DOUBLE_HIT",
+ "MOVE_PSYBEAM",
+ "MOVE_GROWL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 171,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 30,
+ "species": "SPECIES_CHERRIM",
+ "moves": [
+ "MOVE_PETAL_DANCE",
+ "MOVE_MAGICAL_LEAF",
+ "MOVE_LEECH_SEED"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 32,
+ "species": "SPECIES_MARILL",
+ "moves": [
+ "MOVE_DOUBLE_EDGE",
+ "MOVE_BUBBLE_BEAM",
+ "MOVE_AQUA_RING"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 34,
+ "species": "SPECIES_LOPUNNY",
+ "moves": [
+ "MOVE_JUMP_KICK",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_DEFENSE_CURL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 172,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 39,
+ "species": "SPECIES_MAGIKARP"
+ },
+ {
+ "difficulty": 0,
+ "level": 42,
+ "species": "SPECIES_FINNEON"
+ },
+ {
+ "difficulty": 0,
+ "level": 39,
+ "species": "SPECIES_FEEBAS"
+ }
+ ]
+ },
+ {
+ "index": 173,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_MAGIKARP"
+ },
+ {
+ "difficulty": 0,
+ "level": 42,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 174,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_MAGIKARP"
+ },
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_FINNEON"
+ },
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_REMORAID"
+ },
+ {
+ "difficulty": 0,
+ "level": 42,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 175,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 41,
+ "species": "SPECIES_GYARADOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_REMORAID"
+ },
+ {
+ "difficulty": 0,
+ "level": 41,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 176,
+ "type": 0,
+ "class": 57,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 177,
+ "type": 0,
+ "class": 57,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 178,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 179,
+ "type": 0,
+ "class": 58,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 180,
+ "type": 0,
+ "class": 46,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 37,
+ "species": "SPECIES_FEEBAS"
+ },
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_MACHOKE"
+ },
+ {
+ "difficulty": 0,
+ "level": 43,
+ "species": "SPECIES_GASTRODON"
+ }
+ ]
+ },
+ {
+ "index": 181,
+ "type": 0,
+ "class": 15,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 182,
+ "type": 0,
+ "class": 23,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ },
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 183,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 41,
+ "species": "SPECIES_BUIZEL"
+ },
+ {
+ "difficulty": 0,
+ "level": 41,
+ "species": "SPECIES_TENTACRUEL"
+ }
+ ]
+ },
+ {
+ "index": 184,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 43,
+ "species": "SPECIES_TENTACRUEL"
+ }
+ ]
+ },
+ {
+ "index": 185,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_TENTACOOL"
+ },
+ {
+ "difficulty": 0,
+ "level": 42,
+ "species": "SPECIES_GOLDUCK"
+ }
+ ]
+ },
+ {
+ "index": 186,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 37,
+ "species": "SPECIES_WINGULL"
+ },
+ {
+ "difficulty": 0,
+ "level": 42,
+ "species": "SPECIES_QUAGSIRE"
+ },
+ {
+ "difficulty": 0,
+ "level": 41,
+ "species": "SPECIES_PELIPPER"
+ }
+ ]
+ },
+ {
+ "index": 187,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 43,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 188,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_MANTYKE"
+ },
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_REMORAID"
+ },
+ {
+ "difficulty": 0,
+ "level": 42,
+ "species": "SPECIES_MANTINE"
+ }
+ ]
+ },
+ {
+ "index": 189,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 43,
+ "species": "SPECIES_LUMINEON"
+ }
+ ]
+ },
+ {
+ "index": 190,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 41,
+ "species": "SPECIES_AZURILL"
+ },
+ {
+ "difficulty": 0,
+ "level": 41,
+ "species": "SPECIES_AZUMARILL"
+ }
+ ]
+ },
+ {
+ "index": 191,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 39,
+ "species": "SPECIES_MARILL"
+ },
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_WINGULL"
+ },
+ {
+ "difficulty": 0,
+ "level": 41,
+ "species": "SPECIES_GOLDUCK"
+ }
+ ]
+ },
+ {
+ "index": 192,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 41,
+ "species": "SPECIES_WINGULL"
+ },
+ {
+ "difficulty": 0,
+ "level": 41,
+ "species": "SPECIES_SEAKING"
+ }
+ ]
+ },
+ {
+ "index": 193,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 41,
+ "species": "SPECIES_FINNEON"
+ },
+ {
+ "difficulty": 0,
+ "level": 41,
+ "species": "SPECIES_PELIPPER"
+ }
+ ]
+ },
+ {
+ "index": 194,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 43,
+ "species": "SPECIES_GOLDUCK"
+ }
+ ]
+ },
+ {
+ "index": 195,
+ "type": 1,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 7,
+ "species": "SPECIES_GEODUDE",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_DEFENSE_CURL",
+ "MOVE_MUD_SPORT"
+ ]
+ },
+ {
+ "difficulty": 0,
+ "level": 7,
+ "species": "SPECIES_ONIX",
+ "moves": [
+ "MOVE_ROCK_THROW",
+ "MOVE_TACKLE",
+ "MOVE_HARDEN"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 196,
+ "type": 1,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 9,
+ "species": "SPECIES_MACHOP",
+ "moves": [
+ "MOVE_ROCK_SMASH",
+ "MOVE_FOCUS_ENERGY"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 197,
+ "type": 0,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 198,
+ "type": 0,
+ "class": 41,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 199,
+ "type": 0,
+ "class": 41,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 200,
+ "type": 0,
+ "class": 41,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 201,
+ "type": 0,
+ "class": 6,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 9,
+ "species": "SPECIES_WURMPLE"
+ },
+ {
+ "difficulty": 0,
+ "level": 11,
+ "species": "SPECIES_SILCOON"
+ },
+ {
+ "difficulty": 0,
+ "level": 13,
+ "species": "SPECIES_BEAUTIFLY"
+ }
+ ]
+ },
+ {
+ "index": 202,
+ "type": 0,
+ "class": 6,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 9,
+ "species": "SPECIES_WURMPLE"
+ },
+ {
+ "difficulty": 0,
+ "level": 11,
+ "species": "SPECIES_CASCOON"
+ },
+ {
+ "difficulty": 0,
+ "level": 13,
+ "species": "SPECIES_DUSTOX"
+ }
+ ]
+ },
+ {
+ "index": 203,
+ "type": 0,
+ "class": 6,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 12,
+ "species": "SPECIES_BURMY"
+ },
+ {
+ "difficulty": 0,
+ "level": 12,
+ "species": "SPECIES_KRICKETUNE"
+ }
+ ]
+ },
+ {
+ "index": 204,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 14,
+ "species": "SPECIES_PACHIRISU"
+ }
+ ]
+ },
+ {
+ "index": 205,
+ "type": 1,
+ "class": 49,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_ABRA",
+ "moves": [
+ "MOVE_HIDDEN_POWER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 206,
+ "type": 1,
+ "class": 50,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_ABRA",
+ "moves": [
+ "MOVE_HIDDEN_POWER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 207,
+ "type": 0,
+ "class": 23,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ },
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 208,
+ "type": 0,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 209,
+ "type": 0,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 210,
+ "type": 0,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 211,
+ "type": 0,
+ "class": 53,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 212,
+ "type": 0,
+ "class": 53,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 213,
+ "type": 0,
+ "class": 54,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 214,
+ "type": 0,
+ "class": 54,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 215,
+ "type": 0,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 216,
+ "type": 0,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 217,
+ "type": 0,
+ "class": 49,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 218,
+ "type": 0,
+ "class": 50,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 219,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 220,
+ "type": 0,
+ "class": 46,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 221,
+ "type": 0,
+ "class": 60,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 222,
+ "type": 0,
+ "class": 61,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 223,
+ "type": 0,
+ "class": 23,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ },
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 224,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 45,
+ "species": "SPECIES_RAPIDASH",
+ "moves": [
+ "MOVE_FIRE_BLAST",
+ "MOVE_STOMP",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 45,
+ "species": "SPECIES_CARNIVINE",
+ "moves": [
+ "MOVE_WRING_OUT",
+ "MOVE_CRUNCH",
+ "MOVE_FEINT_ATTACK",
+ "MOVE_INGRAIN"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 48,
+ "species": "SPECIES_RAMPARDOS",
+ "moves": [
+ "MOVE_HEAD_SMASH",
+ "MOVE_ZEN_HEADBUTT",
+ "MOVE_ANCIENT_POWER",
+ "MOVE_SCREECH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 225,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 49,
+ "species": "SPECIES_HONCHKROW",
+ "moves": [
+ "MOVE_NIGHT_SLASH",
+ "MOVE_WING_ATTACK",
+ "MOVE_PURSUIT",
+ "MOVE_SWAGGER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 226,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 46,
+ "species": "SPECIES_GOLDUCK",
+ "moves": [
+ "MOVE_ZEN_HEADBUTT",
+ "MOVE_CONFUSION",
+ "MOVE_DISABLE",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 48,
+ "species": "SPECIES_BLISSEY",
+ "moves": [
+ "MOVE_DOUBLE_EDGE",
+ "MOVE_SING",
+ "MOVE_SOFT_BOILED",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 227,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 46,
+ "species": "SPECIES_CLEFABLE",
+ "moves": [
+ "MOVE_METEOR_MASH",
+ "MOVE_REFLECT",
+ "MOVE_LIGHT_SCREEN",
+ "MOVE_GRAVITY"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 48,
+ "species": "SPECIES_TORTERRA",
+ "moves": [
+ "MOVE_EARTHQUAKE",
+ "MOVE_CRUNCH",
+ "MOVE_LEECH_SEED",
+ "MOVE_SYNTHESIS"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 228,
+ "type": 1,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 45,
+ "species": "SPECIES_TENTACRUEL",
+ "moves": [
+ "MOVE_SLUDGE_BOMB",
+ "MOVE_WATER_PULSE",
+ "MOVE_TOXIC_SPIKES",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 45,
+ "species": "SPECIES_GOLEM",
+ "moves": [
+ "MOVE_EARTHQUAKE",
+ "MOVE_STONE_EDGE",
+ "MOVE_DOUBLE_EDGE",
+ "MOVE_ROCK_POLISH"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 48,
+ "species": "SPECIES_EMPOLEON",
+ "moves": [
+ "MOVE_BRINE",
+ "MOVE_DRILL_PECK",
+ "MOVE_METAL_CLAW",
+ "MOVE_GROWL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 229,
+ "type": 1,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 47,
+ "species": "SPECIES_STARAPTOR",
+ "moves": [
+ "MOVE_BRAVE_BIRD",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_DOUBLE_TEAM",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 47,
+ "species": "SPECIES_HIPPOWDON",
+ "moves": [
+ "MOVE_EARTHQUAKE",
+ "MOVE_CRUNCH",
+ "MOVE_SAND_TOMB",
+ "MOVE_YAWN"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 230,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 49,
+ "species": "SPECIES_GABITE"
+ }
+ ]
+ },
+ {
+ "index": 231,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 46,
+ "species": "SPECIES_GIBLE"
+ },
+ {
+ "difficulty": 50,
+ "level": 49,
+ "species": "SPECIES_GYARADOS"
+ },
+ {
+ "difficulty": 50,
+ "level": 46,
+ "species": "SPECIES_GIBLE"
+ }
+ ]
+ },
+ {
+ "index": 232,
+ "type": 1,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 40,
+ "level": 30,
+ "species": "SPECIES_ONIX",
+ "moves": [
+ "MOVE_IRON_TAIL",
+ "MOVE_ROCK_THROW",
+ "MOVE_SANDSTORM",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 40,
+ "level": 32,
+ "species": "SPECIES_STEELIX",
+ "moves": [
+ "MOVE_SLAM",
+ "MOVE_ROCK_SLIDE",
+ "MOVE_SANDSTORM",
+ "MOVE_SCREECH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 233,
+ "type": 0,
+ "class": 30,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 46,
+ "species": "SPECIES_NOCTOWL"
+ },
+ {
+ "difficulty": 0,
+ "level": 48,
+ "species": "SPECIES_STARAPTOR"
+ }
+ ]
+ },
+ {
+ "index": 234,
+ "type": 0,
+ "class": 49,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 43,
+ "species": "SPECIES_HAUNTER"
+ },
+ {
+ "difficulty": 0,
+ "level": 46,
+ "species": "SPECIES_ALAKAZAM"
+ },
+ {
+ "difficulty": 0,
+ "level": 46,
+ "species": "SPECIES_GENGAR"
+ }
+ ]
+ },
+ {
+ "index": 235,
+ "type": 0,
+ "class": 50,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 44,
+ "species": "SPECIES_CHINGLING"
+ },
+ {
+ "difficulty": 0,
+ "level": 48,
+ "species": "SPECIES_CHIMECHO"
+ }
+ ]
+ },
+ {
+ "index": 236,
+ "type": 0,
+ "class": 31,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 47,
+ "species": "SPECIES_GYARADOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 47,
+ "species": "SPECIES_MEDICHAM"
+ }
+ ]
+ },
+ {
+ "index": 237,
+ "type": 0,
+ "class": 31,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 47,
+ "species": "SPECIES_STARAPTOR"
+ },
+ {
+ "difficulty": 0,
+ "level": 47,
+ "species": "SPECIES_WHISCASH"
+ }
+ ]
+ },
+ {
+ "index": 238,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 239,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 240,
+ "type": 1,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 33,
+ "species": "SPECIES_RIOLU",
+ "moves": [
+ "MOVE_FORCE_PALM",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_COUNTER",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 34,
+ "species": "SPECIES_STARAPTOR",
+ "moves": [
+ "MOVE_AERIAL_ACE",
+ "MOVE_TAKE_DOWN",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 35,
+ "species": "SPECIES_GRAVELER",
+ "moves": [
+ "MOVE_EARTHQUAKE",
+ "MOVE_ROCK_SLIDE",
+ "MOVE_ROCK_POLISH",
+ "MOVE_DEFENSE_CURL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 241,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 242,
+ "type": 0,
+ "class": 46,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 243,
+ "type": 0,
+ "class": 36,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 244,
+ "type": 1,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 10,
+ "species": "SPECIES_GEODUDE",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_DEFENSE_CURL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 245,
+ "type": 1,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 8,
+ "species": "SPECIES_GEODUDE",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_DEFENSE_CURL"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 8,
+ "species": "SPECIES_ONIX",
+ "moves": [
+ "MOVE_ROCK_THROW",
+ "MOVE_TACKLE",
+ "MOVE_HARDEN"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 246,
+ "type": 1,
+ "class": 62,
+ "unk2": 0,
+ "items": [
+ "ITEM_POTION",
+ "ITEM_POTION"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 12,
+ "species": "SPECIES_GEODUDE",
+ "moves": [
+ "MOVE_STEALTH_ROCK",
+ "MOVE_ROCK_THROW"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 12,
+ "species": "SPECIES_ONIX",
+ "moves": [
+ "MOVE_STEALTH_ROCK",
+ "MOVE_ROCK_THROW",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 14,
+ "species": "SPECIES_CRANIDOS",
+ "moves": [
+ "MOVE_HEADBUTT",
+ "MOVE_PURSUIT",
+ "MOVE_LEER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 247,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 7,
+ "species": "SPECIES_STARLY",
+ "moves": [
+ "MOVE_QUICK_ATTACK",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 30,
+ "level": 9,
+ "species": "SPECIES_TURTWIG",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_WITHDRAW"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 248,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 7,
+ "species": "SPECIES_STARLY",
+ "moves": [
+ "MOVE_QUICK_ATTACK",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 30,
+ "level": 9,
+ "species": "SPECIES_CHIMCHAR",
+ "moves": [
+ "MOVE_SCRATCH",
+ "MOVE_LEER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 249,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 7,
+ "species": "SPECIES_STARLY",
+ "moves": [
+ "MOVE_QUICK_ATTACK",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 30,
+ "level": 9,
+ "species": "SPECIES_PIPLUP",
+ "moves": [
+ "MOVE_POUND",
+ "MOVE_GROWL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 250,
+ "type": 3,
+ "class": 64,
+ "unk2": 0,
+ "items": [
+ "ITEM_HYPER_POTION",
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 150,
+ "level": 36,
+ "species": "SPECIES_BRONZOR",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_FLASH_CANNON",
+ "MOVE_EXTRASENSORY",
+ "MOVE_CONFUSE_RAY",
+ "MOVE_HYPNOSIS"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 36,
+ "species": "SPECIES_STEELIX",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_GYRO_BALL",
+ "MOVE_ICE_FANG",
+ "MOVE_DRAGON_BREATH",
+ "MOVE_SANDSTORM"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 39,
+ "species": "SPECIES_BASTIODON",
+ "item": "ITEM_CHESTO_BERRY",
+ "moves": [
+ "MOVE_FLASH_CANNON",
+ "MOVE_ANCIENT_POWER",
+ "MOVE_IRON_DEFENSE",
+ "MOVE_REST"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 251,
+ "type": 0,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 252,
+ "type": 0,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 253,
+ "type": 0,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 254,
+ "type": 0,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 255,
+ "type": 0,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 256,
+ "type": 1,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 28,
+ "species": "SPECIES_ONIX",
+ "moves": [
+ "MOVE_IRON_TAIL",
+ "MOVE_SLAM",
+ "MOVE_DIG"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 28,
+ "species": "SPECIES_ONIX",
+ "moves": [
+ "MOVE_IRON_TAIL",
+ "MOVE_SLAM",
+ "MOVE_DIG"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 28,
+ "species": "SPECIES_ONIX",
+ "moves": [
+ "MOVE_IRON_TAIL",
+ "MOVE_SLAM",
+ "MOVE_DIG"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 257,
+ "type": 1,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 31,
+ "species": "SPECIES_ONIX",
+ "moves": [
+ "MOVE_IRON_TAIL",
+ "MOVE_SLAM",
+ "MOVE_DIG"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 258,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 40,
+ "species": "SPECIES_MACHOKE"
+ }
+ ]
+ },
+ {
+ "index": 259,
+ "type": 1,
+ "class": 7,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 14,
+ "species": "SPECIES_BUDEW",
+ "moves": [
+ "MOVE_ABSORB",
+ "MOVE_STUN_SPORE",
+ "MOVE_WATER_SPORT"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 13,
+ "species": "SPECIES_BUDEW",
+ "moves": [
+ "MOVE_ABSORB",
+ "MOVE_STUN_SPORE",
+ "MOVE_WATER_SPORT"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 15,
+ "species": "SPECIES_BUDEW",
+ "moves": [
+ "MOVE_ABSORB",
+ "MOVE_STUN_SPORE",
+ "MOVE_WATER_SPORT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 260,
+ "type": 1,
+ "class": 7,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 17,
+ "species": "SPECIES_TURTWIG",
+ "moves": [
+ "MOVE_RAZOR_LEAF",
+ "MOVE_TACKLE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 261,
+ "type": 3,
+ "class": 65,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE",
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 250,
+ "level": 53,
+ "species": "SPECIES_DUSTOX",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_TOXIC",
+ "MOVE_BUG_BUZZ",
+ "MOVE_DOUBLE_TEAM",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 53,
+ "species": "SPECIES_BEAUTIFLY",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_ENERGY_BALL",
+ "MOVE_BUG_BUZZ",
+ "MOVE_PSYCHIC",
+ "MOVE_SHADOW_BALL"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 54,
+ "species": "SPECIES_VESPIQUEN",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_ATTACK_ORDER",
+ "MOVE_DEFEND_ORDER",
+ "MOVE_HEAL_ORDER",
+ "MOVE_POWER_GEM"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 54,
+ "species": "SPECIES_HERACROSS",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_MEGAHORN",
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_STONE_EDGE"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 57,
+ "species": "SPECIES_DRAPION",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_X_SCISSOR",
+ "MOVE_CROSS_POISON",
+ "MOVE_ICE_FANG",
+ "MOVE_AERIAL_ACE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 262,
+ "type": 3,
+ "class": 66,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE",
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 250,
+ "level": 55,
+ "species": "SPECIES_QUAGSIRE",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_DIG",
+ "MOVE_DOUBLE_TEAM",
+ "MOVE_PROTECT",
+ "MOVE_SANDSTORM"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 56,
+ "species": "SPECIES_SUDOWOODO",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_EARTHQUAKE",
+ "MOVE_SUCKER_PUNCH",
+ "MOVE_HAMMER_ARM",
+ "MOVE_SANDSTORM"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 56,
+ "species": "SPECIES_GOLEM",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_EARTHQUAKE",
+ "MOVE_GYRO_BALL",
+ "MOVE_BRICK_BREAK",
+ "MOVE_SANDSTORM"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 55,
+ "species": "SPECIES_WHISCASH",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_FISSURE",
+ "MOVE_AQUA_TAIL",
+ "MOVE_ZEN_HEADBUTT",
+ "MOVE_ROCK_SLIDE"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 59,
+ "species": "SPECIES_HIPPOWDON",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_EARTHQUAKE",
+ "MOVE_STONE_EDGE",
+ "MOVE_CRUNCH",
+ "MOVE_CURSE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 263,
+ "type": 3,
+ "class": 67,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE",
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 250,
+ "level": 58,
+ "species": "SPECIES_RAPIDASH",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_FLARE_BLITZ",
+ "MOVE_SOLAR_BEAM",
+ "MOVE_BOUNCE",
+ "MOVE_SUNNY_DAY"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 57,
+ "species": "SPECIES_STEELIX",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_FIRE_FANG",
+ "MOVE_ROCK_TOMB",
+ "MOVE_SCREECH",
+ "MOVE_SUNNY_DAY"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 58,
+ "species": "SPECIES_DRIFBLIM",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_WILL_O_WISP",
+ "MOVE_OMINOUS_WIND",
+ "MOVE_DOUBLE_TEAM",
+ "MOVE_BATON_PASS"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 57,
+ "species": "SPECIES_LOPUNNY",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_FIRE_PUNCH",
+ "MOVE_CHARM",
+ "MOVE_MIRROR_COAT",
+ "MOVE_SUNNY_DAY"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 61,
+ "species": "SPECIES_INFERNAPE",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_FLARE_BLITZ",
+ "MOVE_THUNDER_PUNCH",
+ "MOVE_MACH_PUNCH",
+ "MOVE_EARTHQUAKE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 264,
+ "type": 3,
+ "class": 68,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE",
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 250,
+ "level": 59,
+ "species": "SPECIES_MR_MIME",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_PSYCHIC",
+ "MOVE_THUNDERBOLT",
+ "MOVE_REFLECT",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 59,
+ "species": "SPECIES_GIRAFARIG",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_PSYCHIC",
+ "MOVE_SHADOW_BALL",
+ "MOVE_DOUBLE_HIT",
+ "MOVE_CRUNCH"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 60,
+ "species": "SPECIES_MEDICHAM",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_DRAIN_PUNCH",
+ "MOVE_FIRE_PUNCH",
+ "MOVE_THUNDER_PUNCH",
+ "MOVE_ICE_PUNCH"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 60,
+ "species": "SPECIES_ALAKAZAM",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_PSYCHIC",
+ "MOVE_ENERGY_BALL",
+ "MOVE_FOCUS_BLAST",
+ "MOVE_RECOVER"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 63,
+ "species": "SPECIES_BRONZONG",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_PSYCHIC",
+ "MOVE_GYRO_BALL",
+ "MOVE_EARTHQUAKE",
+ "MOVE_CALM_MIND"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 265,
+ "type": 0,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 7,
+ "species": "SPECIES_SHINX"
+ }
+ ]
+ },
+ {
+ "index": 266,
+ "type": 1,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 27,
+ "species": "SPECIES_GASTLY",
+ "moves": [
+ "MOVE_PAYBACK",
+ "MOVE_SUCKER_PUNCH",
+ "MOVE_CONFUSE_RAY"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 27,
+ "species": "SPECIES_GASTLY",
+ "moves": [
+ "MOVE_SUCKER_PUNCH",
+ "MOVE_NIGHT_SHADE",
+ "MOVE_CONFUSE_RAY"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 27,
+ "species": "SPECIES_GASTLY",
+ "moves": [
+ "MOVE_NIGHT_SHADE",
+ "MOVE_PAYBACK",
+ "MOVE_CONFUSE_RAY"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 267,
+ "type": 3,
+ "class": 69,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE",
+ "ITEM_FULL_RESTORE",
+ "ITEM_FULL_RESTORE",
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 250,
+ "level": 61,
+ "species": "SPECIES_SPIRITOMB",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_DARK_PULSE",
+ "MOVE_PSYCHIC",
+ "MOVE_SILVER_WIND",
+ "MOVE_EMBARGO"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 60,
+ "species": "SPECIES_ROSERADE",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_ENERGY_BALL",
+ "MOVE_SLUDGE_BOMB",
+ "MOVE_SHADOW_BALL",
+ "MOVE_EXTRASENSORY"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 60,
+ "species": "SPECIES_GASTRODON",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_MUDDY_WATER",
+ "MOVE_EARTHQUAKE",
+ "MOVE_STONE_EDGE",
+ "MOVE_SLUDGE_BOMB"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 63,
+ "species": "SPECIES_LUCARIO",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_AURA_SPHERE",
+ "MOVE_DRAGON_PULSE",
+ "MOVE_PSYCHIC",
+ "MOVE_EARTHQUAKE"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 63,
+ "species": "SPECIES_MILOTIC",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_SURF",
+ "MOVE_ICE_BEAM",
+ "MOVE_MIRROR_COAT",
+ "MOVE_AQUA_RING"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 66,
+ "species": "SPECIES_GARCHOMP",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_DRAGON_RUSH",
+ "MOVE_EARTHQUAKE",
+ "MOVE_BRICK_BREAK",
+ "MOVE_GIGA_IMPACT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 268,
+ "type": 1,
+ "class": 53,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 37,
+ "species": "SPECIES_FLOATZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_CRUNCH",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_ICE_FANG"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 37,
+ "species": "SPECIES_SNEASEL",
+ "moves": [
+ "MOVE_ICY_WIND",
+ "MOVE_SLASH",
+ "MOVE_FEINT_ATTACK",
+ "MOVE_QUICK_ATTACK"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 269,
+ "type": 1,
+ "class": 53,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 39,
+ "species": "SPECIES_QUAGSIRE",
+ "moves": [
+ "MOVE_EARTHQUAKE",
+ "MOVE_WATER_PULSE",
+ "MOVE_AMNESIA",
+ "MOVE_YAWN"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 270,
+ "type": 1,
+ "class": 54,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 35,
+ "species": "SPECIES_PELIPPER",
+ "moves": [
+ "MOVE_WATER_PULSE",
+ "MOVE_WING_ATTACK",
+ "MOVE_SUPERSONIC",
+ "MOVE_ROOST"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 36,
+ "species": "SPECIES_GOLDUCK",
+ "moves": [
+ "MOVE_WATER_PULSE",
+ "MOVE_CONFUSION",
+ "MOVE_DISABLE",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 37,
+ "species": "SPECIES_STEELIX",
+ "moves": [
+ "MOVE_ICE_FANG",
+ "MOVE_ROCK_TOMB",
+ "MOVE_HARDEN",
+ "MOVE_SCREECH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 271,
+ "type": 1,
+ "class": 54,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 37,
+ "species": "SPECIES_SNEASEL",
+ "moves": [
+ "MOVE_ICY_WIND",
+ "MOVE_SLASH",
+ "MOVE_SCREECH",
+ "MOVE_LEER"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 37,
+ "species": "SPECIES_TENTACRUEL",
+ "moves": [
+ "MOVE_WATER_PULSE",
+ "MOVE_POISON_JAB",
+ "MOVE_BARRIER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 272,
+ "type": 0,
+ "class": 37,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 20,
+ "species": "SPECIES_ROSELIA"
+ },
+ {
+ "difficulty": 0,
+ "level": 22,
+ "species": "SPECIES_ROSELIA"
+ },
+ {
+ "difficulty": 0,
+ "level": 24,
+ "species": "SPECIES_ROSELIA"
+ }
+ ]
+ },
+ {
+ "index": 273,
+ "type": 0,
+ "class": 37,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 22,
+ "species": "SPECIES_PONYTA"
+ },
+ {
+ "difficulty": 0,
+ "level": 20,
+ "species": "SPECIES_PONYTA"
+ },
+ {
+ "difficulty": 0,
+ "level": 24,
+ "species": "SPECIES_PONYTA"
+ }
+ ]
+ },
+ {
+ "index": 274,
+ "type": 0,
+ "class": 37,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_HIPPOPOTAS"
+ },
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_HIPPOPOTAS"
+ },
+ {
+ "difficulty": 0,
+ "level": 34,
+ "species": "SPECIES_HIPPOPOTAS"
+ }
+ ]
+ },
+ {
+ "index": 275,
+ "type": 0,
+ "class": 37,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_MR_MIME"
+ },
+ {
+ "difficulty": 0,
+ "level": 20,
+ "species": "SPECIES_MR_MIME"
+ },
+ {
+ "difficulty": 0,
+ "level": 20,
+ "species": "SPECIES_MR_MIME"
+ }
+ ]
+ },
+ {
+ "index": 276,
+ "type": 0,
+ "class": 37,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_SUDOWOODO"
+ },
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_SUDOWOODO"
+ },
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_SUDOWOODO"
+ }
+ ]
+ },
+ {
+ "index": 277,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 53,
+ "species": "SPECIES_SWABLU"
+ },
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_ALTARIA"
+ }
+ ]
+ },
+ {
+ "index": 278,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 23,
+ "species": "SPECIES_MONFERNO",
+ "moves": [
+ "MOVE_FLAME_WHEEL",
+ "MOVE_MACH_PUNCH",
+ "MOVE_TAUNT",
+ "MOVE_TORMENT"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 23,
+ "species": "SPECIES_GYARADOS",
+ "moves": [
+ "MOVE_BITE",
+ "MOVE_THRASH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 279,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 30,
+ "species": "SPECIES_SKORUPI",
+ "moves": [
+ "MOVE_IRON_TAIL",
+ "MOVE_ACUPRESSURE",
+ "MOVE_PIN_MISSILE",
+ "MOVE_POISON_STING"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 32,
+ "species": "SPECIES_STEELIX",
+ "moves": [
+ "MOVE_IRON_TAIL",
+ "MOVE_SCREECH",
+ "MOVE_ROCK_THROW",
+ "MOVE_SANDSTORM"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 280,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 26,
+ "species": "SPECIES_GASTLY",
+ "moves": [
+ "MOVE_SHADOW_BALL",
+ "MOVE_SUCKER_PUNCH",
+ "MOVE_CURSE",
+ "MOVE_CONFUSE_RAY"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 28,
+ "species": "SPECIES_HAUNTER",
+ "moves": [
+ "MOVE_SHADOW_BALL",
+ "MOVE_SUCKER_PUNCH",
+ "MOVE_HYPNOSIS",
+ "MOVE_CONFUSE_RAY"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 30,
+ "species": "SPECIES_GENGAR",
+ "moves": [
+ "MOVE_SHADOW_BALL",
+ "MOVE_CONFUSE_RAY",
+ "MOVE_CURSE",
+ "MOVE_MEAN_LOOK"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 281,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 44,
+ "species": "SPECIES_STEELIX",
+ "moves": [
+ "MOVE_THUNDER_FANG",
+ "MOVE_ROCK_THROW",
+ "MOVE_SCREECH",
+ "MOVE_HARDEN"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 44,
+ "species": "SPECIES_MEDICHAM",
+ "moves": [
+ "MOVE_THUNDER_PUNCH",
+ "MOVE_MEDITATE",
+ "MOVE_DETECT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 282,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_POLIWHIRL",
+ "moves": [
+ "MOVE_HYDRO_PUMP",
+ "MOVE_WAKE_UP_SLAP",
+ "MOVE_HYPNOSIS"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_GYARADOS",
+ "moves": [
+ "MOVE_HYPER_BEAM",
+ "MOVE_HYDRO_PUMP",
+ "MOVE_DRAGON_DANCE",
+ "MOVE_ICE_FANG"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 283,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 33,
+ "species": "SPECIES_AZUMARILL",
+ "moves": [
+ "MOVE_IRON_TAIL",
+ "MOVE_ATTRACT",
+ "MOVE_TAIL_WHIP",
+ "MOVE_DEFENSE_CURL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 284,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 30,
+ "species": "SPECIES_MISDREAVUS",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_PAIN_SPLIT",
+ "MOVE_CONFUSE_RAY",
+ "MOVE_SPITE"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 30,
+ "species": "SPECIES_DRIFBLIM",
+ "moves": [
+ "MOVE_STOCKPILE",
+ "MOVE_SWALLOW",
+ "MOVE_SPIT_UP",
+ "MOVE_PAYBACK"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 285,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 44,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_PSYCHIC",
+ "MOVE_REFLECT",
+ "MOVE_DISABLE",
+ "MOVE_RECOVER"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 44,
+ "species": "SPECIES_RAICHU",
+ "moves": [
+ "MOVE_THUNDERBOLT",
+ "MOVE_DIG",
+ "MOVE_THUNDER_WAVE",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 286,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 56,
+ "species": "SPECIES_METAGROSS",
+ "moves": [
+ "MOVE_METEOR_MASH",
+ "MOVE_HAMMER_ARM",
+ "MOVE_PSYCHIC",
+ "MOVE_MAGNET_RISE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 287,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 23,
+ "species": "SPECIES_GLAMEOW",
+ "moves": [
+ "MOVE_FURY_SWIPES",
+ "MOVE_FEINT_ATTACK",
+ "MOVE_HYPNOSIS",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 23,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_CONFUSION",
+ "MOVE_DISABLE",
+ "MOVE_MIRACLE_EYE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 288,
+ "type": 0,
+ "class": 49,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 52,
+ "species": "SPECIES_MISDREAVUS"
+ },
+ {
+ "difficulty": 0,
+ "level": 54,
+ "species": "SPECIES_HAUNTER"
+ }
+ ]
+ },
+ {
+ "index": 289,
+ "type": 0,
+ "class": 50,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 52,
+ "species": "SPECIES_MEDICHAM"
+ },
+ {
+ "difficulty": 0,
+ "level": 54,
+ "species": "SPECIES_ALAKAZAM"
+ }
+ ]
+ },
+ {
+ "index": 290,
+ "type": 0,
+ "class": 70,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_STUNKY"
+ },
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_GLAMEOW"
+ }
+ ]
+ },
+ {
+ "index": 291,
+ "type": 0,
+ "class": 71,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 292,
+ "type": 0,
+ "class": 71,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_AIPOM"
+ },
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_PSYDUCK"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_GIRAFARIG"
+ }
+ ]
+ },
+ {
+ "index": 293,
+ "type": 1,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 22,
+ "species": "SPECIES_GOLDEEN",
+ "moves": [
+ "MOVE_WATER_PULSE",
+ "MOVE_PECK",
+ "MOVE_FLAIL",
+ "MOVE_SUPERSONIC"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 23,
+ "species": "SPECIES_BARBOACH",
+ "moves": [
+ "MOVE_WATER_PULSE",
+ "MOVE_MUD_BOMB",
+ "MOVE_MUD_SPORT"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 24,
+ "species": "SPECIES_GYARADOS",
+ "moves": [
+ "MOVE_THRASH",
+ "MOVE_BITE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 294,
+ "type": 0,
+ "class": 8,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_BONSLY"
+ },
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_MIME_JR"
+ }
+ ]
+ },
+ {
+ "index": 295,
+ "type": 3,
+ "class": 72,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 14,
+ "species": "SPECIES_ZUBAT",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_BITE",
+ "MOVE_LEECH_LIFE",
+ "MOVE_TOXIC"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 16,
+ "species": "SPECIES_PURUGLY",
+ "item": "ITEM_ORAN_BERRY",
+ "moves": [
+ "MOVE_FEINT_ATTACK",
+ "MOVE_SCRATCH",
+ "MOVE_FAKE_OUT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 296,
+ "type": 1,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 9,
+ "species": "SPECIES_WURMPLE",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_STRING_SHOT"
+ ]
+ },
+ {
+ "difficulty": 30,
+ "level": 9,
+ "species": "SPECIES_SILCOON",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_HARDEN"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 297,
+ "type": 1,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 11,
+ "species": "SPECIES_ZUBAT",
+ "moves": [
+ "MOVE_LEECH_LIFE",
+ "MOVE_ASTONISH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 298,
+ "type": 1,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 11,
+ "species": "SPECIES_CASCOON",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_HARDEN",
+ "MOVE_POISON_STING"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 299,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 10,
+ "species": "SPECIES_WURMPLE"
+ },
+ {
+ "difficulty": 30,
+ "level": 10,
+ "species": "SPECIES_GLAMEOW"
+ }
+ ]
+ },
+ {
+ "index": 300,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_LUXIO"
+ }
+ ]
+ },
+ {
+ "index": 301,
+ "type": 1,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 44,
+ "species": "SPECIES_LUXIO",
+ "moves": [
+ "MOVE_THUNDER_FANG",
+ "MOVE_CRUNCH",
+ "MOVE_LEER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 302,
+ "type": 1,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 42,
+ "species": "SPECIES_LUXIO",
+ "moves": [
+ "MOVE_THUNDER_FANG",
+ "MOVE_CRUNCH",
+ "MOVE_LEER"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 42,
+ "species": "SPECIES_BIBAREL",
+ "moves": [
+ "MOVE_THUNDERBOLT",
+ "MOVE_WATER_PULSE",
+ "MOVE_SUPER_FANG",
+ "MOVE_THUNDER_WAVE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 303,
+ "type": 1,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 44,
+ "species": "SPECIES_RAICHU",
+ "moves": [
+ "MOVE_THUNDERBOLT",
+ "MOVE_SLAM",
+ "MOVE_THUNDER_WAVE",
+ "MOVE_QUICK_ATTACK"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 304,
+ "type": 0,
+ "class": 48,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_BRONZOR"
+ },
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_SHIELDON"
+ }
+ ]
+ },
+ {
+ "index": 305,
+ "type": 0,
+ "class": 48,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 54,
+ "species": "SPECIES_STEELIX"
+ }
+ ]
+ },
+ {
+ "index": 306,
+ "type": 0,
+ "class": 19,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_PONYTA"
+ }
+ ]
+ },
+ {
+ "index": 307,
+ "type": 0,
+ "class": 19,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_LUXIO"
+ },
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_STARAVIA"
+ },
+ {
+ "difficulty": 0,
+ "level": 20,
+ "species": "SPECIES_PONYTA"
+ }
+ ]
+ },
+ {
+ "index": 308,
+ "type": 0,
+ "class": 19,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_STARAVIA"
+ }
+ ]
+ },
+ {
+ "index": 309,
+ "type": 1,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 40,
+ "level": 25,
+ "species": "SPECIES_MACHOKE",
+ "moves": [
+ "MOVE_KARATE_CHOP",
+ "MOVE_LEER"
+ ]
+ },
+ {
+ "difficulty": 40,
+ "level": 25,
+ "species": "SPECIES_MACHOKE",
+ "moves": [
+ "MOVE_LOW_KICK",
+ "MOVE_FORESIGHT"
+ ]
+ },
+ {
+ "difficulty": 40,
+ "level": 25,
+ "species": "SPECIES_MACHOKE",
+ "moves": [
+ "MOVE_REVENGE",
+ "MOVE_LEER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 310,
+ "type": 1,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 40,
+ "level": 25,
+ "species": "SPECIES_MACHOKE",
+ "moves": [
+ "MOVE_KARATE_CHOP",
+ "MOVE_FORESIGHT"
+ ]
+ },
+ {
+ "difficulty": 40,
+ "level": 25,
+ "species": "SPECIES_MACHOP",
+ "moves": [
+ "MOVE_LOW_KICK",
+ "MOVE_LEER"
+ ]
+ },
+ {
+ "difficulty": 40,
+ "level": 25,
+ "species": "SPECIES_MACHOKE",
+ "moves": [
+ "MOVE_SEISMIC_TOSS",
+ "MOVE_FORESIGHT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 311,
+ "type": 1,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 40,
+ "level": 28,
+ "species": "SPECIES_MEDITITE",
+ "moves": [
+ "MOVE_FORCE_PALM",
+ "MOVE_CONFUSION",
+ "MOVE_DETECT",
+ "MOVE_MEDITATE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 312,
+ "type": 1,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 40,
+ "level": 26,
+ "species": "SPECIES_MACHOKE",
+ "moves": [
+ "MOVE_VITAL_THROW",
+ "MOVE_FORESIGHT",
+ "MOVE_LEER"
+ ]
+ },
+ {
+ "difficulty": 40,
+ "level": 26,
+ "species": "SPECIES_MEDITITE",
+ "moves": [
+ "MOVE_FORCE_PALM",
+ "MOVE_CALM_MIND",
+ "MOVE_DETECT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 313,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 52,
+ "species": "SPECIES_CROAGUNK"
+ },
+ {
+ "difficulty": 30,
+ "level": 56,
+ "species": "SPECIES_MACHAMP"
+ }
+ ]
+ },
+ {
+ "index": 314,
+ "type": 1,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 40,
+ "level": 33,
+ "species": "SPECIES_STEELIX",
+ "moves": [
+ "MOVE_DOUBLE_EDGE",
+ "MOVE_TAUNT",
+ "MOVE_TORMENT",
+ "MOVE_SCREECH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 315,
+ "type": 3,
+ "class": 74,
+ "unk2": 0,
+ "items": [
+ "ITEM_SUPER_POTION",
+ "ITEM_SUPER_POTION"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 19,
+ "species": "SPECIES_CHERUBI",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_GRASS_KNOT",
+ "MOVE_LEECH_SEED",
+ "MOVE_GROWTH",
+ "MOVE_SAFEGUARD"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 19,
+ "species": "SPECIES_TURTWIG",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_GRASS_KNOT",
+ "MOVE_RAZOR_LEAF",
+ "MOVE_WITHDRAW",
+ "MOVE_REFLECT"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 22,
+ "species": "SPECIES_ROSERADE",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_GRASS_KNOT",
+ "MOVE_MAGICAL_LEAF",
+ "MOVE_POISON_STING",
+ "MOVE_STUN_SPORE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 316,
+ "type": 3,
+ "class": 75,
+ "unk2": 0,
+ "items": [
+ "ITEM_SUPER_POTION",
+ "ITEM_SUPER_POTION"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 27,
+ "species": "SPECIES_GYARADOS",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_BRINE",
+ "MOVE_DRAGON_RAGE",
+ "MOVE_BITE",
+ "MOVE_SWAGGER"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 27,
+ "species": "SPECIES_QUAGSIRE",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_MUD_BOMB",
+ "MOVE_SLAM",
+ "MOVE_MUD_SPORT",
+ "MOVE_TAIL_WHIP"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 30,
+ "species": "SPECIES_FLOATZEL",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_BRINE",
+ "MOVE_ICE_FANG",
+ "MOVE_PURSUIT",
+ "MOVE_SWIFT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 317,
+ "type": 3,
+ "class": 76,
+ "unk2": 0,
+ "items": [
+ "ITEM_HYPER_POTION",
+ "ITEM_HYPER_POTION"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 27,
+ "species": "SPECIES_MEDITITE",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_DRAIN_PUNCH",
+ "MOVE_CONFUSION",
+ "MOVE_MEDITATE",
+ "MOVE_DETECT"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 27,
+ "species": "SPECIES_MACHOKE",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_BRICK_BREAK",
+ "MOVE_ROCK_TOMB",
+ "MOVE_LEER",
+ "MOVE_FORESIGHT"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 30,
+ "species": "SPECIES_LUCARIO",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_DRAIN_PUNCH",
+ "MOVE_FORCE_PALM",
+ "MOVE_METAL_CLAW",
+ "MOVE_BONE_RUSH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 318,
+ "type": 3,
+ "class": 77,
+ "unk2": 0,
+ "items": [
+ "ITEM_HYPER_POTION",
+ "ITEM_HYPER_POTION"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 150,
+ "level": 32,
+ "species": "SPECIES_DRIFBLIM",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_OMINOUS_WIND",
+ "MOVE_GUST",
+ "MOVE_ASTONISH",
+ "MOVE_MINIMIZE"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 34,
+ "species": "SPECIES_GENGAR",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_SHADOW_CLAW",
+ "MOVE_POISON_JAB",
+ "MOVE_SPITE",
+ "MOVE_CONFUSE_RAY"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 36,
+ "species": "SPECIES_MISMAGIUS",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_SHADOW_BALL",
+ "MOVE_PSYBEAM",
+ "MOVE_MAGICAL_LEAF",
+ "MOVE_CONFUSE_RAY"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 319,
+ "type": 3,
+ "class": 78,
+ "unk2": 0,
+ "items": [
+ "ITEM_HYPER_POTION",
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 200,
+ "level": 38,
+ "species": "SPECIES_SNOVER",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_AVALANCHE",
+ "MOVE_RAZOR_LEAF",
+ "MOVE_INGRAIN",
+ "MOVE_LEER"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 38,
+ "species": "SPECIES_SNEASEL",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_AVALANCHE",
+ "MOVE_SLASH",
+ "MOVE_FEINT_ATTACK",
+ "MOVE_TAUNT"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 40,
+ "species": "SPECIES_MEDICHAM",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_ICE_PUNCH",
+ "MOVE_FORCE_PALM",
+ "MOVE_DETECT",
+ "MOVE_BULK_UP"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 42,
+ "species": "SPECIES_ABOMASNOW",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_AVALANCHE",
+ "MOVE_WOOD_HAMMER",
+ "MOVE_GRASS_WHISTLE",
+ "MOVE_SWAGGER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 320,
+ "type": 3,
+ "class": 79,
+ "unk2": 0,
+ "items": [
+ "ITEM_HYPER_POTION",
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 200,
+ "level": 46,
+ "species": "SPECIES_RAICHU",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_CHARGE_BEAM",
+ "MOVE_BRICK_BREAK",
+ "MOVE_THUNDER_WAVE",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 47,
+ "species": "SPECIES_AMBIPOM",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_SHOCK_WAVE",
+ "MOVE_AGILITY",
+ "MOVE_NASTY_PLOT",
+ "MOVE_BATON_PASS"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 47,
+ "species": "SPECIES_OCTILLERY",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_CHARGE_BEAM",
+ "MOVE_OCTAZOOKA",
+ "MOVE_AURORA_BEAM",
+ "MOVE_BULLET_SEED"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 49,
+ "species": "SPECIES_LUXRAY",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_CHARGE_BEAM",
+ "MOVE_THUNDER_FANG",
+ "MOVE_CRUNCH",
+ "MOVE_THUNDER_WAVE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 321,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 322,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_STARLY"
+ },
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_BIDOOF"
+ }
+ ]
+ },
+ {
+ "index": 323,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 4,
+ "species": "SPECIES_BIDOOF"
+ },
+ {
+ "difficulty": 0,
+ "level": 4,
+ "species": "SPECIES_BUDEW"
+ },
+ {
+ "difficulty": 0,
+ "level": 4,
+ "species": "SPECIES_STARLY"
+ }
+ ]
+ },
+ {
+ "index": 324,
+ "type": 1,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 15,
+ "species": "SPECIES_CHERUBI",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_LEECH_SEED"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 15,
+ "species": "SPECIES_ROSELIA",
+ "moves": [
+ "MOVE_MEGA_DRAIN",
+ "MOVE_POISON_STING",
+ "MOVE_STUN_SPORE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 325,
+ "type": 1,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 30,
+ "species": "SPECIES_MISDREAVUS",
+ "moves": [
+ "MOVE_PAIN_SPLIT",
+ "MOVE_PSYBEAM",
+ "MOVE_CONFUSE_RAY"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 326,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_ONIX"
+ }
+ ]
+ },
+ {
+ "index": 327,
+ "type": 0,
+ "class": 80,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_GOLDEEN"
+ },
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_BUIZEL"
+ }
+ ]
+ },
+ {
+ "index": 328,
+ "type": 0,
+ "class": 80,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_PSYDUCK"
+ }
+ ]
+ },
+ {
+ "index": 329,
+ "type": 1,
+ "class": 5,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_BUDEW",
+ "moves": [
+ "MOVE_ABSORB",
+ "MOVE_GROWTH",
+ "MOVE_WATER_SPORT"
+ ]
+ },
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_PSYDUCK",
+ "moves": [
+ "MOVE_SCRATCH",
+ "MOVE_TAIL_WHIP"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 330,
+ "type": 1,
+ "class": 5,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 28,
+ "species": "SPECIES_DRIFLOON",
+ "moves": [
+ "MOVE_SPIT_UP",
+ "MOVE_SWALLOW",
+ "MOVE_STOCKPILE"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 28,
+ "species": "SPECIES_MISDREAVUS",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_ASTONISH",
+ "MOVE_CONFUSE_RAY"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 331,
+ "type": 0,
+ "class": 22,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 41,
+ "species": "SPECIES_PIKACHU"
+ },
+ {
+ "difficulty": 10,
+ "level": 41,
+ "species": "SPECIES_PIKACHU"
+ },
+ {
+ "difficulty": 10,
+ "level": 41,
+ "species": "SPECIES_PIKACHU"
+ },
+ {
+ "difficulty": 10,
+ "level": 41,
+ "species": "SPECIES_PIKACHU"
+ }
+ ]
+ },
+ {
+ "index": 332,
+ "type": 0,
+ "class": 38,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 20,
+ "species": "SPECIES_HOOTHOOT"
+ },
+ {
+ "difficulty": 0,
+ "level": 20,
+ "species": "SPECIES_MACHOP"
+ }
+ ]
+ },
+ {
+ "index": 333,
+ "type": 0,
+ "class": 38,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 42,
+ "species": "SPECIES_NOCTOWL"
+ },
+ {
+ "difficulty": 0,
+ "level": 42,
+ "species": "SPECIES_MACHOKE"
+ }
+ ]
+ },
+ {
+ "index": 334,
+ "type": 0,
+ "class": 32,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 335,
+ "type": 0,
+ "class": 32,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 43,
+ "species": "SPECIES_LUXIO"
+ }
+ ]
+ },
+ {
+ "index": 336,
+ "type": 0,
+ "class": 33,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 337,
+ "type": 0,
+ "class": 46,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 43,
+ "species": "SPECIES_MANTYKE"
+ }
+ ]
+ },
+ {
+ "index": 338,
+ "type": 0,
+ "class": 46,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 27,
+ "species": "SPECIES_MANTYKE"
+ },
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 339,
+ "type": 1,
+ "class": 46,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 24,
+ "species": "SPECIES_WINGULL",
+ "moves": [
+ "MOVE_WATER_PULSE",
+ "MOVE_WING_ATTACK",
+ "MOVE_SUPERSONIC"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 24,
+ "species": "SPECIES_WINGULL",
+ "moves": [
+ "MOVE_WATER_PULSE",
+ "MOVE_WING_ATTACK",
+ "MOVE_SUPERSONIC"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 340,
+ "type": 1,
+ "class": 60,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 30,
+ "species": "SPECIES_HAUNTER",
+ "moves": [
+ "MOVE_SHADOW_PUNCH",
+ "MOVE_SUCKER_PUNCH",
+ "MOVE_CONFUSE_RAY",
+ "MOVE_HYPNOSIS"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 341,
+ "type": 1,
+ "class": 60,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 44,
+ "species": "SPECIES_MR_MIME",
+ "moves": [
+ "MOVE_THUNDERBOLT",
+ "MOVE_ENERGY_BALL",
+ "MOVE_THUNDER_WAVE",
+ "MOVE_FLASH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 342,
+ "type": 1,
+ "class": 60,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 6,
+ "species": "SPECIES_ABRA",
+ "moves": [
+ "MOVE_HIDDEN_POWER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 343,
+ "type": 1,
+ "class": 61,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 28,
+ "species": "SPECIES_DRIFLOON",
+ "moves": [
+ "MOVE_PAYBACK",
+ "MOVE_GUST",
+ "MOVE_ASTONISH",
+ "MOVE_MINIMIZE"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 28,
+ "species": "SPECIES_DRIFLOON",
+ "moves": [
+ "MOVE_SPIT_UP",
+ "MOVE_SWALLOW",
+ "MOVE_STOCKPILE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 344,
+ "type": 1,
+ "class": 61,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 44,
+ "species": "SPECIES_PACHIRISU",
+ "moves": [
+ "MOVE_LAST_RESORT",
+ "MOVE_SUPER_FANG",
+ "MOVE_DISCHARGE",
+ "MOVE_SWEET_KISS"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 345,
+ "type": 1,
+ "class": 61,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 6,
+ "species": "SPECIES_ABRA",
+ "moves": [
+ "MOVE_HIDDEN_POWER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 346,
+ "type": 0,
+ "class": 36,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_GLAMEOW"
+ }
+ ]
+ },
+ {
+ "index": 347,
+ "type": 0,
+ "class": 36,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 348,
+ "type": 1,
+ "class": 36,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 17,
+ "species": "SPECIES_ROSELIA",
+ "moves": [
+ "MOVE_MEGA_DRAIN",
+ "MOVE_POISON_STING",
+ "MOVE_STUN_SPORE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 349,
+ "type": 0,
+ "class": 55,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 350,
+ "type": 0,
+ "class": 56,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 351,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 352,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 353,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 354,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 355,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 7,
+ "species": "SPECIES_KRICKETOT"
+ }
+ ]
+ },
+ {
+ "index": 356,
+ "type": 1,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 7,
+ "species": "SPECIES_MACHOP",
+ "moves": [
+ "MOVE_LOW_KICK",
+ "MOVE_LEER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 357,
+ "type": 1,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 27,
+ "species": "SPECIES_GASTLY",
+ "moves": [
+ "MOVE_SUCKER_PUNCH",
+ "MOVE_NIGHT_SHADE",
+ "MOVE_CONFUSE_RAY",
+ "MOVE_CURSE"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 29,
+ "species": "SPECIES_HAUNTER",
+ "moves": [
+ "MOVE_SUCKER_PUNCH",
+ "MOVE_SHADOW_PUNCH",
+ "MOVE_CONFUSE_RAY",
+ "MOVE_SPITE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 358,
+ "type": 0,
+ "class": 44,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_SHELLOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_SHELLOS"
+ }
+ ]
+ },
+ {
+ "index": 359,
+ "type": 0,
+ "class": 44,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 43,
+ "species": "SPECIES_REMORAID"
+ }
+ ]
+ },
+ {
+ "index": 360,
+ "type": 0,
+ "class": 45,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_MARILL"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_MARILL"
+ }
+ ]
+ },
+ {
+ "index": 361,
+ "type": 0,
+ "class": 45,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 43,
+ "species": "SPECIES_REMORAID"
+ }
+ ]
+ },
+ {
+ "index": 362,
+ "type": 1,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 52,
+ "species": "SPECIES_STARAVIA",
+ "moves": [
+ "MOVE_BRAVE_BIRD",
+ "MOVE_TAKE_DOWN",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_U_TURN"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 53,
+ "species": "SPECIES_PELIPPER",
+ "moves": [
+ "MOVE_STOCKPILE",
+ "MOVE_SWALLOW",
+ "MOVE_SPIT_UP",
+ "MOVE_WATER_PULSE"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 54,
+ "species": "SPECIES_GOLBAT",
+ "moves": [
+ "MOVE_AIR_SLASH",
+ "MOVE_POISON_FANG",
+ "MOVE_BITE",
+ "MOVE_CONFUSE_RAY"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 363,
+ "type": 0,
+ "class": 81,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 364,
+ "type": 0,
+ "class": 81,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 365,
+ "type": 0,
+ "class": 81,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 366,
+ "type": 0,
+ "class": 26,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 22,
+ "species": "SPECIES_CLEFAIRY"
+ }
+ ]
+ },
+ {
+ "index": 367,
+ "type": 1,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 29,
+ "species": "SPECIES_ONIX",
+ "moves": [
+ "MOVE_IRON_TAIL",
+ "MOVE_SLAM",
+ "MOVE_DIG"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 29,
+ "species": "SPECIES_ONIX",
+ "moves": [
+ "MOVE_IRON_TAIL",
+ "MOVE_SLAM",
+ "MOVE_DIG"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 368,
+ "type": 0,
+ "class": 82,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_WOOPER"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_MARILL"
+ }
+ ]
+ },
+ {
+ "index": 369,
+ "type": 0,
+ "class": 83,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_PACHIRISU"
+ }
+ ]
+ },
+ {
+ "index": 370,
+ "type": 0,
+ "class": 84,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_CHATOT"
+ }
+ ]
+ },
+ {
+ "index": 371,
+ "type": 0,
+ "class": 85,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_PIKACHU"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_CLEFAIRY"
+ }
+ ]
+ },
+ {
+ "index": 372,
+ "type": 0,
+ "class": 10,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 34,
+ "species": "SPECIES_MEDICHAM"
+ }
+ ]
+ },
+ {
+ "index": 373,
+ "type": 0,
+ "class": 30,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_MURKROW"
+ },
+ {
+ "difficulty": 0,
+ "level": 57,
+ "species": "SPECIES_HONCHKROW"
+ }
+ ]
+ },
+ {
+ "index": 374,
+ "type": 0,
+ "class": 16,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 375,
+ "type": 0,
+ "class": 17,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 376,
+ "type": 0,
+ "class": 83,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 377,
+ "type": 1,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 14,
+ "species": "SPECIES_GEODUDE",
+ "moves": [
+ "MOVE_ROCK_THROW",
+ "MOVE_TACKLE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 378,
+ "type": 1,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_LUXIO",
+ "moves": [
+ "MOVE_SPARK",
+ "MOVE_BITE",
+ "MOVE_SWAGGER"
+ ]
+ },
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_STUNKY",
+ "moves": [
+ "MOVE_NIGHT_SLASH",
+ "MOVE_SLASH",
+ "MOVE_SMOKESCREEN",
+ "MOVE_TOXIC"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 379,
+ "type": 1,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 13,
+ "species": "SPECIES_CASCOON",
+ "moves": [
+ "MOVE_POISON_STING",
+ "MOVE_TACKLE"
+ ]
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_DUSTOX",
+ "moves": [
+ "MOVE_POISON_STING",
+ "MOVE_GUST",
+ "MOVE_CONFUSION"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 380,
+ "type": 1,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_BUIZEL",
+ "moves": [
+ "MOVE_WATER_GUN",
+ "MOVE_SWIFT",
+ "MOVE_QUICK_ATTACK"
+ ]
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_SHINX",
+ "moves": [
+ "MOVE_SPARK",
+ "MOVE_BITE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 381,
+ "type": 0,
+ "class": 37,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_GEODUDE"
+ }
+ ]
+ },
+ {
+ "index": 382,
+ "type": 0,
+ "class": 37,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_BUIZEL"
+ },
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_BUIZEL"
+ },
+ {
+ "difficulty": 0,
+ "level": 24,
+ "species": "SPECIES_BUIZEL"
+ }
+ ]
+ },
+ {
+ "index": 383,
+ "type": 0,
+ "class": 37,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 12,
+ "species": "SPECIES_GASTLY"
+ },
+ {
+ "difficulty": 0,
+ "level": 13,
+ "species": "SPECIES_GASTLY"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_GASTLY"
+ }
+ ]
+ },
+ {
+ "index": 384,
+ "type": 0,
+ "class": 20,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 385,
+ "type": 0,
+ "class": 21,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 386,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 56,
+ "species": "SPECIES_GABITE"
+ },
+ {
+ "difficulty": 50,
+ "level": 56,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 387,
+ "type": 0,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 388,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 31,
+ "species": "SPECIES_PONYTA",
+ "moves": [
+ "MOVE_TAKE_DOWN",
+ "MOVE_FIRE_SPIN",
+ "MOVE_STOMP",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 31,
+ "species": "SPECIES_HAUNTER",
+ "moves": [
+ "MOVE_SHADOW_BALL",
+ "MOVE_SUCKER_PUNCH",
+ "MOVE_CONFUSE_RAY",
+ "MOVE_SPITE"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 34,
+ "species": "SPECIES_FLOATZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_CRUNCH",
+ "MOVE_SWIFT",
+ "MOVE_ICE_FANG"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 389,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_BIBAREL",
+ "moves": [
+ "MOVE_SUPERPOWER",
+ "MOVE_SUPER_FANG",
+ "MOVE_HYPER_FANG",
+ "MOVE_YAWN"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_RAPIDASH",
+ "moves": [
+ "MOVE_BOUNCE",
+ "MOVE_FIRE_BLAST",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_BEAUTIFLY",
+ "moves": [
+ "MOVE_BUG_BUZZ",
+ "MOVE_GIGA_DRAIN",
+ "MOVE_SILVER_WIND",
+ "MOVE_ATTRACT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 390,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_RAICHU",
+ "moves": [
+ "MOVE_THUNDER",
+ "MOVE_RAIN_DANCE",
+ "MOVE_SLAM",
+ "MOVE_DOUBLE_TEAM"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_GASTRODON",
+ "moves": [
+ "MOVE_MUDDY_WATER",
+ "MOVE_MUD_BOMB",
+ "MOVE_BODY_SLAM",
+ "MOVE_RECOVER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 391,
+ "type": 0,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 392,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 33,
+ "species": "SPECIES_PELIPPER",
+ "moves": [
+ "MOVE_WATER_PULSE",
+ "MOVE_WING_ATTACK",
+ "MOVE_ROOST",
+ "MOVE_PROTECT"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 33,
+ "species": "SPECIES_SUDOWOODO",
+ "moves": [
+ "MOVE_ROCK_SLIDE",
+ "MOVE_FEINT_ATTACK",
+ "MOVE_LOW_KICK",
+ "MOVE_FLAIL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 393,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_PACHIRISU",
+ "moves": [
+ "MOVE_DISCHARGE",
+ "MOVE_SUPER_FANG",
+ "MOVE_SWEET_KISS",
+ "MOVE_CHARM"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_AZUMARILL",
+ "moves": [
+ "MOVE_HYDRO_PUMP",
+ "MOVE_AQUA_TAIL",
+ "MOVE_DOUBLE_EDGE",
+ "MOVE_RAIN_DANCE"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_BLISSEY",
+ "moves": [
+ "MOVE_HYPER_BEAM",
+ "MOVE_SOFT_BOILED",
+ "MOVE_LIGHT_SCREEN",
+ "MOVE_MINIMIZE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 394,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_LOPUNNY",
+ "moves": [
+ "MOVE_DIZZY_PUNCH",
+ "MOVE_JUMP_KICK",
+ "MOVE_AGILITY",
+ "MOVE_BATON_PASS"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_PELIPPER",
+ "moves": [
+ "MOVE_AIR_SLASH",
+ "MOVE_WATER_PULSE",
+ "MOVE_PLUCK",
+ "MOVE_ROOST"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_QUAGSIRE",
+ "moves": [
+ "MOVE_MUDDY_WATER",
+ "MOVE_EARTHQUAKE",
+ "MOVE_YAWN",
+ "MOVE_AMNESIA"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 395,
+ "type": 0,
+ "class": 49,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_MEDITITE"
+ }
+ ]
+ },
+ {
+ "index": 396,
+ "type": 0,
+ "class": 49,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 56,
+ "species": "SPECIES_MR_MIME"
+ }
+ ]
+ },
+ {
+ "index": 397,
+ "type": 0,
+ "class": 49,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 56,
+ "species": "SPECIES_GIRAFARIG"
+ }
+ ]
+ },
+ {
+ "index": 398,
+ "type": 1,
+ "class": 50,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_PSYDUCK",
+ "moves": [
+ "MOVE_CONFUSION",
+ "MOVE_WATER_GUN",
+ "MOVE_SCRATCH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 399,
+ "type": 0,
+ "class": 50,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 54,
+ "species": "SPECIES_KADABRA"
+ },
+ {
+ "difficulty": 0,
+ "level": 54,
+ "species": "SPECIES_KADABRA"
+ }
+ ]
+ },
+ {
+ "index": 400,
+ "type": 0,
+ "class": 50,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_CHINGLING"
+ },
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_CHIMECHO"
+ }
+ ]
+ },
+ {
+ "index": 401,
+ "type": 1,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 26,
+ "species": "SPECIES_BARBOACH",
+ "moves": [
+ "MOVE_WATER_PULSE",
+ "MOVE_MUD_BOMB",
+ "MOVE_MUD_SLAP"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 402,
+ "type": 0,
+ "class": 34,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 403,
+ "type": 3,
+ "class": 86,
+ "unk2": 0,
+ "items": [
+ "ITEM_SUPER_POTION",
+ "ITEM_SUPER_POTION"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 150,
+ "level": 40,
+ "species": "SPECIES_MURKROW",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_DRILL_PECK",
+ "MOVE_NIGHT_SHADE",
+ "MOVE_ASTONISH",
+ "MOVE_EMBARGO"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 40,
+ "species": "SPECIES_GOLBAT",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_POISON_FANG",
+ "MOVE_AIR_CUTTER",
+ "MOVE_BITE",
+ "MOVE_SUPERSONIC"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 43,
+ "species": "SPECIES_SNEASEL",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_SLASH",
+ "MOVE_ICE_PUNCH",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_SCREECH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 404,
+ "type": 3,
+ "class": 86,
+ "unk2": 0,
+ "items": [
+ "ITEM_SUPER_POTION",
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 200,
+ "level": 45,
+ "species": "SPECIES_HONCHKROW",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_DRILL_PECK",
+ "MOVE_DARK_PULSE",
+ "MOVE_STEEL_WING",
+ "MOVE_EMBARGO"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 46,
+ "species": "SPECIES_CROBAT",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_CROSS_POISON",
+ "MOVE_AIR_SLASH",
+ "MOVE_BITE",
+ "MOVE_CONFUSE_RAY"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 45,
+ "species": "SPECIES_GYARADOS",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_GIGA_IMPACT",
+ "MOVE_AQUA_TAIL",
+ "MOVE_ICE_FANG",
+ "MOVE_EARTHQUAKE"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 48,
+ "species": "SPECIES_WEAVILE",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_NIGHT_SLASH",
+ "MOVE_ICE_PUNCH",
+ "MOVE_BRICK_BREAK",
+ "MOVE_X_SCISSOR"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 405,
+ "type": 3,
+ "class": 72,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 37,
+ "species": "SPECIES_GOLBAT",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_AIR_CUTTER",
+ "MOVE_BITE",
+ "MOVE_TOXIC",
+ "MOVE_SUPERSONIC"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 37,
+ "species": "SPECIES_BRONZOR",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_GYRO_BALL",
+ "MOVE_EXTRASENSORY",
+ "MOVE_IRON_DEFENSE",
+ "MOVE_CONFUSE_RAY"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 39,
+ "species": "SPECIES_PURUGLY",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_SLASH",
+ "MOVE_FEINT_ATTACK",
+ "MOVE_HYPNOSIS",
+ "MOVE_FAKE_OUT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 406,
+ "type": 3,
+ "class": 87,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 18,
+ "species": "SPECIES_ZUBAT",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_GIGA_DRAIN",
+ "MOVE_WING_ATTACK",
+ "MOVE_BITE"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 20,
+ "species": "SPECIES_SKUNTANK",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_NIGHT_SLASH",
+ "MOVE_POISON_GAS",
+ "MOVE_SCREECH",
+ "MOVE_SMOKESCREEN"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 407,
+ "type": 3,
+ "class": 87,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 41,
+ "species": "SPECIES_BRONZOR",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_GYRO_BALL",
+ "MOVE_EXTRASENSORY",
+ "MOVE_ROCK_SLIDE",
+ "MOVE_REFLECT"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 41,
+ "species": "SPECIES_GOLBAT",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_SLUDGE_BOMB",
+ "MOVE_AIR_CUTTER",
+ "MOVE_GIGA_DRAIN",
+ "MOVE_MEAN_LOOK"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 46,
+ "species": "SPECIES_SKUNTANK",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_NIGHT_SLASH",
+ "MOVE_POISON_JAB",
+ "MOVE_FLAMETHROWER",
+ "MOVE_SMOKESCREEN"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 408,
+ "type": 3,
+ "class": 88,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 35,
+ "species": "SPECIES_KADABRA",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_PSYCHIC",
+ "MOVE_SHOCK_WAVE",
+ "MOVE_RECOVER",
+ "MOVE_EMBARGO"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 35,
+ "species": "SPECIES_BRONZOR",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_GYRO_BALL",
+ "MOVE_SHADOW_BALL",
+ "MOVE_ROCK_TOMB",
+ "MOVE_IRON_DEFENSE"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 37,
+ "species": "SPECIES_TOXICROAK",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_POISON_JAB",
+ "MOVE_REVENGE",
+ "MOVE_MUD_BOMB",
+ "MOVE_FEINT_ATTACK"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 409,
+ "type": 3,
+ "class": 88,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 38,
+ "species": "SPECIES_KADABRA",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_PSYCHIC",
+ "MOVE_SHOCK_WAVE",
+ "MOVE_RECOVER",
+ "MOVE_EMBARGO"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 38,
+ "species": "SPECIES_BRONZOR",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_GYRO_BALL",
+ "MOVE_EXTRASENSORY",
+ "MOVE_SHADOW_BALL",
+ "MOVE_CONFUSE_RAY"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 40,
+ "species": "SPECIES_TOXICROAK",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_POISON_JAB",
+ "MOVE_BRICK_BREAK",
+ "MOVE_X_SCISSOR",
+ "MOVE_SWAGGER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 410,
+ "type": 1,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 13,
+ "species": "SPECIES_WURMPLE",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_STRING_SHOT",
+ "MOVE_POISON_STING"
+ ]
+ },
+ {
+ "difficulty": 30,
+ "level": 13,
+ "species": "SPECIES_CASCOON",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_HARDEN",
+ "MOVE_POISON_STING"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 411,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 412,
+ "type": 1,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 13,
+ "species": "SPECIES_WURMPLE",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_STRING_SHOT",
+ "MOVE_POISON_STING"
+ ]
+ },
+ {
+ "difficulty": 30,
+ "level": 13,
+ "species": "SPECIES_ZUBAT",
+ "moves": [
+ "MOVE_LEECH_LIFE",
+ "MOVE_ASTONISH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 413,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 414,
+ "type": 1,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 9,
+ "species": "SPECIES_ZUBAT",
+ "moves": [
+ "MOVE_LEECH_LIFE",
+ "MOVE_ASTONISH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 415,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 9,
+ "species": "SPECIES_WURMPLE"
+ }
+ ]
+ },
+ {
+ "index": 416,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 25,
+ "species": "SPECIES_BEAUTIFLY"
+ },
+ {
+ "difficulty": 30,
+ "level": 27,
+ "species": "SPECIES_CROAGUNK"
+ }
+ ]
+ },
+ {
+ "index": 417,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 32,
+ "species": "SPECIES_GOLBAT"
+ },
+ {
+ "difficulty": 30,
+ "level": 36,
+ "species": "SPECIES_CROAGUNK"
+ }
+ ]
+ },
+ {
+ "index": 418,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 34,
+ "species": "SPECIES_CROAGUNK"
+ },
+ {
+ "difficulty": 30,
+ "level": 31,
+ "species": "SPECIES_DUSTOX"
+ },
+ {
+ "difficulty": 30,
+ "level": 31,
+ "species": "SPECIES_BEAUTIFLY"
+ }
+ ]
+ },
+ {
+ "index": 419,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 33,
+ "species": "SPECIES_GLAMEOW"
+ }
+ ]
+ },
+ {
+ "index": 420,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 32,
+ "species": "SPECIES_STUNKY"
+ },
+ {
+ "difficulty": 30,
+ "level": 32,
+ "species": "SPECIES_GLAMEOW"
+ }
+ ]
+ },
+ {
+ "index": 421,
+ "type": 0,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 14,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 30,
+ "level": 14,
+ "species": "SPECIES_GLAMEOW"
+ }
+ ]
+ },
+ {
+ "index": 422,
+ "type": 1,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 15,
+ "species": "SPECIES_SILCOON",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_HARDEN",
+ "MOVE_POISON_STING"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 423,
+ "type": 1,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 12,
+ "species": "SPECIES_WURMPLE",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_STRING_SHOT",
+ "MOVE_POISON_STING"
+ ]
+ },
+ {
+ "difficulty": 30,
+ "level": 12,
+ "species": "SPECIES_SILCOON",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_HARDEN",
+ "MOVE_POISON_STING"
+ ]
+ },
+ {
+ "difficulty": 30,
+ "level": 12,
+ "species": "SPECIES_ZUBAT",
+ "moves": [
+ "MOVE_LEECH_LIFE",
+ "MOVE_ASTONISH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 424,
+ "type": 0,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 425,
+ "type": 0,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 33,
+ "species": "SPECIES_GLAMEOW"
+ },
+ {
+ "difficulty": 30,
+ "level": 33,
+ "species": "SPECIES_CROAGUNK"
+ }
+ ]
+ },
+ {
+ "index": 426,
+ "type": 1,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 32,
+ "species": "SPECIES_SILCOON",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_HARDEN",
+ "MOVE_POISON_STING"
+ ]
+ },
+ {
+ "difficulty": 30,
+ "level": 32,
+ "species": "SPECIES_GOLBAT",
+ "moves": [
+ "MOVE_AIR_CUTTER",
+ "MOVE_WING_ATTACK",
+ "MOVE_BITE",
+ "MOVE_SUPERSONIC"
+ ]
+ },
+ {
+ "difficulty": 30,
+ "level": 32,
+ "species": "SPECIES_GLAMEOW",
+ "moves": [
+ "MOVE_FURY_SWIPES",
+ "MOVE_FEINT_ATTACK",
+ "MOVE_GROWL",
+ "MOVE_FAKE_OUT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 427,
+ "type": 0,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 31,
+ "species": "SPECIES_BEAUTIFLY"
+ },
+ {
+ "difficulty": 30,
+ "level": 33,
+ "species": "SPECIES_GLAMEOW"
+ }
+ ]
+ },
+ {
+ "index": 428,
+ "type": 0,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 37,
+ "species": "SPECIES_GLAMEOW"
+ }
+ ]
+ },
+ {
+ "index": 429,
+ "type": 0,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 430,
+ "type": 0,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 36,
+ "species": "SPECIES_GOLBAT"
+ },
+ {
+ "difficulty": 30,
+ "level": 34,
+ "species": "SPECIES_SILCOON"
+ }
+ ]
+ },
+ {
+ "index": 431,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 16,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 16,
+ "species": "SPECIES_ZUBAT"
+ }
+ ]
+ },
+ {
+ "index": 432,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 433,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 434,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 435,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 436,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 437,
+ "type": 0,
+ "class": 85,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 438,
+ "type": 0,
+ "class": 85,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 439,
+ "type": 0,
+ "class": 85,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 440,
+ "type": 0,
+ "class": 85,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 441,
+ "type": 0,
+ "class": 48,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 442,
+ "type": 0,
+ "class": 48,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 30,
+ "species": "SPECIES_BRONZOR"
+ }
+ ]
+ },
+ {
+ "index": 443,
+ "type": 0,
+ "class": 48,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_BRONZOR"
+ }
+ ]
+ },
+ {
+ "index": 444,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 49,
+ "species": "SPECIES_MACHAMP"
+ }
+ ]
+ },
+ {
+ "index": 445,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 35,
+ "species": "SPECIES_CROAGUNK"
+ }
+ ]
+ },
+ {
+ "index": 446,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 52,
+ "species": "SPECIES_MACHOKE"
+ },
+ {
+ "difficulty": 30,
+ "level": 58,
+ "species": "SPECIES_MACHAMP"
+ }
+ ]
+ },
+ {
+ "index": 447,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 54,
+ "species": "SPECIES_ONIX"
+ },
+ {
+ "difficulty": 30,
+ "level": 56,
+ "species": "SPECIES_MACHAMP"
+ }
+ ]
+ },
+ {
+ "index": 448,
+ "type": 0,
+ "class": 35,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 449,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 450,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_BUNEARY"
+ }
+ ]
+ },
+ {
+ "index": 451,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_ONIX"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_ONIX"
+ }
+ ]
+ },
+ {
+ "index": 452,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_ONIX"
+ },
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_GOLBAT"
+ }
+ ]
+ },
+ {
+ "index": 453,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 30,
+ "species": "SPECIES_GRAVELER"
+ },
+ {
+ "difficulty": 0,
+ "level": 32,
+ "species": "SPECIES_MACHOKE"
+ }
+ ]
+ },
+ {
+ "index": 454,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_MACHOP"
+ }
+ ]
+ },
+ {
+ "index": 455,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_ONIX"
+ }
+ ]
+ },
+ {
+ "index": 456,
+ "type": 1,
+ "class": 5,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 14,
+ "species": "SPECIES_PIPLUP",
+ "moves": [
+ "MOVE_BUBBLE",
+ "MOVE_PECK"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 457,
+ "type": 1,
+ "class": 5,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_STARAVIA",
+ "moves": [
+ "MOVE_AERIAL_ACE",
+ "MOVE_ENDEAVOR",
+ "MOVE_QUICK_ATTACK"
+ ]
+ },
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_CHERRIM",
+ "moves": [
+ "MOVE_SOLAR_BEAM",
+ "MOVE_MAGICAL_LEAF",
+ "MOVE_LEECH_SEED",
+ "MOVE_SUNNY_DAY"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 458,
+ "type": 1,
+ "class": 5,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_SILCOON",
+ "moves": [
+ "MOVE_POISON_STING",
+ "MOVE_TACKLE"
+ ]
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_BEAUTIFLY",
+ "moves": [
+ "MOVE_GUST",
+ "MOVE_POISON_STING",
+ "MOVE_ABSORB"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 459,
+ "type": 1,
+ "class": 5,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_MEDITITE",
+ "moves": [
+ "MOVE_CONFUSION",
+ "MOVE_BIDE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 460,
+ "type": 0,
+ "class": 58,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_MR_MIME"
+ }
+ ]
+ },
+ {
+ "index": 461,
+ "type": 0,
+ "class": 58,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 462,
+ "type": 0,
+ "class": 58,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 463,
+ "type": 0,
+ "class": 58,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 464,
+ "type": 0,
+ "class": 58,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 465,
+ "type": 0,
+ "class": 22,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_PIKACHU"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_PIKACHU"
+ }
+ ]
+ },
+ {
+ "index": 466,
+ "type": 0,
+ "class": 38,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 467,
+ "type": 0,
+ "class": 32,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 468,
+ "type": 0,
+ "class": 32,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 469,
+ "type": 0,
+ "class": 33,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 470,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 19,
+ "species": "SPECIES_STARLY",
+ "moves": [
+ "MOVE_WING_ATTACK",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_ENDEAVOR",
+ "MOVE_DOUBLE_TEAM"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 20,
+ "species": "SPECIES_BUIZEL",
+ "moves": [
+ "MOVE_WATER_GUN",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_PURSUIT",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 20,
+ "species": "SPECIES_PONYTA",
+ "moves": [
+ "MOVE_EMBER",
+ "MOVE_TACKLE",
+ "MOVE_TAIL_WHIP",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 21,
+ "species": "SPECIES_GROTLE",
+ "moves": [
+ "MOVE_RAZOR_LEAF",
+ "MOVE_TACKLE",
+ "MOVE_ABSORB",
+ "MOVE_WITHDRAW"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 471,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 19,
+ "species": "SPECIES_STARLY",
+ "moves": [
+ "MOVE_WING_ATTACK",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_ENDEAVOR",
+ "MOVE_DOUBLE_TEAM"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 20,
+ "species": "SPECIES_BUIZEL",
+ "moves": [
+ "MOVE_WATER_GUN",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_PURSUIT",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 20,
+ "species": "SPECIES_ROSELIA",
+ "moves": [
+ "MOVE_MEGA_DRAIN",
+ "MOVE_POISON_STING",
+ "MOVE_LEECH_SEED",
+ "MOVE_STUN_SPORE"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 21,
+ "species": "SPECIES_MONFERNO",
+ "moves": [
+ "MOVE_FLAME_WHEEL",
+ "MOVE_MACH_PUNCH",
+ "MOVE_FURY_SWIPES",
+ "MOVE_LEER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 472,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 19,
+ "species": "SPECIES_STARLY",
+ "moves": [
+ "MOVE_WING_ATTACK",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_ENDEAVOR",
+ "MOVE_DOUBLE_TEAM"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 20,
+ "species": "SPECIES_ROSELIA",
+ "moves": [
+ "MOVE_MEGA_DRAIN",
+ "MOVE_POISON_STING",
+ "MOVE_LEECH_SEED",
+ "MOVE_STUN_SPORE"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 20,
+ "species": "SPECIES_PONYTA",
+ "moves": [
+ "MOVE_EMBER",
+ "MOVE_TACKLE",
+ "MOVE_TAIL_WHIP",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 21,
+ "species": "SPECIES_PRINPLUP",
+ "moves": [
+ "MOVE_BUBBLE",
+ "MOVE_PECK",
+ "MOVE_METAL_CLAW",
+ "MOVE_GROWL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 473,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 80,
+ "level": 26,
+ "species": "SPECIES_STARLY",
+ "moves": [
+ "MOVE_WING_ATTACK",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_ENDEAVOR",
+ "MOVE_DOUBLE_TEAM"
+ ]
+ },
+ {
+ "difficulty": 80,
+ "level": 25,
+ "species": "SPECIES_BUIZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_PURSUIT",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 80,
+ "level": 25,
+ "species": "SPECIES_PONYTA",
+ "moves": [
+ "MOVE_EMBER",
+ "MOVE_STOMP",
+ "MOVE_TAIL_WHIP",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 80,
+ "level": 28,
+ "species": "SPECIES_GROTLE",
+ "moves": [
+ "MOVE_RAZOR_LEAF",
+ "MOVE_BITE",
+ "MOVE_MEGA_DRAIN",
+ "MOVE_WITHDRAW"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 474,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 80,
+ "level": 26,
+ "species": "SPECIES_STARLY",
+ "moves": [
+ "MOVE_WING_ATTACK",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_ENDEAVOR",
+ "MOVE_DOUBLE_TEAM"
+ ]
+ },
+ {
+ "difficulty": 80,
+ "level": 25,
+ "species": "SPECIES_BUIZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_PURSUIT",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 80,
+ "level": 25,
+ "species": "SPECIES_ROSELIA",
+ "moves": [
+ "MOVE_MEGA_DRAIN",
+ "MOVE_POISON_STING",
+ "MOVE_LEECH_SEED",
+ "MOVE_MAGICAL_LEAF"
+ ]
+ },
+ {
+ "difficulty": 80,
+ "level": 28,
+ "species": "SPECIES_MONFERNO",
+ "moves": [
+ "MOVE_FLAME_WHEEL",
+ "MOVE_MACH_PUNCH",
+ "MOVE_FURY_SWIPES",
+ "MOVE_LEER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 475,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 80,
+ "level": 26,
+ "species": "SPECIES_STARLY",
+ "moves": [
+ "MOVE_WING_ATTACK",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_ENDEAVOR",
+ "MOVE_DOUBLE_TEAM"
+ ]
+ },
+ {
+ "difficulty": 80,
+ "level": 25,
+ "species": "SPECIES_ROSELIA",
+ "moves": [
+ "MOVE_MEGA_DRAIN",
+ "MOVE_POISON_STING",
+ "MOVE_LEECH_SEED",
+ "MOVE_MAGICAL_LEAF"
+ ]
+ },
+ {
+ "difficulty": 80,
+ "level": 25,
+ "species": "SPECIES_PONYTA",
+ "moves": [
+ "MOVE_EMBER",
+ "MOVE_STOMP",
+ "MOVE_TAIL_WHIP",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 80,
+ "level": 28,
+ "species": "SPECIES_PRINPLUP",
+ "moves": [
+ "MOVE_BUBBLE_BEAM",
+ "MOVE_PECK",
+ "MOVE_METAL_CLAW",
+ "MOVE_GROWL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 476,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 31,
+ "species": "SPECIES_STARAVIA",
+ "moves": [
+ "MOVE_AERIAL_ACE",
+ "MOVE_TAKE_DOWN",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_DOUBLE_TEAM"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 32,
+ "species": "SPECIES_BUIZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_PURSUIT",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_SWIFT"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 30,
+ "species": "SPECIES_HERACROSS",
+ "moves": [
+ "MOVE_BRICK_BREAK",
+ "MOVE_AERIAL_ACE",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_HORN_ATTACK"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 32,
+ "species": "SPECIES_PONYTA",
+ "moves": [
+ "MOVE_FIRE_SPIN",
+ "MOVE_TAKE_DOWN",
+ "MOVE_STOMP",
+ "MOVE_TAIL_WHIP"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 35,
+ "species": "SPECIES_GROTLE",
+ "moves": [
+ "MOVE_RAZOR_LEAF",
+ "MOVE_BITE",
+ "MOVE_MEGA_DRAIN",
+ "MOVE_LEECH_SEED"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 477,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 31,
+ "species": "SPECIES_STARAVIA",
+ "moves": [
+ "MOVE_AERIAL_ACE",
+ "MOVE_TAKE_DOWN",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_DOUBLE_TEAM"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 32,
+ "species": "SPECIES_BUIZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_PURSUIT",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_SWIFT"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 30,
+ "species": "SPECIES_HERACROSS",
+ "moves": [
+ "MOVE_BRICK_BREAK",
+ "MOVE_AERIAL_ACE",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_HORN_ATTACK"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 32,
+ "species": "SPECIES_ROSELIA",
+ "moves": [
+ "MOVE_GIGA_DRAIN",
+ "MOVE_TOXIC_SPIKES",
+ "MOVE_LEECH_SEED",
+ "MOVE_GRASS_WHISTLE"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 35,
+ "species": "SPECIES_MONFERNO",
+ "moves": [
+ "MOVE_BRICK_BREAK",
+ "MOVE_FLAME_WHEEL",
+ "MOVE_MACH_PUNCH",
+ "MOVE_AERIAL_ACE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 478,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 31,
+ "species": "SPECIES_STARAVIA",
+ "moves": [
+ "MOVE_AERIAL_ACE",
+ "MOVE_TAKE_DOWN",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_DOUBLE_TEAM"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 32,
+ "species": "SPECIES_ROSELIA",
+ "moves": [
+ "MOVE_GIGA_DRAIN",
+ "MOVE_TOXIC_SPIKES",
+ "MOVE_LEECH_SEED",
+ "MOVE_GRASS_WHISTLE"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 30,
+ "species": "SPECIES_HERACROSS",
+ "moves": [
+ "MOVE_BRICK_BREAK",
+ "MOVE_AERIAL_ACE",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_HORN_ATTACK"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 32,
+ "species": "SPECIES_PONYTA",
+ "moves": [
+ "MOVE_FIRE_SPIN",
+ "MOVE_TAKE_DOWN",
+ "MOVE_STOMP",
+ "MOVE_TAIL_WHIP"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 35,
+ "species": "SPECIES_PRINPLUP",
+ "moves": [
+ "MOVE_BUBBLE_BEAM",
+ "MOVE_AERIAL_ACE",
+ "MOVE_METAL_CLAW",
+ "MOVE_FURY_ATTACK"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 479,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 200,
+ "level": 48,
+ "species": "SPECIES_STARAPTOR",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_AERIAL_ACE",
+ "MOVE_STEEL_WING",
+ "MOVE_U_TURN"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 49,
+ "species": "SPECIES_FLOATZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_CRUNCH",
+ "MOVE_ICE_FANG",
+ "MOVE_BRICK_BREAK"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 50,
+ "species": "SPECIES_HERACROSS",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_ROCK_SLIDE",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_AERIAL_ACE"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 49,
+ "species": "SPECIES_RAPIDASH",
+ "moves": [
+ "MOVE_FIRE_BLAST",
+ "MOVE_SUNNY_DAY",
+ "MOVE_BOUNCE",
+ "MOVE_WILL_O_WISP"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 51,
+ "species": "SPECIES_SNORLAX",
+ "moves": [
+ "MOVE_BODY_SLAM",
+ "MOVE_CRUNCH",
+ "MOVE_EARTHQUAKE",
+ "MOVE_REST"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 53,
+ "species": "SPECIES_TORTERRA",
+ "moves": [
+ "MOVE_LEAF_STORM",
+ "MOVE_EARTHQUAKE",
+ "MOVE_CRUNCH",
+ "MOVE_SYNTHESIS"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 480,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 200,
+ "level": 48,
+ "species": "SPECIES_STARAPTOR",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_AERIAL_ACE",
+ "MOVE_STEEL_WING",
+ "MOVE_U_TURN"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 49,
+ "species": "SPECIES_FLOATZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_CRUNCH",
+ "MOVE_ICE_FANG",
+ "MOVE_BRICK_BREAK"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 50,
+ "species": "SPECIES_HERACROSS",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_ROCK_SLIDE",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_AERIAL_ACE"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 49,
+ "species": "SPECIES_ROSERADE",
+ "moves": [
+ "MOVE_POISON_JAB",
+ "MOVE_GIGA_DRAIN",
+ "MOVE_SHADOW_BALL",
+ "MOVE_GRASS_WHISTLE"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 51,
+ "species": "SPECIES_SNORLAX",
+ "moves": [
+ "MOVE_BODY_SLAM",
+ "MOVE_CRUNCH",
+ "MOVE_EARTHQUAKE",
+ "MOVE_REST"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 53,
+ "species": "SPECIES_INFERNAPE",
+ "moves": [
+ "MOVE_FLAMETHROWER",
+ "MOVE_FOCUS_BLAST",
+ "MOVE_SHADOW_CLAW",
+ "MOVE_AERIAL_ACE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 481,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 200,
+ "level": 48,
+ "species": "SPECIES_STARAPTOR",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_AERIAL_ACE",
+ "MOVE_STEEL_WING",
+ "MOVE_U_TURN"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 49,
+ "species": "SPECIES_ROSERADE",
+ "moves": [
+ "MOVE_POISON_JAB",
+ "MOVE_GIGA_DRAIN",
+ "MOVE_SHADOW_BALL",
+ "MOVE_GRASS_WHISTLE"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 50,
+ "species": "SPECIES_HERACROSS",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_ROCK_SLIDE",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_AERIAL_ACE"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 49,
+ "species": "SPECIES_RAPIDASH",
+ "moves": [
+ "MOVE_FIRE_BLAST",
+ "MOVE_SUNNY_DAY",
+ "MOVE_BOUNCE",
+ "MOVE_WILL_O_WISP"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 51,
+ "species": "SPECIES_SNORLAX",
+ "moves": [
+ "MOVE_BODY_SLAM",
+ "MOVE_CRUNCH",
+ "MOVE_EARTHQUAKE",
+ "MOVE_REST"
+ ]
+ },
+ {
+ "difficulty": 200,
+ "level": 53,
+ "species": "SPECIES_EMPOLEON",
+ "moves": [
+ "MOVE_BRINE",
+ "MOVE_AERIAL_ACE",
+ "MOVE_METAL_CLAW",
+ "MOVE_SHADOW_CLAW"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 482,
+ "type": 0,
+ "class": 46,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_PELIPPER"
+ },
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_MACHOKE"
+ },
+ {
+ "difficulty": 0,
+ "level": 44,
+ "species": "SPECIES_GASTRODON"
+ }
+ ]
+ },
+ {
+ "index": 483,
+ "type": 1,
+ "class": 46,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 24,
+ "species": "SPECIES_SHELLOS",
+ "moves": [
+ "MOVE_WATER_PULSE",
+ "MOVE_MUD_BOMB",
+ "MOVE_RAIN_DANCE"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 24,
+ "species": "SPECIES_WINGULL",
+ "moves": [
+ "MOVE_WATER_PULSE",
+ "MOVE_WING_ATTACK",
+ "MOVE_SUPERSONIC"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 24,
+ "species": "SPECIES_SHELLOS",
+ "moves": [
+ "MOVE_WATER_PULSE",
+ "MOVE_MUD_BOMB",
+ "MOVE_RAIN_DANCE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 484,
+ "type": 0,
+ "class": 60,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 485,
+ "type": 0,
+ "class": 61,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 486,
+ "type": 1,
+ "class": 41,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_ABRA",
+ "moves": [
+ "MOVE_HIDDEN_POWER"
+ ]
+ },
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_CONFUSION",
+ "MOVE_DISABLE",
+ "MOVE_KINESIS",
+ "MOVE_THUNDER_PUNCH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 487,
+ "type": 0,
+ "class": 41,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 488,
+ "type": 0,
+ "class": 28,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 26,
+ "species": "SPECIES_GEODUDE"
+ }
+ ]
+ },
+ {
+ "index": 489,
+ "type": 0,
+ "class": 28,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 25,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 25,
+ "species": "SPECIES_SKORUPI"
+ }
+ ]
+ },
+ {
+ "index": 490,
+ "type": 0,
+ "class": 28,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 27,
+ "species": "SPECIES_STUNKY"
+ }
+ ]
+ },
+ {
+ "index": 491,
+ "type": 0,
+ "class": 36,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 25,
+ "species": "SPECIES_WORMADAM"
+ }
+ ]
+ },
+ {
+ "index": 492,
+ "type": 0,
+ "class": 36,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 43,
+ "species": "SPECIES_LOPUNNY"
+ }
+ ]
+ },
+ {
+ "index": 493,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 494,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_BUIZEL"
+ }
+ ]
+ },
+ {
+ "index": 495,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 496,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 13,
+ "species": "SPECIES_BIDOOF"
+ },
+ {
+ "difficulty": 0,
+ "level": 14,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_AIPOM"
+ }
+ ]
+ },
+ {
+ "index": 497,
+ "type": 1,
+ "class": 44,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 26,
+ "species": "SPECIES_BUIZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_SONIC_BOOM",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_PURSUIT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 498,
+ "type": 1,
+ "class": 45,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 24,
+ "species": "SPECIES_AZURILL",
+ "moves": [
+ "MOVE_WATER_GUN",
+ "MOVE_SLAM",
+ "MOVE_CHARM"
+ ]
+ },
+ {
+ "difficulty": 10,
+ "level": 24,
+ "species": "SPECIES_MARILL",
+ "moves": [
+ "MOVE_BUBBLE_BEAM",
+ "MOVE_ROLLOUT",
+ "MOVE_DEFENSE_CURL",
+ "MOVE_AQUA_RING"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 499,
+ "type": 1,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 54,
+ "species": "SPECIES_KRICKETUNE",
+ "moves": [
+ "MOVE_X_SCISSOR",
+ "MOVE_BRICK_BREAK",
+ "MOVE_AERIAL_ACE",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 54,
+ "species": "SPECIES_QUAGSIRE",
+ "moves": [
+ "MOVE_MUDDY_WATER",
+ "MOVE_EARTHQUAKE",
+ "MOVE_YAWN",
+ "MOVE_SLAM"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 54,
+ "species": "SPECIES_GENGAR",
+ "moves": [
+ "MOVE_SHADOW_BALL",
+ "MOVE_DREAM_EATER",
+ "MOVE_HYPNOSIS",
+ "MOVE_CONFUSE_RAY"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 500,
+ "type": 1,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 54,
+ "species": "SPECIES_PURUGLY",
+ "moves": [
+ "MOVE_SLASH",
+ "MOVE_PAYBACK",
+ "MOVE_ATTRACT",
+ "MOVE_FAKE_OUT"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 54,
+ "species": "SPECIES_GRAVELER",
+ "moves": [
+ "MOVE_EARTHQUAKE",
+ "MOVE_STONE_EDGE",
+ "MOVE_DOUBLE_EDGE",
+ "MOVE_BRICK_BREAK"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 54,
+ "species": "SPECIES_GOLBAT",
+ "moves": [
+ "MOVE_AIR_SLASH",
+ "MOVE_POISON_FANG",
+ "MOVE_PLUCK",
+ "MOVE_CONFUSE_RAY"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 501,
+ "type": 0,
+ "class": 81,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 502,
+ "type": 0,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 503,
+ "type": 0,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_ONIX"
+ },
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_GRAVELER"
+ }
+ ]
+ },
+ {
+ "index": 504,
+ "type": 0,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 33,
+ "species": "SPECIES_GRAVELER"
+ }
+ ]
+ },
+ {
+ "index": 505,
+ "type": 0,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_ONIX"
+ },
+ {
+ "difficulty": 0,
+ "level": 33,
+ "species": "SPECIES_STEELIX"
+ }
+ ]
+ },
+ {
+ "index": 506,
+ "type": 0,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 27,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_GRAVELER"
+ },
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_ONIX"
+ }
+ ]
+ },
+ {
+ "index": 507,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 37,
+ "species": "SPECIES_GOLBAT"
+ }
+ ]
+ },
+ {
+ "index": 508,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 35,
+ "species": "SPECIES_DUSTOX"
+ },
+ {
+ "difficulty": 30,
+ "level": 35,
+ "species": "SPECIES_BRONZOR"
+ }
+ ]
+ },
+ {
+ "index": 509,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 37,
+ "species": "SPECIES_STUNKY"
+ }
+ ]
+ },
+ {
+ "index": 510,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 32,
+ "species": "SPECIES_WURMPLE"
+ },
+ {
+ "difficulty": 30,
+ "level": 34,
+ "species": "SPECIES_CASCOON"
+ },
+ {
+ "difficulty": 30,
+ "level": 36,
+ "species": "SPECIES_DUSTOX"
+ }
+ ]
+ },
+ {
+ "index": 511,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 512,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 36,
+ "species": "SPECIES_BRONZOR"
+ },
+ {
+ "difficulty": 30,
+ "level": 36,
+ "species": "SPECIES_STUNKY"
+ }
+ ]
+ },
+ {
+ "index": 513,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 36,
+ "species": "SPECIES_GOLBAT"
+ },
+ {
+ "difficulty": 30,
+ "level": 36,
+ "species": "SPECIES_GOLBAT"
+ }
+ ]
+ },
+ {
+ "index": 514,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 36,
+ "species": "SPECIES_STUNKY"
+ },
+ {
+ "difficulty": 30,
+ "level": 36,
+ "species": "SPECIES_CROAGUNK"
+ }
+ ]
+ },
+ {
+ "index": 515,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 39,
+ "species": "SPECIES_BRONZOR"
+ }
+ ]
+ },
+ {
+ "index": 516,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 35,
+ "species": "SPECIES_DUSTOX"
+ },
+ {
+ "difficulty": 30,
+ "level": 38,
+ "species": "SPECIES_GOLBAT"
+ },
+ {
+ "difficulty": 30,
+ "level": 35,
+ "species": "SPECIES_DUSTOX"
+ }
+ ]
+ },
+ {
+ "index": 517,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 38,
+ "species": "SPECIES_STUNKY"
+ },
+ {
+ "difficulty": 30,
+ "level": 38,
+ "species": "SPECIES_GOLBAT"
+ }
+ ]
+ },
+ {
+ "index": 518,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 35,
+ "species": "SPECIES_CROAGUNK"
+ },
+ {
+ "difficulty": 30,
+ "level": 38,
+ "species": "SPECIES_STUNKY"
+ },
+ {
+ "difficulty": 30,
+ "level": 38,
+ "species": "SPECIES_CROAGUNK"
+ }
+ ]
+ },
+ {
+ "index": 519,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 40,
+ "species": "SPECIES_GOLBAT"
+ }
+ ]
+ },
+ {
+ "index": 520,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 37,
+ "species": "SPECIES_BRONZOR"
+ },
+ {
+ "difficulty": 30,
+ "level": 37,
+ "species": "SPECIES_GOLBAT"
+ }
+ ]
+ },
+ {
+ "index": 521,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 38,
+ "species": "SPECIES_DUSTOX"
+ },
+ {
+ "difficulty": 30,
+ "level": 38,
+ "species": "SPECIES_CROAGUNK"
+ }
+ ]
+ },
+ {
+ "index": 522,
+ "type": 0,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 35,
+ "species": "SPECIES_CROAGUNK"
+ },
+ {
+ "difficulty": 30,
+ "level": 35,
+ "species": "SPECIES_STUNKY"
+ },
+ {
+ "difficulty": 30,
+ "level": 35,
+ "species": "SPECIES_GLAMEOW"
+ }
+ ]
+ },
+ {
+ "index": 523,
+ "type": 0,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 40,
+ "species": "SPECIES_BEAUTIFLY"
+ }
+ ]
+ },
+ {
+ "index": 524,
+ "type": 0,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 34,
+ "species": "SPECIES_WURMPLE"
+ },
+ {
+ "difficulty": 30,
+ "level": 36,
+ "species": "SPECIES_SILCOON"
+ },
+ {
+ "difficulty": 30,
+ "level": 38,
+ "species": "SPECIES_BEAUTIFLY"
+ }
+ ]
+ },
+ {
+ "index": 525,
+ "type": 0,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 38,
+ "species": "SPECIES_BRONZOR"
+ },
+ {
+ "difficulty": 30,
+ "level": 38,
+ "species": "SPECIES_GLAMEOW"
+ }
+ ]
+ },
+ {
+ "index": 526,
+ "type": 0,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 37,
+ "species": "SPECIES_GOLBAT"
+ },
+ {
+ "difficulty": 30,
+ "level": 37,
+ "species": "SPECIES_GLAMEOW"
+ },
+ {
+ "difficulty": 30,
+ "level": 37,
+ "species": "SPECIES_BRONZOR"
+ }
+ ]
+ },
+ {
+ "index": 527,
+ "type": 0,
+ "class": 89,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 38,
+ "species": "SPECIES_STUNKY"
+ },
+ {
+ "difficulty": 30,
+ "level": 38,
+ "species": "SPECIES_GLAMEOW"
+ }
+ ]
+ },
+ {
+ "index": 528,
+ "type": 3,
+ "class": 72,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 41,
+ "species": "SPECIES_BRONZOR",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_GYRO_BALL",
+ "MOVE_EXTRASENSORY",
+ "MOVE_LIGHT_SCREEN",
+ "MOVE_CONFUSE_RAY"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 42,
+ "species": "SPECIES_GOLBAT",
+ "item": "ITEM_NONE",
+ "moves": [
+ "MOVE_AIR_CUTTER",
+ "MOVE_BITE",
+ "MOVE_POISON_FANG",
+ "MOVE_CONFUSE_RAY"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 45,
+ "species": "SPECIES_PURUGLY",
+ "item": "ITEM_SITRUS_BERRY",
+ "moves": [
+ "MOVE_SLASH",
+ "MOVE_SHADOW_CLAW",
+ "MOVE_AERIAL_ACE",
+ "MOVE_HYPNOSIS"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 529,
+ "type": 0,
+ "class": 57,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_CLEFFA"
+ }
+ ]
+ },
+ {
+ "index": 530,
+ "type": 0,
+ "class": 20,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_PICHU"
+ },
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_PICHU"
+ },
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_PIKACHU"
+ }
+ ]
+ },
+ {
+ "index": 531,
+ "type": 0,
+ "class": 21,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_BONSLY"
+ }
+ ]
+ },
+ {
+ "index": 532,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 16,
+ "species": "SPECIES_STUNKY"
+ },
+ {
+ "difficulty": 0,
+ "level": 16,
+ "species": "SPECIES_KRICKETUNE"
+ },
+ {
+ "difficulty": 0,
+ "level": 16,
+ "species": "SPECIES_SHELLOS"
+ }
+ ]
+ },
+ {
+ "index": 533,
+ "type": 0,
+ "class": 70,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_PONYTA"
+ },
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_BUIZEL"
+ }
+ ]
+ },
+ {
+ "index": 534,
+ "type": 0,
+ "class": 23,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_MURKROW"
+ },
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_MISDREAVUS"
+ }
+ ]
+ },
+ {
+ "index": 535,
+ "type": 0,
+ "class": 7,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_ROSELIA"
+ }
+ ]
+ },
+ {
+ "index": 536,
+ "type": 0,
+ "class": 15,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_MR_MIME"
+ }
+ ]
+ },
+ {
+ "index": 537,
+ "type": 0,
+ "class": 17,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_STUNKY"
+ },
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_BUIZEL"
+ }
+ ]
+ },
+ {
+ "index": 538,
+ "type": 0,
+ "class": 83,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_LUXIO"
+ },
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_PIKACHU"
+ }
+ ]
+ },
+ {
+ "index": 539,
+ "type": 0,
+ "class": 37,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 20,
+ "species": "SPECIES_CLEFAIRY"
+ },
+ {
+ "difficulty": 0,
+ "level": 20,
+ "species": "SPECIES_CLEFAIRY"
+ },
+ {
+ "difficulty": 0,
+ "level": 20,
+ "species": "SPECIES_CLEFAIRY"
+ }
+ ]
+ },
+ {
+ "index": 540,
+ "type": 0,
+ "class": 21,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_MARILL"
+ },
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_AIPOM"
+ }
+ ]
+ },
+ {
+ "index": 541,
+ "type": 1,
+ "class": 51,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 22,
+ "species": "SPECIES_GOLDEEN",
+ "moves": [
+ "MOVE_HORN_DRILL",
+ "MOVE_FLAIL"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 22,
+ "species": "SPECIES_GOLDEEN",
+ "moves": [
+ "MOVE_HORN_DRILL",
+ "MOVE_FLAIL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 542,
+ "type": 0,
+ "class": 34,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_STARLY"
+ },
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_HOOTHOOT"
+ }
+ ]
+ },
+ {
+ "index": 543,
+ "type": 0,
+ "class": 35,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 22,
+ "species": "SPECIES_LOPUNNY"
+ },
+ {
+ "difficulty": 0,
+ "level": 20,
+ "species": "SPECIES_GLAMEOW"
+ }
+ ]
+ },
+ {
+ "index": 544,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_BIDOOF"
+ },
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_BIDOOF"
+ }
+ ]
+ },
+ {
+ "index": 545,
+ "type": 0,
+ "class": 32,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_SUDOWOODO"
+ }
+ ]
+ },
+ {
+ "index": 546,
+ "type": 0,
+ "class": 33,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_BONSLY"
+ },
+ {
+ "difficulty": 0,
+ "level": 21,
+ "species": "SPECIES_PICHU"
+ }
+ ]
+ },
+ {
+ "index": 547,
+ "type": 0,
+ "class": 84,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_MURKROW"
+ }
+ ]
+ },
+ {
+ "index": 548,
+ "type": 1,
+ "class": 60,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_WOOPER",
+ "moves": [
+ "MOVE_MUD_BOMB",
+ "MOVE_SLAM",
+ "MOVE_WATER_GUN",
+ "MOVE_AMNESIA"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 549,
+ "type": 0,
+ "class": 41,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_KADABRA"
+ }
+ ]
+ },
+ {
+ "index": 550,
+ "type": 0,
+ "class": 36,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_FINNEON"
+ }
+ ]
+ },
+ {
+ "index": 551,
+ "type": 0,
+ "class": 36,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_PSYDUCK"
+ }
+ ]
+ },
+ {
+ "index": 552,
+ "type": 1,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 23,
+ "species": "SPECIES_MACHOP",
+ "moves": [
+ "MOVE_SEISMIC_TOSS",
+ "MOVE_LOW_KICK",
+ "MOVE_FORESIGHT"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 23,
+ "species": "SPECIES_BRONZOR",
+ "moves": [
+ "MOVE_EXTRASENSORY",
+ "MOVE_TACKLE",
+ "MOVE_CONFUSE_RAY"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 553,
+ "type": 0,
+ "class": 48,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 16,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_GEODUDE"
+ },
+ {
+ "difficulty": 0,
+ "level": 18,
+ "species": "SPECIES_BRONZOR"
+ }
+ ]
+ },
+ {
+ "index": 554,
+ "type": 0,
+ "class": 30,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 52,
+ "species": "SPECIES_FARFETCHD"
+ },
+ {
+ "difficulty": 0,
+ "level": 54,
+ "species": "SPECIES_SWELLOW"
+ }
+ ]
+ },
+ {
+ "index": 555,
+ "type": 0,
+ "class": 30,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_GOLBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 57,
+ "species": "SPECIES_XATU"
+ }
+ ]
+ },
+ {
+ "index": 556,
+ "type": 0,
+ "class": 30,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_DODRIO"
+ },
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_FEAROW"
+ },
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_HONCHKROW"
+ }
+ ]
+ },
+ {
+ "index": 557,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 53,
+ "species": "SPECIES_DRATINI"
+ },
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_DRAGONAIR"
+ }
+ ]
+ },
+ {
+ "index": 558,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 559,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 58,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 560,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 56,
+ "species": "SPECIES_SEADRA"
+ },
+ {
+ "difficulty": 50,
+ "level": 56,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 561,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_VIBRAVA"
+ },
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_SEADRA"
+ },
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_DRAGONAIR"
+ }
+ ]
+ },
+ {
+ "index": 562,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_BAGON"
+ },
+ {
+ "difficulty": 50,
+ "level": 59,
+ "species": "SPECIES_SHELGON"
+ }
+ ]
+ },
+ {
+ "index": 563,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 53,
+ "species": "SPECIES_LICKITUNG",
+ "moves": [
+ "MOVE_POWER_WHIP",
+ "MOVE_SLAM",
+ "MOVE_DISABLE",
+ "MOVE_KNOCK_OFF"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 53,
+ "species": "SPECIES_MILTANK",
+ "moves": [
+ "MOVE_ZEN_HEADBUTT",
+ "MOVE_BODY_SLAM",
+ "MOVE_CAPTIVATE",
+ "MOVE_MILK_DRINK"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 564,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_TAUROS",
+ "moves": [
+ "MOVE_THRASH",
+ "MOVE_ZEN_HEADBUTT",
+ "MOVE_SWAGGER",
+ "MOVE_PAYBACK"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 565,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_GOLDUCK",
+ "moves": [
+ "MOVE_HYDRO_PUMP",
+ "MOVE_BRICK_BREAK",
+ "MOVE_ZEN_HEADBUTT",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_SANDSLASH",
+ "moves": [
+ "MOVE_EARTHQUAKE",
+ "MOVE_CRUSH_CLAW",
+ "MOVE_POISON_JAB",
+ "MOVE_SAND_TOMB"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 566,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_DUSCLOPS",
+ "moves": [
+ "MOVE_SHADOW_SNEAK",
+ "MOVE_PAYBACK",
+ "MOVE_CURSE",
+ "MOVE_WILL_O_WISP"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_SALAMENCE",
+ "moves": [
+ "MOVE_DRAGON_CLAW",
+ "MOVE_AERIAL_ACE",
+ "MOVE_ZEN_HEADBUTT",
+ "MOVE_CRUNCH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 567,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 53,
+ "species": "SPECIES_PINSIR",
+ "moves": [
+ "MOVE_SUPERPOWER",
+ "MOVE_X_SCISSOR",
+ "MOVE_SWORDS_DANCE",
+ "MOVE_ROCK_TOMB"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 53,
+ "species": "SPECIES_MIGHTYENA",
+ "moves": [
+ "MOVE_CRUNCH",
+ "MOVE_SUCKER_PUNCH",
+ "MOVE_SCARY_FACE",
+ "MOVE_EMBARGO"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 568,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 56,
+ "species": "SPECIES_SKARMORY",
+ "moves": [
+ "MOVE_AIR_SLASH",
+ "MOVE_SLASH",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_STEEL_WING"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 569,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_PRIMEAPE",
+ "moves": [
+ "MOVE_CROSS_CHOP",
+ "MOVE_PUNISHMENT",
+ "MOVE_U_TURN",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_TORKOAL",
+ "moves": [
+ "MOVE_HEAT_WAVE",
+ "MOVE_SMOKESCREEN",
+ "MOVE_IRON_DEFENSE",
+ "MOVE_AMNESIA"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 570,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_LARVITAR",
+ "moves": [
+ "MOVE_HYPER_BEAM",
+ "MOVE_STONE_EDGE",
+ "MOVE_EARTHQUAKE",
+ "MOVE_CRUNCH"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_MAGCARGO",
+ "moves": [
+ "MOVE_EARTH_POWER",
+ "MOVE_FLAMETHROWER",
+ "MOVE_AMNESIA",
+ "MOVE_RECOVER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 571,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_LOUDRED",
+ "moves": [
+ "MOVE_HYPER_VOICE",
+ "MOVE_BITE",
+ "MOVE_SUPERSONIC",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_RAMPARDOS",
+ "moves": [
+ "MOVE_HEAD_SMASH",
+ "MOVE_ZEN_HEADBUTT",
+ "MOVE_ANCIENT_POWER",
+ "MOVE_SCREECH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 572,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 59,
+ "species": "SPECIES_AERODACTYL",
+ "moves": [
+ "MOVE_STONE_EDGE",
+ "MOVE_IRON_HEAD",
+ "MOVE_AERIAL_ACE",
+ "MOVE_CRUNCH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 573,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 53,
+ "species": "SPECIES_FLAAFFY",
+ "moves": [
+ "MOVE_DISCHARGE",
+ "MOVE_POWER_GEM",
+ "MOVE_SIGNAL_BEAM",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 53,
+ "species": "SPECIES_TROPIUS",
+ "moves": [
+ "MOVE_SOLAR_BEAM",
+ "MOVE_AIR_SLASH",
+ "MOVE_SYNTHESIS",
+ "MOVE_SUNNY_DAY"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 574,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_AMBIPOM",
+ "moves": [
+ "MOVE_DOUBLE_HIT",
+ "MOVE_ASTONISH",
+ "MOVE_AGILITY",
+ "MOVE_BATON_PASS"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_RAPIDASH",
+ "moves": [
+ "MOVE_BOUNCE",
+ "MOVE_FIRE_BLAST",
+ "MOVE_STOMP",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_CHANSEY",
+ "moves": [
+ "MOVE_DOUBLE_EDGE",
+ "MOVE_MINIMIZE",
+ "MOVE_DEFENSE_CURL",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 575,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_MIGHTYENA",
+ "moves": [
+ "MOVE_CRUNCH",
+ "MOVE_SUCKER_PUNCH",
+ "MOVE_IRON_TAIL",
+ "MOVE_SCARY_FACE"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_KIRLIA",
+ "moves": [
+ "MOVE_PSYCHIC",
+ "MOVE_MAGICAL_LEAF",
+ "MOVE_SHOCK_WAVE",
+ "MOVE_SHADOW_BALL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 576,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 56,
+ "species": "SPECIES_MEOWTH",
+ "moves": [
+ "MOVE_NIGHT_SLASH",
+ "MOVE_BITE",
+ "MOVE_TAUNT",
+ "MOVE_FAKE_OUT"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 56,
+ "species": "SPECIES_PERSIAN",
+ "moves": [
+ "MOVE_NIGHT_SLASH",
+ "MOVE_POWER_GEM",
+ "MOVE_FEINT_ATTACK",
+ "MOVE_FAKE_OUT"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 56,
+ "species": "SPECIES_HYPNO",
+ "moves": [
+ "MOVE_PSYCHIC",
+ "MOVE_ZEN_HEADBUTT",
+ "MOVE_HYPNOSIS",
+ "MOVE_DISABLE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 577,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_DELCATTY",
+ "moves": [
+ "MOVE_DOUBLE_EDGE",
+ "MOVE_COPYCAT",
+ "MOVE_FEINT_ATTACK",
+ "MOVE_CHARM"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_YANMA",
+ "moves": [
+ "MOVE_BUG_BUZZ",
+ "MOVE_AIR_SLASH",
+ "MOVE_U_TURN",
+ "MOVE_QUICK_ATTACK"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 578,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_GRANBULL",
+ "moves": [
+ "MOVE_CRUNCH",
+ "MOVE_PAYBACK",
+ "MOVE_TAKE_DOWN",
+ "MOVE_SCARY_FACE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 579,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 58,
+ "species": "SPECIES_STANTLER",
+ "moves": [
+ "MOVE_ME_FIRST",
+ "MOVE_ZEN_HEADBUTT",
+ "MOVE_STOMP",
+ "MOVE_CONFUSE_RAY"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 58,
+ "species": "SPECIES_CARNIVINE",
+ "moves": [
+ "MOVE_POWER_WHIP",
+ "MOVE_WRING_OUT",
+ "MOVE_CRUNCH",
+ "MOVE_BIND"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 580,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 59,
+ "species": "SPECIES_DRAPION",
+ "moves": [
+ "MOVE_CROSS_POISON",
+ "MOVE_CRUNCH",
+ "MOVE_X_SCISSOR",
+ "MOVE_AERIAL_ACE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 581,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 56,
+ "species": "SPECIES_DUNSPARCE",
+ "moves": [
+ "MOVE_ENDEAVOR",
+ "MOVE_ANCIENT_POWER",
+ "MOVE_SCREECH",
+ "MOVE_YAWN"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 56,
+ "species": "SPECIES_SCYTHER",
+ "moves": [
+ "MOVE_X_SCISSOR",
+ "MOVE_AIR_SLASH",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_DOUBLE_HIT"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 56,
+ "species": "SPECIES_MAROWAK",
+ "moves": [
+ "MOVE_EARTHQUAKE",
+ "MOVE_DOUBLE_EDGE",
+ "MOVE_ROCK_SLIDE",
+ "MOVE_LEER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 582,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_KANGASKHAN",
+ "moves": [
+ "MOVE_DIZZY_PUNCH",
+ "MOVE_CRUNCH",
+ "MOVE_ENDURE",
+ "MOVE_REVERSAL"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_URSARING",
+ "moves": [
+ "MOVE_SLASH",
+ "MOVE_BRICK_BREAK",
+ "MOVE_AERIAL_ACE",
+ "MOVE_SCARY_FACE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 583,
+ "type": 0,
+ "class": 49,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_SHUPPET"
+ },
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_DUSKULL"
+ }
+ ]
+ },
+ {
+ "index": 584,
+ "type": 0,
+ "class": 49,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 54,
+ "species": "SPECIES_BALTOY"
+ },
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_GRUMPIG"
+ }
+ ]
+ },
+ {
+ "index": 585,
+ "type": 0,
+ "class": 50,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 51,
+ "species": "SPECIES_SLOWPOKE"
+ },
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_SLOWBRO"
+ }
+ ]
+ },
+ {
+ "index": 586,
+ "type": 0,
+ "class": 50,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 56,
+ "species": "SPECIES_XATU"
+ },
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_MISMAGIUS"
+ }
+ ]
+ },
+ {
+ "index": 587,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 54,
+ "species": "SPECIES_MANKEY"
+ },
+ {
+ "difficulty": 30,
+ "level": 53,
+ "species": "SPECIES_MAKUHITA"
+ },
+ {
+ "difficulty": 30,
+ "level": 55,
+ "species": "SPECIES_HARIYAMA"
+ }
+ ]
+ },
+ {
+ "index": 588,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 57,
+ "species": "SPECIES_CACTURNE"
+ },
+ {
+ "difficulty": 30,
+ "level": 57,
+ "species": "SPECIES_MACHAMP"
+ }
+ ]
+ },
+ {
+ "index": 589,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 53,
+ "species": "SPECIES_TYROGUE"
+ },
+ {
+ "difficulty": 30,
+ "level": 57,
+ "species": "SPECIES_MAROWAK"
+ },
+ {
+ "difficulty": 30,
+ "level": 58,
+ "species": "SPECIES_BRELOOM"
+ }
+ ]
+ },
+ {
+ "index": 590,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 59,
+ "species": "SPECIES_MACHAMP"
+ }
+ ]
+ },
+ {
+ "index": 591,
+ "type": 0,
+ "class": 39,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 52,
+ "species": "SPECIES_EXEGGCUTE"
+ },
+ {
+ "difficulty": 50,
+ "level": 58,
+ "species": "SPECIES_URSARING"
+ }
+ ]
+ },
+ {
+ "index": 592,
+ "type": 0,
+ "class": 39,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_SPINDA"
+ },
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_KECLEON"
+ }
+ ]
+ },
+ {
+ "index": 593,
+ "type": 0,
+ "class": 39,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_DONPHAN"
+ }
+ ]
+ },
+ {
+ "index": 594,
+ "type": 0,
+ "class": 40,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 50,
+ "species": "SPECIES_ZIGZAGOON"
+ },
+ {
+ "difficulty": 50,
+ "level": 56,
+ "species": "SPECIES_SKARMORY"
+ }
+ ]
+ },
+ {
+ "index": 595,
+ "type": 0,
+ "class": 40,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_LICKITUNG"
+ },
+ {
+ "difficulty": 50,
+ "level": 57,
+ "species": "SPECIES_VIGOROTH"
+ }
+ ]
+ },
+ {
+ "index": 596,
+ "type": 0,
+ "class": 40,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_TRAPINCH"
+ },
+ {
+ "difficulty": 50,
+ "level": 56,
+ "species": "SPECIES_VIBRAVA"
+ }
+ ]
+ },
+ {
+ "index": 597,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 51,
+ "species": "SPECIES_SEEL"
+ },
+ {
+ "difficulty": 0,
+ "level": 51,
+ "species": "SPECIES_STARMIE"
+ }
+ ]
+ },
+ {
+ "index": 598,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_CRAWDAUNT"
+ }
+ ]
+ },
+ {
+ "index": 599,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 51,
+ "species": "SPECIES_CHINCHOU"
+ },
+ {
+ "difficulty": 0,
+ "level": 51,
+ "species": "SPECIES_LANTURN"
+ }
+ ]
+ },
+ {
+ "index": 600,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 51,
+ "species": "SPECIES_CARVANHA"
+ },
+ {
+ "difficulty": 0,
+ "level": 51,
+ "species": "SPECIES_CARVANHA"
+ },
+ {
+ "difficulty": 0,
+ "level": 54,
+ "species": "SPECIES_SHARPEDO"
+ }
+ ]
+ },
+ {
+ "index": 601,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 50,
+ "species": "SPECIES_LUVDISC"
+ },
+ {
+ "difficulty": 0,
+ "level": 54,
+ "species": "SPECIES_LAPRAS"
+ }
+ ]
+ },
+ {
+ "index": 602,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 50,
+ "species": "SPECIES_MANTYKE"
+ },
+ {
+ "difficulty": 0,
+ "level": 52,
+ "species": "SPECIES_MANTINE"
+ }
+ ]
+ },
+ {
+ "index": 603,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 50,
+ "species": "SPECIES_SEEL"
+ },
+ {
+ "difficulty": 0,
+ "level": 54,
+ "species": "SPECIES_DEWGONG"
+ }
+ ]
+ },
+ {
+ "index": 604,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 52,
+ "species": "SPECIES_BIBAREL"
+ },
+ {
+ "difficulty": 0,
+ "level": 52,
+ "species": "SPECIES_AZUMARILL"
+ },
+ {
+ "difficulty": 0,
+ "level": 52,
+ "species": "SPECIES_SEALEO"
+ }
+ ]
+ },
+ {
+ "index": 605,
+ "type": 0,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 606,
+ "type": 1,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 56,
+ "species": "SPECIES_LOUDRED",
+ "moves": [
+ "MOVE_HYPER_VOICE",
+ "MOVE_BITE",
+ "MOVE_SCREECH",
+ "MOVE_UPROAR"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 56,
+ "species": "SPECIES_DONPHAN",
+ "moves": [
+ "MOVE_EARTHQUAKE",
+ "MOVE_SLAM",
+ "MOVE_SCARY_FACE",
+ "MOVE_ROCK_TOMB"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 56,
+ "species": "SPECIES_TAUROS",
+ "moves": [
+ "MOVE_GIGA_IMPACT",
+ "MOVE_ZEN_HEADBUTT",
+ "MOVE_PURSUIT",
+ "MOVE_ROCK_SLIDE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 607,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 150,
+ "level": 40,
+ "species": "SPECIES_MUNCHLAX",
+ "moves": [
+ "MOVE_BODY_SLAM",
+ "MOVE_STOCKPILE",
+ "MOVE_SWALLOW",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 40,
+ "species": "SPECIES_STARAPTOR",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_AERIAL_ACE",
+ "MOVE_TAKE_DOWN",
+ "MOVE_QUICK_ATTACK"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 41,
+ "species": "SPECIES_BUIZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_PURSUIT",
+ "MOVE_BRICK_BREAK",
+ "MOVE_IRON_TAIL"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 42,
+ "species": "SPECIES_HERACROSS",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_BRICK_BREAK",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_AERIAL_ACE"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 41,
+ "species": "SPECIES_PONYTA",
+ "moves": [
+ "MOVE_FIRE_BLAST",
+ "MOVE_WILL_O_WISP",
+ "MOVE_STOMP",
+ "MOVE_TAKE_DOWN"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 43,
+ "species": "SPECIES_TORTERRA",
+ "moves": [
+ "MOVE_GIGA_DRAIN",
+ "MOVE_BITE",
+ "MOVE_LEECH_SEED",
+ "MOVE_SYNTHESIS"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 608,
+ "type": 1,
+ "class": 90,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 15,
+ "species": "SPECIES_CHANSEY",
+ "moves": [
+ "MOVE_EGG_BOMB",
+ "MOVE_SOFT_BOILED",
+ "MOVE_REFRESH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 609,
+ "type": 1,
+ "class": 91,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 34,
+ "species": "SPECIES_LUCARIO",
+ "moves": [
+ "MOVE_METAL_CLAW",
+ "MOVE_FORCE_PALM",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_BONE_RUSH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 610,
+ "type": 1,
+ "class": 92,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 57,
+ "species": "SPECIES_ARCANINE",
+ "moves": [
+ "MOVE_EXTREME_SPEED",
+ "MOVE_FIRE_FANG",
+ "MOVE_HELPING_HAND",
+ "MOVE_AGILITY"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 611,
+ "type": 1,
+ "class": 93,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 58,
+ "species": "SPECIES_CLAYDOL",
+ "moves": [
+ "MOVE_PSYCHIC",
+ "MOVE_ANCIENT_POWER",
+ "MOVE_LIGHT_SCREEN",
+ "MOVE_REFLECT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 612,
+ "type": 1,
+ "class": 94,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 18,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_CONFUSION",
+ "MOVE_SHOCK_WAVE",
+ "MOVE_FLASH",
+ "MOVE_KINESIS"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 613,
+ "type": 1,
+ "class": 95,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 13,
+ "species": "SPECIES_TURTWIG",
+ "moves": [
+ "MOVE_ABSORB",
+ "MOVE_TACKLE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 614,
+ "type": 1,
+ "class": 95,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 13,
+ "species": "SPECIES_CHIMCHAR",
+ "moves": [
+ "MOVE_EMBER",
+ "MOVE_SCRATCH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 615,
+ "type": 1,
+ "class": 95,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 13,
+ "species": "SPECIES_PIPLUP",
+ "moves": [
+ "MOVE_BUBBLE",
+ "MOVE_POUND"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 616,
+ "type": 1,
+ "class": 96,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 13,
+ "species": "SPECIES_TURTWIG",
+ "moves": [
+ "MOVE_ABSORB",
+ "MOVE_TACKLE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 617,
+ "type": 1,
+ "class": 96,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 13,
+ "species": "SPECIES_CHIMCHAR",
+ "moves": [
+ "MOVE_EMBER",
+ "MOVE_SCRATCH"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 618,
+ "type": 1,
+ "class": 96,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 13,
+ "species": "SPECIES_PIPLUP",
+ "moves": [
+ "MOVE_BUBBLE",
+ "MOVE_POUND"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 619,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 150,
+ "level": 40,
+ "species": "SPECIES_MUNCHLAX",
+ "moves": [
+ "MOVE_BODY_SLAM",
+ "MOVE_STOCKPILE",
+ "MOVE_SWALLOW",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 40,
+ "species": "SPECIES_STARAPTOR",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_AERIAL_ACE",
+ "MOVE_TAKE_DOWN",
+ "MOVE_QUICK_ATTACK"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 41,
+ "species": "SPECIES_BUIZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_PURSUIT",
+ "MOVE_BRICK_BREAK",
+ "MOVE_IRON_TAIL"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 42,
+ "species": "SPECIES_HERACROSS",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_BRICK_BREAK",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_AERIAL_ACE"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 41,
+ "species": "SPECIES_ROSELIA",
+ "moves": [
+ "MOVE_GIGA_DRAIN",
+ "MOVE_TOXIC",
+ "MOVE_INGRAIN",
+ "MOVE_GRASS_WHISTLE"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 43,
+ "species": "SPECIES_INFERNAPE",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_PUNISHMENT",
+ "MOVE_FLAME_WHEEL",
+ "MOVE_WILL_O_WISP"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 620,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 150,
+ "level": 40,
+ "species": "SPECIES_MUNCHLAX",
+ "moves": [
+ "MOVE_BODY_SLAM",
+ "MOVE_STOCKPILE",
+ "MOVE_SWALLOW",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 40,
+ "species": "SPECIES_STARAPTOR",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_AERIAL_ACE",
+ "MOVE_TAKE_DOWN",
+ "MOVE_QUICK_ATTACK"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 41,
+ "species": "SPECIES_ROSELIA",
+ "moves": [
+ "MOVE_GIGA_DRAIN",
+ "MOVE_TOXIC",
+ "MOVE_INGRAIN",
+ "MOVE_GRASS_WHISTLE"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 42,
+ "species": "SPECIES_HERACROSS",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_BRICK_BREAK",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_AERIAL_ACE"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 41,
+ "species": "SPECIES_PONYTA",
+ "moves": [
+ "MOVE_FIRE_BLAST",
+ "MOVE_WILL_O_WISP",
+ "MOVE_STOMP",
+ "MOVE_TAKE_DOWN"
+ ]
+ },
+ {
+ "difficulty": 150,
+ "level": 43,
+ "species": "SPECIES_EMPOLEON",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_AERIAL_ACE",
+ "MOVE_METAL_CLAW",
+ "MOVE_SWAGGER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 621,
+ "type": 1,
+ "class": 95,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 25,
+ "species": "SPECIES_CLEFAIRY",
+ "moves": [
+ "MOVE_METRONOME",
+ "MOVE_GRAVITY",
+ "MOVE_WAKE_UP_SLAP",
+ "MOVE_SING"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 25,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_PSYCHO_CUT",
+ "MOVE_REFLECT",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 28,
+ "species": "SPECIES_PRINPLUP",
+ "moves": [
+ "MOVE_BUBBLE_BEAM",
+ "MOVE_METAL_CLAW",
+ "MOVE_PECK",
+ "MOVE_GROWL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 622,
+ "type": 1,
+ "class": 95,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 25,
+ "species": "SPECIES_CLEFAIRY",
+ "moves": [
+ "MOVE_METRONOME",
+ "MOVE_GRAVITY",
+ "MOVE_WAKE_UP_SLAP",
+ "MOVE_SING"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 25,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_PSYCHO_CUT",
+ "MOVE_REFLECT",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 28,
+ "species": "SPECIES_GROTLE",
+ "moves": [
+ "MOVE_RAZOR_LEAF",
+ "MOVE_MEGA_DRAIN",
+ "MOVE_BITE",
+ "MOVE_CURSE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 623,
+ "type": 1,
+ "class": 95,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 25,
+ "species": "SPECIES_CLEFAIRY",
+ "moves": [
+ "MOVE_METRONOME",
+ "MOVE_GRAVITY",
+ "MOVE_WAKE_UP_SLAP",
+ "MOVE_SING"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 25,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_PSYCHO_CUT",
+ "MOVE_REFLECT",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 28,
+ "species": "SPECIES_MONFERNO",
+ "moves": [
+ "MOVE_FLAME_WHEEL",
+ "MOVE_MACH_PUNCH",
+ "MOVE_FURY_SWIPES",
+ "MOVE_TORMENT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 624,
+ "type": 1,
+ "class": 96,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 25,
+ "species": "SPECIES_CLEFAIRY",
+ "moves": [
+ "MOVE_METRONOME",
+ "MOVE_GRAVITY",
+ "MOVE_WAKE_UP_SLAP",
+ "MOVE_SING"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 25,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_PSYCHO_CUT",
+ "MOVE_REFLECT",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 28,
+ "species": "SPECIES_PRINPLUP",
+ "moves": [
+ "MOVE_BUBBLE_BEAM",
+ "MOVE_METAL_CLAW",
+ "MOVE_PECK",
+ "MOVE_GROWL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 625,
+ "type": 1,
+ "class": 96,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 25,
+ "species": "SPECIES_CLEFAIRY",
+ "moves": [
+ "MOVE_METRONOME",
+ "MOVE_GRAVITY",
+ "MOVE_WAKE_UP_SLAP",
+ "MOVE_SING"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 25,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_PSYCHO_CUT",
+ "MOVE_REFLECT",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 28,
+ "species": "SPECIES_GROTLE",
+ "moves": [
+ "MOVE_RAZOR_LEAF",
+ "MOVE_MEGA_DRAIN",
+ "MOVE_BITE",
+ "MOVE_CURSE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 626,
+ "type": 1,
+ "class": 96,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 60,
+ "level": 25,
+ "species": "SPECIES_CLEFAIRY",
+ "moves": [
+ "MOVE_METRONOME",
+ "MOVE_GRAVITY",
+ "MOVE_WAKE_UP_SLAP",
+ "MOVE_SING"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 25,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_PSYCHO_CUT",
+ "MOVE_REFLECT",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ },
+ {
+ "difficulty": 60,
+ "level": 28,
+ "species": "SPECIES_MONFERNO",
+ "moves": [
+ "MOVE_FLAME_WHEEL",
+ "MOVE_MACH_PUNCH",
+ "MOVE_FURY_SWIPES",
+ "MOVE_TORMENT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 627,
+ "type": 0,
+ "class": 7,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_BUDEW"
+ }
+ ]
+ },
+ {
+ "index": 628,
+ "type": 0,
+ "class": 7,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_ROSELIA"
+ }
+ ]
+ },
+ {
+ "index": 629,
+ "type": 0,
+ "class": 7,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_ROSELIA"
+ }
+ ]
+ },
+ {
+ "index": 630,
+ "type": 0,
+ "class": 15,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_MR_MIME"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_SUDOWOODO"
+ }
+ ]
+ },
+ {
+ "index": 631,
+ "type": 0,
+ "class": 15,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 37,
+ "species": "SPECIES_MR_MIME"
+ },
+ {
+ "difficulty": 0,
+ "level": 39,
+ "species": "SPECIES_SUDOWOODO"
+ }
+ ]
+ },
+ {
+ "index": 632,
+ "type": 0,
+ "class": 15,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 57,
+ "species": "SPECIES_MR_MIME"
+ },
+ {
+ "difficulty": 0,
+ "level": 59,
+ "species": "SPECIES_SUDOWOODO"
+ }
+ ]
+ },
+ {
+ "index": 633,
+ "type": 0,
+ "class": 10,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 31,
+ "species": "SPECIES_MEDITITE"
+ },
+ {
+ "difficulty": 30,
+ "level": 33,
+ "species": "SPECIES_MACHOP"
+ }
+ ]
+ },
+ {
+ "index": 634,
+ "type": 0,
+ "class": 10,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 38,
+ "species": "SPECIES_MEDICHAM"
+ },
+ {
+ "difficulty": 30,
+ "level": 40,
+ "species": "SPECIES_MACHOKE"
+ }
+ ]
+ },
+ {
+ "index": 635,
+ "type": 0,
+ "class": 10,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 58,
+ "species": "SPECIES_MEDICHAM"
+ },
+ {
+ "difficulty": 30,
+ "level": 60,
+ "species": "SPECIES_MACHAMP"
+ }
+ ]
+ },
+ {
+ "index": 636,
+ "type": 0,
+ "class": 30,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 38,
+ "species": "SPECIES_NOCTOWL"
+ },
+ {
+ "difficulty": 50,
+ "level": 42,
+ "species": "SPECIES_NOCTOWL"
+ }
+ ]
+ },
+ {
+ "index": 637,
+ "type": 0,
+ "class": 30,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_NOCTOWL"
+ },
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_NOCTOWL"
+ }
+ ]
+ },
+ {
+ "index": 638,
+ "type": 0,
+ "class": 30,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 59,
+ "species": "SPECIES_FARFETCHD"
+ },
+ {
+ "difficulty": 0,
+ "level": 59,
+ "species": "SPECIES_SWELLOW"
+ }
+ ]
+ },
+ {
+ "index": 639,
+ "type": 0,
+ "class": 16,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 27,
+ "species": "SPECIES_SUDOWOODO"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_ROSELIA"
+ },
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_PIKACHU"
+ }
+ ]
+ },
+ {
+ "index": 640,
+ "type": 0,
+ "class": 16,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 37,
+ "species": "SPECIES_SUDOWOODO"
+ },
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_ROSELIA"
+ },
+ {
+ "difficulty": 0,
+ "level": 36,
+ "species": "SPECIES_PIKACHU"
+ }
+ ]
+ },
+ {
+ "index": 641,
+ "type": 0,
+ "class": 16,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 52,
+ "species": "SPECIES_SUDOWOODO"
+ },
+ {
+ "difficulty": 0,
+ "level": 51,
+ "species": "SPECIES_ROSELIA"
+ },
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_RAICHU"
+ }
+ ]
+ },
+ {
+ "index": 642,
+ "type": 0,
+ "class": 17,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_MIME_JR"
+ },
+ {
+ "difficulty": 0,
+ "level": 27,
+ "species": "SPECIES_ROSELIA"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_CLEFAIRY"
+ }
+ ]
+ },
+ {
+ "index": 643,
+ "type": 0,
+ "class": 17,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 37,
+ "species": "SPECIES_MR_MIME"
+ },
+ {
+ "difficulty": 0,
+ "level": 36,
+ "species": "SPECIES_ROSELIA"
+ },
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_CLEFAIRY"
+ }
+ ]
+ },
+ {
+ "index": 644,
+ "type": 0,
+ "class": 17,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 52,
+ "species": "SPECIES_MR_MIME"
+ },
+ {
+ "difficulty": 0,
+ "level": 51,
+ "species": "SPECIES_ROSELIA"
+ },
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_CLEFABLE"
+ }
+ ]
+ },
+ {
+ "index": 645,
+ "type": 1,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_GEODUDE",
+ "moves": [
+ "MOVE_MAGNITUDE",
+ "MOVE_ROCK_THROW",
+ "MOVE_ROCK_POLISH",
+ "MOVE_DEFENSE_CURL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 646,
+ "type": 1,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_GRAVELER",
+ "moves": [
+ "MOVE_ROCK_BLAST",
+ "MOVE_MAGNITUDE",
+ "MOVE_ROCK_POLISH",
+ "MOVE_DEFENSE_CURL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 647,
+ "type": 1,
+ "class": 4,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_GRAVELER",
+ "moves": [
+ "MOVE_EARTHQUAKE",
+ "MOVE_ROCK_SLIDE",
+ "MOVE_BRICK_BREAK",
+ "MOVE_SANDSTORM"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 648,
+ "type": 1,
+ "class": 53,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_RAICHU",
+ "moves": [
+ "MOVE_THUNDER",
+ "MOVE_RAIN_DANCE",
+ "MOVE_SLAM",
+ "MOVE_THUNDER_WAVE"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_PELIPPER",
+ "moves": [
+ "MOVE_AIR_SLASH",
+ "MOVE_WATER_PULSE",
+ "MOVE_SUPERSONIC",
+ "MOVE_QUICK_ATTACK"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_HIPPOPOTAS",
+ "moves": [
+ "MOVE_EARTHQUAKE",
+ "MOVE_DOUBLE_EDGE",
+ "MOVE_CRUNCH",
+ "MOVE_SAND_TOMB"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 649,
+ "type": 1,
+ "class": 54,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_ROSELIA",
+ "moves": [
+ "MOVE_GIGA_DRAIN",
+ "MOVE_TOXIC",
+ "MOVE_INGRAIN",
+ "MOVE_DOUBLE_TEAM"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_SEAKING",
+ "moves": [
+ "MOVE_MEGAHORN",
+ "MOVE_HORN_DRILL",
+ "MOVE_WATER_PULSE",
+ "MOVE_POISON_JAB"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 650,
+ "type": 0,
+ "class": 37,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 51,
+ "species": "SPECIES_HIPPOPOTAS"
+ },
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_HIPPOPOTAS"
+ },
+ {
+ "difficulty": 0,
+ "level": 52,
+ "species": "SPECIES_HIPPOPOTAS"
+ }
+ ]
+ },
+ {
+ "index": 651,
+ "type": 0,
+ "class": 18,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 652,
+ "type": 0,
+ "class": 18,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 653,
+ "type": 0,
+ "class": 12,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_STARAVIA"
+ },
+ {
+ "difficulty": 0,
+ "level": 30,
+ "species": "SPECIES_STARAVIA"
+ }
+ ]
+ },
+ {
+ "index": 654,
+ "type": 0,
+ "class": 12,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 37,
+ "species": "SPECIES_STARAVIA"
+ },
+ {
+ "difficulty": 0,
+ "level": 39,
+ "species": "SPECIES_STARAVIA"
+ }
+ ]
+ },
+ {
+ "index": 655,
+ "type": 0,
+ "class": 12,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_STARAPTOR"
+ },
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_STARAPTOR"
+ }
+ ]
+ },
+ {
+ "index": 656,
+ "type": 0,
+ "class": 13,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_PIKACHU"
+ }
+ ]
+ },
+ {
+ "index": 657,
+ "type": 0,
+ "class": 13,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_PIKACHU"
+ }
+ ]
+ },
+ {
+ "index": 658,
+ "type": 0,
+ "class": 13,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 60,
+ "species": "SPECIES_RAICHU"
+ }
+ ]
+ },
+ {
+ "index": 659,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 43,
+ "species": "SPECIES_GABITE"
+ }
+ ]
+ },
+ {
+ "index": 660,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 63,
+ "species": "SPECIES_GABITE"
+ }
+ ]
+ },
+ {
+ "index": 661,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_ALTARIA"
+ },
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_ALTARIA"
+ }
+ ]
+ },
+ {
+ "index": 662,
+ "type": 0,
+ "class": 29,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 61,
+ "species": "SPECIES_DRAGONAIR"
+ },
+ {
+ "difficulty": 50,
+ "level": 61,
+ "species": "SPECIES_DRAGONAIR"
+ }
+ ]
+ },
+ {
+ "index": 663,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 0,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_STARAVIA",
+ "moves": [
+ "MOVE_BRAVE_BIRD",
+ "MOVE_TAKE_DOWN",
+ "MOVE_STEEL_WING",
+ "MOVE_QUICK_ATTACK"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 55,
+ "species": "SPECIES_GIRAFARIG",
+ "moves": [
+ "MOVE_PSYCHIC",
+ "MOVE_DOUBLE_HIT",
+ "MOVE_CRUNCH",
+ "MOVE_THUNDER_WAVE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 664,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 39,
+ "species": "SPECIES_MONFERNO",
+ "moves": [
+ "MOVE_FIRE_SPIN",
+ "MOVE_MACH_PUNCH",
+ "MOVE_ROCK_TOMB",
+ "MOVE_TORMENT"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 39,
+ "species": "SPECIES_LUXIO",
+ "moves": [
+ "MOVE_THUNDER_FANG",
+ "MOVE_CRUNCH",
+ "MOVE_SCARY_FACE",
+ "MOVE_SWAGGER"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 39,
+ "species": "SPECIES_GYARADOS",
+ "moves": [
+ "MOVE_AQUA_TAIL",
+ "MOVE_ICE_FANG",
+ "MOVE_BITE",
+ "MOVE_LEER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 665,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 59,
+ "species": "SPECIES_MONFERNO",
+ "moves": [
+ "MOVE_FLARE_BLITZ",
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_ROCK_SLIDE",
+ "MOVE_TORMENT"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 59,
+ "species": "SPECIES_LUXIO",
+ "moves": [
+ "MOVE_THUNDER_FANG",
+ "MOVE_CRUNCH",
+ "MOVE_IRON_TAIL",
+ "MOVE_THUNDER_WAVE"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 59,
+ "species": "SPECIES_GYARADOS",
+ "moves": [
+ "MOVE_HYPER_BEAM",
+ "MOVE_AQUA_TAIL",
+ "MOVE_ICE_FANG",
+ "MOVE_EARTHQUAKE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 666,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_LICKITUNG",
+ "moves": [
+ "MOVE_POWER_WHIP",
+ "MOVE_WRING_OUT",
+ "MOVE_SCREECH",
+ "MOVE_ME_FIRST"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_MILTANK",
+ "moves": [
+ "MOVE_DOUBLE_EDGE",
+ "MOVE_ZEN_HEADBUTT",
+ "MOVE_BRICK_BREAK",
+ "MOVE_MILK_DRINK"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 667,
+ "type": 1,
+ "class": 24,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 62,
+ "species": "SPECIES_TAUROS",
+ "moves": [
+ "MOVE_GIGA_IMPACT",
+ "MOVE_ZEN_HEADBUTT",
+ "MOVE_EARTHQUAKE",
+ "MOVE_STONE_EDGE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 668,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_CHERRIM",
+ "moves": [
+ "MOVE_SOLAR_BEAM",
+ "MOVE_TAKE_DOWN",
+ "MOVE_FLASH",
+ "MOVE_SUNNY_DAY"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_MARILL",
+ "moves": [
+ "MOVE_ICE_BEAM",
+ "MOVE_DOUBLE_EDGE",
+ "MOVE_AQUA_TAIL",
+ "MOVE_AQUA_RING"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 54,
+ "species": "SPECIES_LOPUNNY",
+ "moves": [
+ "MOVE_DIZZY_PUNCH",
+ "MOVE_JUMP_KICK",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_BOUNCE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 669,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 40,
+ "species": "SPECIES_GLAMEOW",
+ "moves": [
+ "MOVE_SLASH",
+ "MOVE_FEINT_ATTACK",
+ "MOVE_HYPNOSIS",
+ "MOVE_CAPTIVATE"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 40,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_SHADOW_BALL",
+ "MOVE_DISABLE",
+ "MOVE_MIRACLE_EYE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 670,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_PURUGLY",
+ "moves": [
+ "MOVE_SLASH",
+ "MOVE_FAKE_OUT",
+ "MOVE_HYPNOSIS",
+ "MOVE_DREAM_EATER"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_ALAKAZAM",
+ "moves": [
+ "MOVE_PSYCHIC",
+ "MOVE_SHADOW_BALL",
+ "MOVE_DISABLE",
+ "MOVE_MIRACLE_EYE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 671,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_AMPHAROS",
+ "moves": [
+ "MOVE_DISCHARGE",
+ "MOVE_POWER_GEM",
+ "MOVE_SIGNAL_BEAM",
+ "MOVE_FIRE_PUNCH"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_TROPIUS",
+ "moves": [
+ "MOVE_LEAF_STORM",
+ "MOVE_AIR_SLASH",
+ "MOVE_EARTHQUAKE",
+ "MOVE_SILVER_WIND"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 672,
+ "type": 1,
+ "class": 25,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 59,
+ "species": "SPECIES_AMBIPOM",
+ "moves": [
+ "MOVE_DOUBLE_HIT",
+ "MOVE_IRON_TAIL",
+ "MOVE_U_TURN",
+ "MOVE_SCREECH"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 59,
+ "species": "SPECIES_RAPIDASH",
+ "moves": [
+ "MOVE_FLARE_BLITZ",
+ "MOVE_BOUNCE",
+ "MOVE_POISON_JAB",
+ "MOVE_WILL_O_WISP"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 59,
+ "species": "SPECIES_CHANSEY",
+ "moves": [
+ "MOVE_DOUBLE_EDGE",
+ "MOVE_DEFENSE_CURL",
+ "MOVE_SING",
+ "MOVE_DREAM_EATER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 673,
+ "type": 0,
+ "class": 49,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_HAUNTER"
+ },
+ {
+ "difficulty": 0,
+ "level": 42,
+ "species": "SPECIES_KADABRA"
+ }
+ ]
+ },
+ {
+ "index": 674,
+ "type": 0,
+ "class": 49,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_GENGAR"
+ },
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_ALAKAZAM"
+ }
+ ]
+ },
+ {
+ "index": 675,
+ "type": 0,
+ "class": 49,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 56,
+ "species": "SPECIES_MISDREAVUS"
+ },
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_GENGAR"
+ }
+ ]
+ },
+ {
+ "index": 676,
+ "type": 0,
+ "class": 49,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_BANETTE"
+ },
+ {
+ "difficulty": 0,
+ "level": 60,
+ "species": "SPECIES_DUSCLOPS"
+ }
+ ]
+ },
+ {
+ "index": 677,
+ "type": 0,
+ "class": 50,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 37,
+ "species": "SPECIES_HAUNTER"
+ },
+ {
+ "difficulty": 0,
+ "level": 39,
+ "species": "SPECIES_MISDREAVUS"
+ },
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_KADABRA"
+ }
+ ]
+ },
+ {
+ "index": 678,
+ "type": 0,
+ "class": 50,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_GENGAR"
+ },
+ {
+ "difficulty": 0,
+ "level": 57,
+ "species": "SPECIES_MISDREAVUS"
+ },
+ {
+ "difficulty": 0,
+ "level": 59,
+ "species": "SPECIES_ALAKAZAM"
+ }
+ ]
+ },
+ {
+ "index": 679,
+ "type": 0,
+ "class": 50,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_MEDICHAM"
+ },
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_ALAKAZAM"
+ }
+ ]
+ },
+ {
+ "index": 680,
+ "type": 0,
+ "class": 50,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_SLOWBRO"
+ },
+ {
+ "difficulty": 0,
+ "level": 60,
+ "species": "SPECIES_SLOWBRO"
+ }
+ ]
+ },
+ {
+ "index": 681,
+ "type": 0,
+ "class": 71,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 36,
+ "species": "SPECIES_AMBIPOM"
+ },
+ {
+ "difficulty": 0,
+ "level": 37,
+ "species": "SPECIES_GOLDUCK"
+ },
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_GIRAFARIG"
+ }
+ ]
+ },
+ {
+ "index": 682,
+ "type": 0,
+ "class": 71,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 57,
+ "species": "SPECIES_AMBIPOM"
+ },
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_GOLDUCK"
+ },
+ {
+ "difficulty": 0,
+ "level": 56,
+ "species": "SPECIES_GIRAFARIG"
+ }
+ ]
+ },
+ {
+ "index": 683,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_SEAKING"
+ }
+ ]
+ },
+ {
+ "index": 684,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_SEAKING"
+ }
+ ]
+ },
+ {
+ "index": 685,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_GYARADOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 686,
+ "type": 0,
+ "class": 11,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_GYARADOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_GYARADOS"
+ }
+ ]
+ },
+ {
+ "index": 687,
+ "type": 0,
+ "class": 8,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_PIKACHU"
+ },
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_CLEFAIRY"
+ }
+ ]
+ },
+ {
+ "index": 688,
+ "type": 0,
+ "class": 8,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 60,
+ "species": "SPECIES_RAICHU"
+ },
+ {
+ "difficulty": 0,
+ "level": 60,
+ "species": "SPECIES_CLEFABLE"
+ }
+ ]
+ },
+ {
+ "index": 689,
+ "type": 1,
+ "class": 51,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 36,
+ "species": "SPECIES_GOLDEEN",
+ "moves": [
+ "MOVE_HORN_DRILL",
+ "MOVE_FLAIL"
+ ]
+ },
+ {
+ "difficulty": 30,
+ "level": 37,
+ "species": "SPECIES_SEAKING",
+ "moves": [
+ "MOVE_HORN_DRILL",
+ "MOVE_FLAIL"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 38,
+ "species": "SPECIES_SEAKING",
+ "moves": [
+ "MOVE_HORN_DRILL",
+ "MOVE_FLAIL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 690,
+ "type": 1,
+ "class": 51,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 10,
+ "level": 56,
+ "species": "SPECIES_SEAKING",
+ "moves": [
+ "MOVE_HORN_DRILL",
+ "MOVE_FLAIL"
+ ]
+ },
+ {
+ "difficulty": 30,
+ "level": 57,
+ "species": "SPECIES_SEAKING",
+ "moves": [
+ "MOVE_HORN_DRILL",
+ "MOVE_FLAIL"
+ ]
+ },
+ {
+ "difficulty": 50,
+ "level": 58,
+ "species": "SPECIES_SEAKING",
+ "moves": [
+ "MOVE_HORN_DRILL",
+ "MOVE_FLAIL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 691,
+ "type": 0,
+ "class": 34,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_CHATOT"
+ }
+ ]
+ },
+ {
+ "index": 692,
+ "type": 0,
+ "class": 34,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_CHATOT"
+ }
+ ]
+ },
+ {
+ "index": 693,
+ "type": 0,
+ "class": 34,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 60,
+ "species": "SPECIES_CHATOT"
+ }
+ ]
+ },
+ {
+ "index": 694,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_LUXIO"
+ }
+ ]
+ },
+ {
+ "index": 695,
+ "type": 0,
+ "class": 48,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 41,
+ "species": "SPECIES_BRONZOR"
+ }
+ ]
+ },
+ {
+ "index": 696,
+ "type": 0,
+ "class": 48,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 56,
+ "species": "SPECIES_BRONZOR"
+ }
+ ]
+ },
+ {
+ "index": 697,
+ "type": 0,
+ "class": 19,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 36,
+ "species": "SPECIES_LUXIO"
+ },
+ {
+ "difficulty": 0,
+ "level": 36,
+ "species": "SPECIES_STARAVIA"
+ },
+ {
+ "difficulty": 0,
+ "level": 39,
+ "species": "SPECIES_RAPIDASH"
+ }
+ ]
+ },
+ {
+ "index": 698,
+ "type": 0,
+ "class": 19,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 56,
+ "species": "SPECIES_LUXIO"
+ },
+ {
+ "difficulty": 0,
+ "level": 57,
+ "species": "SPECIES_STARAPTOR"
+ },
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_RAPIDASH"
+ }
+ ]
+ },
+ {
+ "index": 699,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 57,
+ "species": "SPECIES_MACHAMP"
+ }
+ ]
+ },
+ {
+ "index": 700,
+ "type": 0,
+ "class": 14,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 58,
+ "species": "SPECIES_PRIMEAPE"
+ },
+ {
+ "difficulty": 30,
+ "level": 59,
+ "species": "SPECIES_HARIYAMA"
+ },
+ {
+ "difficulty": 30,
+ "level": 60,
+ "species": "SPECIES_HARIYAMA"
+ }
+ ]
+ },
+ {
+ "index": 701,
+ "type": 0,
+ "class": 35,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_ROSELIA"
+ }
+ ]
+ },
+ {
+ "index": 702,
+ "type": 0,
+ "class": 35,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 60,
+ "species": "SPECIES_ROSELIA"
+ }
+ ]
+ },
+ {
+ "index": 703,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_BUDEW"
+ }
+ ]
+ },
+ {
+ "index": 704,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_ROSELIA"
+ }
+ ]
+ },
+ {
+ "index": 705,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_ROSELIA"
+ }
+ ]
+ },
+ {
+ "index": 706,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_STARLY"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_BIDOOF"
+ }
+ ]
+ },
+ {
+ "index": 707,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_STARAVIA"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_BIBAREL"
+ }
+ ]
+ },
+ {
+ "index": 708,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_STARAPTOR"
+ },
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_BIBAREL"
+ }
+ ]
+ },
+ {
+ "index": 709,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_ONIX"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_ONIX"
+ }
+ ]
+ },
+ {
+ "index": 710,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 37,
+ "species": "SPECIES_ONIX"
+ },
+ {
+ "difficulty": 0,
+ "level": 39,
+ "species": "SPECIES_STEELIX"
+ }
+ ]
+ },
+ {
+ "index": 711,
+ "type": 0,
+ "class": 9,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 57,
+ "species": "SPECIES_STEELIX"
+ },
+ {
+ "difficulty": 0,
+ "level": 59,
+ "species": "SPECIES_STEELIX"
+ }
+ ]
+ },
+ {
+ "index": 712,
+ "type": 0,
+ "class": 6,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_KRICKETOT"
+ },
+ {
+ "difficulty": 0,
+ "level": 17,
+ "species": "SPECIES_SILCOON"
+ }
+ ]
+ },
+ {
+ "index": 713,
+ "type": 0,
+ "class": 6,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_KRICKETUNE"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_SILCOON"
+ }
+ ]
+ },
+ {
+ "index": 714,
+ "type": 0,
+ "class": 6,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_KRICKETUNE"
+ },
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_BEAUTIFLY"
+ }
+ ]
+ },
+ {
+ "index": 715,
+ "type": 0,
+ "class": 80,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_GOLDEEN"
+ },
+ {
+ "difficulty": 0,
+ "level": 30,
+ "species": "SPECIES_BUIZEL"
+ }
+ ]
+ },
+ {
+ "index": 716,
+ "type": 0,
+ "class": 80,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_SEAKING"
+ },
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_BUIZEL"
+ }
+ ]
+ },
+ {
+ "index": 717,
+ "type": 0,
+ "class": 80,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_SEAKING"
+ },
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_FLOATZEL"
+ }
+ ]
+ },
+ {
+ "index": 718,
+ "type": 1,
+ "class": 5,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_PIPLUP",
+ "moves": [
+ "MOVE_BUBBLE",
+ "MOVE_PECK",
+ "MOVE_POUND",
+ "MOVE_GROWL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 719,
+ "type": 1,
+ "class": 5,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_PRINPLUP",
+ "moves": [
+ "MOVE_BUBBLE_BEAM",
+ "MOVE_METAL_CLAW",
+ "MOVE_PECK",
+ "MOVE_GROWL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 720,
+ "type": 1,
+ "class": 5,
+ "unk2": 0,
+ "items": [],
+ "unkC": 0,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_EMPOLEON",
+ "moves": [
+ "MOVE_HYDRO_PUMP",
+ "MOVE_DRILL_PECK",
+ "MOVE_METAL_CLAW",
+ "MOVE_GROWL"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 721,
+ "type": 0,
+ "class": 22,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_PIKACHU"
+ }
+ ]
+ },
+ {
+ "index": 722,
+ "type": 0,
+ "class": 22,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_PIKACHU"
+ }
+ ]
+ },
+ {
+ "index": 723,
+ "type": 0,
+ "class": 22,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_PIKACHU"
+ }
+ ]
+ },
+ {
+ "index": 724,
+ "type": 0,
+ "class": 38,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_HOOTHOOT"
+ },
+ {
+ "difficulty": 0,
+ "level": 30,
+ "species": "SPECIES_MACHOKE"
+ }
+ ]
+ },
+ {
+ "index": 725,
+ "type": 0,
+ "class": 38,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_NOCTOWL"
+ },
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_MACHOKE"
+ }
+ ]
+ },
+ {
+ "index": 726,
+ "type": 0,
+ "class": 38,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_NOCTOWL"
+ },
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_MACHAMP"
+ }
+ ]
+ },
+ {
+ "index": 727,
+ "type": 0,
+ "class": 32,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_LUXIO"
+ }
+ ]
+ },
+ {
+ "index": 728,
+ "type": 0,
+ "class": 32,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 60,
+ "species": "SPECIES_LUXIO"
+ }
+ ]
+ },
+ {
+ "index": 729,
+ "type": 0,
+ "class": 33,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_BUNEARY"
+ }
+ ]
+ },
+ {
+ "index": 730,
+ "type": 0,
+ "class": 33,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_LOPUNNY"
+ }
+ ]
+ },
+ {
+ "index": 731,
+ "type": 0,
+ "class": 33,
+ "unk2": 0,
+ "items": [
+ "ITEM_FULL_RESTORE"
+ ],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 60,
+ "species": "SPECIES_LOPUNNY"
+ }
+ ]
+ },
+ {
+ "index": 732,
+ "type": 0,
+ "class": 39,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 31,
+ "species": "SPECIES_LUXIO"
+ },
+ {
+ "difficulty": 50,
+ "level": 31,
+ "species": "SPECIES_BUIZEL"
+ }
+ ]
+ },
+ {
+ "index": 733,
+ "type": 0,
+ "class": 39,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 40,
+ "species": "SPECIES_LUXIO"
+ },
+ {
+ "difficulty": 50,
+ "level": 40,
+ "species": "SPECIES_FLOATZEL"
+ }
+ ]
+ },
+ {
+ "index": 734,
+ "type": 0,
+ "class": 39,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_LUXIO"
+ },
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_FLOATZEL"
+ }
+ ]
+ },
+ {
+ "index": 735,
+ "type": 0,
+ "class": 39,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_EXEGGUTOR"
+ },
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_URSARING"
+ }
+ ]
+ },
+ {
+ "index": 736,
+ "type": 0,
+ "class": 40,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 30,
+ "species": "SPECIES_AIPOM"
+ },
+ {
+ "difficulty": 50,
+ "level": 32,
+ "species": "SPECIES_MARILL"
+ }
+ ]
+ },
+ {
+ "index": 737,
+ "type": 0,
+ "class": 40,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 41,
+ "species": "SPECIES_AIPOM"
+ },
+ {
+ "difficulty": 50,
+ "level": 39,
+ "species": "SPECIES_AZUMARILL"
+ }
+ ]
+ },
+ {
+ "index": 738,
+ "type": 0,
+ "class": 40,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 61,
+ "species": "SPECIES_AMBIPOM"
+ },
+ {
+ "difficulty": 50,
+ "level": 59,
+ "species": "SPECIES_AZUMARILL"
+ }
+ ]
+ },
+ {
+ "index": 739,
+ "type": 0,
+ "class": 40,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_LINOONE"
+ },
+ {
+ "difficulty": 50,
+ "level": 60,
+ "species": "SPECIES_SKARMORY"
+ }
+ ]
+ },
+ {
+ "index": 740,
+ "type": 0,
+ "class": 46,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 54,
+ "species": "SPECIES_MANTINE"
+ },
+ {
+ "difficulty": 0,
+ "level": 52,
+ "species": "SPECIES_PELIPPER"
+ }
+ ]
+ },
+ {
+ "index": 741,
+ "type": 0,
+ "class": 46,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 57,
+ "species": "SPECIES_MANTINE"
+ },
+ {
+ "difficulty": 0,
+ "level": 59,
+ "species": "SPECIES_PELIPPER"
+ }
+ ]
+ },
+ {
+ "index": 742,
+ "type": 0,
+ "class": 46,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_PELIPPER"
+ },
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_MACHAMP"
+ },
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_GASTRODON"
+ }
+ ]
+ },
+ {
+ "index": 743,
+ "type": 0,
+ "class": 41,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 30,
+ "species": "SPECIES_KADABRA"
+ },
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_KADABRA"
+ }
+ ]
+ },
+ {
+ "index": 744,
+ "type": 0,
+ "class": 41,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_KADABRA"
+ },
+ {
+ "difficulty": 0,
+ "level": 36,
+ "species": "SPECIES_KADABRA"
+ }
+ ]
+ },
+ {
+ "index": 745,
+ "type": 0,
+ "class": 41,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_ALAKAZAM"
+ },
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_ALAKAZAM"
+ }
+ ]
+ },
+ {
+ "index": 746,
+ "type": 0,
+ "class": 28,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 26,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_GOLBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_GOLBAT"
+ }
+ ]
+ },
+ {
+ "index": 747,
+ "type": 0,
+ "class": 28,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 36,
+ "species": "SPECIES_GOLBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 37,
+ "species": "SPECIES_GOLBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 38,
+ "species": "SPECIES_GOLBAT"
+ }
+ ]
+ },
+ {
+ "index": 748,
+ "type": 0,
+ "class": 28,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 51,
+ "species": "SPECIES_GOLBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 52,
+ "species": "SPECIES_CROBAT"
+ },
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_CROBAT"
+ }
+ ]
+ },
+ {
+ "index": 749,
+ "type": 0,
+ "class": 36,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_GLAMEOW"
+ }
+ ]
+ },
+ {
+ "index": 750,
+ "type": 0,
+ "class": 36,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 60,
+ "species": "SPECIES_PURUGLY"
+ }
+ ]
+ },
+ {
+ "index": 751,
+ "type": 0,
+ "class": 55,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_SNEASEL"
+ }
+ ]
+ },
+ {
+ "index": 752,
+ "type": 0,
+ "class": 55,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_SNEASEL"
+ }
+ ]
+ },
+ {
+ "index": 753,
+ "type": 0,
+ "class": 55,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 37,
+ "species": "SPECIES_MANTINE"
+ },
+ {
+ "difficulty": 0,
+ "level": 39,
+ "species": "SPECIES_SNEASEL"
+ }
+ ]
+ },
+ {
+ "index": 754,
+ "type": 0,
+ "class": 55,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_MANTINE"
+ },
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_SNEASEL"
+ }
+ ]
+ },
+ {
+ "index": 755,
+ "type": 0,
+ "class": 56,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_STARAVIA"
+ }
+ ]
+ },
+ {
+ "index": 756,
+ "type": 0,
+ "class": 56,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_STARAPTOR"
+ }
+ ]
+ },
+ {
+ "index": 757,
+ "type": 0,
+ "class": 56,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_SNOVER"
+ }
+ ]
+ },
+ {
+ "index": 758,
+ "type": 0,
+ "class": 56,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_SNOVER"
+ }
+ ]
+ },
+ {
+ "index": 759,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_FLOATZEL"
+ },
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_TENTACRUEL"
+ }
+ ]
+ },
+ {
+ "index": 760,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_TENTACOOL"
+ },
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_GOLDUCK"
+ }
+ ]
+ },
+ {
+ "index": 761,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_DEWGONG"
+ },
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_STARMIE"
+ }
+ ]
+ },
+ {
+ "index": 762,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 60,
+ "species": "SPECIES_LUMINEON"
+ }
+ ]
+ },
+ {
+ "index": 763,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_PELIPPER"
+ },
+ {
+ "difficulty": 0,
+ "level": 58,
+ "species": "SPECIES_SEAKING"
+ }
+ ]
+ },
+ {
+ "index": 764,
+ "type": 0,
+ "class": 43,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 56,
+ "species": "SPECIES_LUVDISC"
+ },
+ {
+ "difficulty": 0,
+ "level": 60,
+ "species": "SPECIES_LAPRAS"
+ }
+ ]
+ },
+ {
+ "index": 765,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_STARLY"
+ }
+ ]
+ },
+ {
+ "index": 766,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_STARAVIA"
+ }
+ ]
+ },
+ {
+ "index": 767,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_STARAVIA"
+ }
+ ]
+ },
+ {
+ "index": 768,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 19,
+ "species": "SPECIES_KRICKETUNE"
+ }
+ ]
+ },
+ {
+ "index": 769,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_KRICKETUNE"
+ }
+ ]
+ },
+ {
+ "index": 770,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_KRICKETUNE"
+ }
+ ]
+ },
+ {
+ "index": 771,
+ "type": 0,
+ "class": 44,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 28,
+ "species": "SPECIES_SHELLOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 27,
+ "species": "SPECIES_SHELLOS"
+ },
+ {
+ "difficulty": 0,
+ "level": 29,
+ "species": "SPECIES_SHELLOS"
+ }
+ ]
+ },
+ {
+ "index": 772,
+ "type": 0,
+ "class": 44,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 52,
+ "species": "SPECIES_GASTRODON"
+ },
+ {
+ "difficulty": 0,
+ "level": 53,
+ "species": "SPECIES_GASTRODON"
+ },
+ {
+ "difficulty": 0,
+ "level": 51,
+ "species": "SPECIES_GASTRODON"
+ }
+ ]
+ },
+ {
+ "index": 773,
+ "type": 1,
+ "class": 45,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 40,
+ "species": "SPECIES_BIBAREL",
+ "moves": [
+ "MOVE_SURF",
+ "MOVE_HYPER_FANG",
+ "MOVE_TAKE_DOWN",
+ "MOVE_AMNESIA"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 774,
+ "type": 1,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 38,
+ "species": "SPECIES_BUIZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_WHIRLPOOL",
+ "MOVE_SWIFT",
+ "MOVE_PURSUIT"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 40,
+ "species": "SPECIES_GIRAFARIG",
+ "moves": [
+ "MOVE_PSYCHIC",
+ "MOVE_DOUBLE_HIT",
+ "MOVE_STOMP",
+ "MOVE_GROWL"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 39,
+ "species": "SPECIES_MACHOKE",
+ "moves": [
+ "MOVE_SUBMISSION",
+ "MOVE_LOW_KICK",
+ "MOVE_LEER",
+ "MOVE_FORESIGHT"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 775,
+ "type": 1,
+ "class": 45,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 55,
+ "species": "SPECIES_BIBAREL",
+ "moves": [
+ "MOVE_SURF",
+ "MOVE_HYPER_FANG",
+ "MOVE_AMNESIA",
+ "MOVE_SUPERPOWER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 776,
+ "type": 1,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 58,
+ "species": "SPECIES_FLOATZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_ICE_FANG",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_RAZOR_WIND"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 59,
+ "species": "SPECIES_GIRAFARIG",
+ "moves": [
+ "MOVE_PSYCHIC",
+ "MOVE_CRUNCH",
+ "MOVE_ZEN_HEADBUTT",
+ "MOVE_STOMP"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 60,
+ "species": "SPECIES_MACHAMP",
+ "moves": [
+ "MOVE_CROSS_CHOP",
+ "MOVE_LOW_KICK",
+ "MOVE_SCARY_FACE",
+ "MOVE_ROCK_SLIDE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 777,
+ "type": 1,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 100,
+ "level": 58,
+ "species": "SPECIES_STARAPTOR",
+ "moves": [
+ "MOVE_BRAVE_BIRD",
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_QUICK_ATTACK",
+ "MOVE_U_TURN"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 58,
+ "species": "SPECIES_PELIPPER",
+ "moves": [
+ "MOVE_STOCKPILE",
+ "MOVE_SWALLOW",
+ "MOVE_SPIT_UP",
+ "MOVE_HYDRO_PUMP"
+ ]
+ },
+ {
+ "difficulty": 100,
+ "level": 58,
+ "species": "SPECIES_CROBAT",
+ "moves": [
+ "MOVE_AIR_SLASH",
+ "MOVE_CROSS_POISON",
+ "MOVE_BITE",
+ "MOVE_CONFUSE_RAY"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 778,
+ "type": 0,
+ "class": 27,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 779,
+ "type": 0,
+ "class": 83,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 780,
+ "type": 0,
+ "class": 83,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 781,
+ "type": 0,
+ "class": 83,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 782,
+ "type": 0,
+ "class": 83,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 783,
+ "type": 0,
+ "class": 83,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 784,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 785,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 786,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 787,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 788,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 789,
+ "type": 0,
+ "class": 52,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 790,
+ "type": 0,
+ "class": 85,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 791,
+ "type": 0,
+ "class": 85,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 792,
+ "type": 0,
+ "class": 85,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 793,
+ "type": 0,
+ "class": 85,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 794,
+ "type": 0,
+ "class": 85,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 795,
+ "type": 0,
+ "class": 82,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ },
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 796,
+ "type": 0,
+ "class": 82,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ },
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 797,
+ "type": 0,
+ "class": 82,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ },
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 798,
+ "type": 0,
+ "class": 82,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 2,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ },
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 799,
+ "type": 0,
+ "class": 58,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 800,
+ "type": 0,
+ "class": 58,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 801,
+ "type": 0,
+ "class": 58,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 802,
+ "type": 0,
+ "class": 58,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 803,
+ "type": 0,
+ "class": 58,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 804,
+ "type": 0,
+ "class": 22,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 805,
+ "type": 0,
+ "class": 22,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 806,
+ "type": 0,
+ "class": 22,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 807,
+ "type": 0,
+ "class": 22,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 808,
+ "type": 0,
+ "class": 38,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 809,
+ "type": 0,
+ "class": 84,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 810,
+ "type": 0,
+ "class": 84,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 811,
+ "type": 0,
+ "class": 84,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 812,
+ "type": 0,
+ "class": 84,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 813,
+ "type": 0,
+ "class": 41,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 814,
+ "type": 0,
+ "class": 42,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 815,
+ "type": 0,
+ "class": 81,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 816,
+ "type": 0,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 817,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_MUNCHLAX"
+ },
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_KRICKETOT"
+ }
+ ]
+ },
+ {
+ "index": 818,
+ "type": 1,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_BONSLY",
+ "moves": [
+ "MOVE_BLOCK",
+ "MOVE_ROCK_THROW"
+ ]
+ },
+ {
+ "difficulty": 0,
+ "level": 24,
+ "species": "SPECIES_MIME_JR",
+ "moves": [
+ "MOVE_REFLECT",
+ "MOVE_LIGHT_SCREEN",
+ "MOVE_DOUBLE_SLAP"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 819,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 24,
+ "species": "SPECIES_WEAVILE"
+ },
+ {
+ "difficulty": 0,
+ "level": 25,
+ "species": "SPECIES_PACHIRISU"
+ }
+ ]
+ },
+ {
+ "index": 820,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_BUIZEL"
+ },
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_MANTYKE"
+ }
+ ]
+ },
+ {
+ "index": 821,
+ "type": 1,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_CHATOT",
+ "moves": [
+ "MOVE_FURY_ATTACK",
+ "MOVE_SING",
+ "MOVE_GROWL",
+ "MOVE_PECK"
+ ]
+ },
+ {
+ "difficulty": 0,
+ "level": 24,
+ "species": "SPECIES_PACHIRISU",
+ "moves": [
+ "MOVE_SWIFT",
+ "MOVE_ENDURE",
+ "MOVE_SPARK",
+ "MOVE_CHARM"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 822,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 24,
+ "species": "SPECIES_KRICKETOT"
+ },
+ {
+ "difficulty": 0,
+ "level": 25,
+ "species": "SPECIES_CHERRIM"
+ }
+ ]
+ },
+ {
+ "index": 823,
+ "type": 0,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_PACHIRISU"
+ },
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_MUNCHLAX"
+ }
+ ]
+ },
+ {
+ "index": 824,
+ "type": 0,
+ "class": 3,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 23,
+ "species": "SPECIES_STARLY"
+ },
+ {
+ "difficulty": 0,
+ "level": 24,
+ "species": "SPECIES_BIDOOF"
+ }
+ ]
+ },
+ {
+ "index": 825,
+ "type": 1,
+ "class": 2,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 24,
+ "species": "SPECIES_CHATOT",
+ "moves": [
+ "MOVE_FURY_ATTACK",
+ "MOVE_SING",
+ "MOVE_GROWL",
+ "MOVE_PECK"
+ ]
+ },
+ {
+ "difficulty": 0,
+ "level": 25,
+ "species": "SPECIES_CHERRIM",
+ "moves": [
+ "MOVE_PETAL_DANCE",
+ "MOVE_SUNNY_DAY",
+ "MOVE_MAGICAL_LEAF",
+ "MOVE_HELPING_HAND"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 826,
+ "type": 0,
+ "class": 97,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 5,
+ "species": "SPECIES_RATTATA"
+ }
+ ]
+ },
+ {
+ "index": 827,
+ "type": 1,
+ "class": 53,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 39,
+ "species": "SPECIES_SNOVER",
+ "moves": [
+ "MOVE_ICE_SHARD",
+ "MOVE_WOOD_HAMMER",
+ "MOVE_SWAGGER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 828,
+ "type": 1,
+ "class": 54,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 50,
+ "level": 39,
+ "species": "SPECIES_SNOVER",
+ "moves": [
+ "MOVE_ICE_SHARD",
+ "MOVE_WOOD_HAMMER",
+ "MOVE_LEER"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 829,
+ "type": 1,
+ "class": 41,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 37,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_DISABLE",
+ "MOVE_MIRACLE_EYE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 830,
+ "type": 1,
+ "class": 41,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 35,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_FLASH",
+ "MOVE_REFLECT",
+ "MOVE_LIGHT_SCREEN"
+ ]
+ },
+ {
+ "difficulty": 0,
+ "level": 35,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_PSYCHO_CUT",
+ "MOVE_THUNDER_WAVE",
+ "MOVE_DISABLE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 831,
+ "type": 1,
+ "class": 41,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 15,
+ "species": "SPECIES_KADABRA",
+ "moves": [
+ "MOVE_CONFUSION",
+ "MOVE_KINESIS"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 832,
+ "type": 0,
+ "class": 22,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 41,
+ "species": "SPECIES_PIKACHU"
+ },
+ {
+ "difficulty": 0,
+ "level": 41,
+ "species": "SPECIES_PIKACHU"
+ }
+ ]
+ },
+ {
+ "index": 833,
+ "type": 1,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 28,
+ "species": "SPECIES_CASCOON",
+ "moves": [
+ "MOVE_TACKLE",
+ "MOVE_HARDEN",
+ "MOVE_POISON_STING"
+ ]
+ },
+ {
+ "difficulty": 30,
+ "level": 28,
+ "species": "SPECIES_DUSTOX",
+ "moves": [
+ "MOVE_PSYBEAM",
+ "MOVE_MOONLIGHT",
+ "MOVE_PROTECT",
+ "MOVE_GUST"
+ ]
+ },
+ {
+ "difficulty": 30,
+ "level": 28,
+ "species": "SPECIES_BEAUTIFLY",
+ "moves": [
+ "MOVE_MEGA_DRAIN",
+ "MOVE_MORNING_SUN",
+ "MOVE_STUN_SPORE",
+ "MOVE_GUST"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 834,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 28,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 30,
+ "level": 28,
+ "species": "SPECIES_STUNKY"
+ },
+ {
+ "difficulty": 30,
+ "level": 28,
+ "species": "SPECIES_CROAGUNK"
+ }
+ ]
+ },
+ {
+ "index": 835,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 31,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 30,
+ "level": 31,
+ "species": "SPECIES_ZUBAT"
+ },
+ {
+ "difficulty": 30,
+ "level": 34,
+ "species": "SPECIES_GOLBAT"
+ }
+ ]
+ },
+ {
+ "index": 836,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 32,
+ "species": "SPECIES_GLAMEOW"
+ },
+ {
+ "difficulty": 30,
+ "level": 32,
+ "species": "SPECIES_STUNKY"
+ },
+ {
+ "difficulty": 30,
+ "level": 32,
+ "species": "SPECIES_CROAGUNK"
+ }
+ ]
+ },
+ {
+ "index": 837,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 250,
+ "level": 58,
+ "species": "SPECIES_STARAPTOR",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_AERIAL_ACE",
+ "MOVE_STEEL_WING",
+ "MOVE_U_TURN"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 59,
+ "species": "SPECIES_FLOATZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_CRUNCH",
+ "MOVE_ICE_FANG",
+ "MOVE_BRICK_BREAK"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 60,
+ "species": "SPECIES_HERACROSS",
+ "moves": [
+ "MOVE_MEGAHORN",
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_ROCK_SLIDE"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 59,
+ "species": "SPECIES_RAPIDASH",
+ "moves": [
+ "MOVE_FIRE_BLAST",
+ "MOVE_SUNNY_DAY",
+ "MOVE_BOUNCE",
+ "MOVE_WILL_O_WISP"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 60,
+ "species": "SPECIES_SNORLAX",
+ "moves": [
+ "MOVE_BODY_SLAM",
+ "MOVE_CRUNCH",
+ "MOVE_EARTHQUAKE",
+ "MOVE_REST"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 64,
+ "species": "SPECIES_TORTERRA",
+ "moves": [
+ "MOVE_LEAF_STORM",
+ "MOVE_EARTHQUAKE",
+ "MOVE_CRUNCH",
+ "MOVE_LEECH_SEED"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 838,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 250,
+ "level": 58,
+ "species": "SPECIES_STARAPTOR",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_AERIAL_ACE",
+ "MOVE_STEEL_WING",
+ "MOVE_U_TURN"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 59,
+ "species": "SPECIES_FLOATZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_CRUNCH",
+ "MOVE_ICE_FANG",
+ "MOVE_BRICK_BREAK"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 60,
+ "species": "SPECIES_HERACROSS",
+ "moves": [
+ "MOVE_MEGAHORN",
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_ROCK_SLIDE"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 59,
+ "species": "SPECIES_ROSERADE",
+ "moves": [
+ "MOVE_POISON_JAB",
+ "MOVE_GIGA_DRAIN",
+ "MOVE_SHADOW_BALL",
+ "MOVE_GRASS_WHISTLE"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 60,
+ "species": "SPECIES_SNORLAX",
+ "moves": [
+ "MOVE_BODY_SLAM",
+ "MOVE_CRUNCH",
+ "MOVE_EARTHQUAKE",
+ "MOVE_REST"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 64,
+ "species": "SPECIES_INFERNAPE",
+ "moves": [
+ "MOVE_FLAMETHROWER",
+ "MOVE_FOCUS_BLAST",
+ "MOVE_SHADOW_CLAW",
+ "MOVE_AERIAL_ACE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 839,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 250,
+ "level": 58,
+ "species": "SPECIES_STARAPTOR",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_AERIAL_ACE",
+ "MOVE_STEEL_WING",
+ "MOVE_U_TURN"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 59,
+ "species": "SPECIES_ROSERADE",
+ "moves": [
+ "MOVE_POISON_JAB",
+ "MOVE_GIGA_DRAIN",
+ "MOVE_SHADOW_BALL",
+ "MOVE_GRASS_WHISTLE"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 60,
+ "species": "SPECIES_HERACROSS",
+ "moves": [
+ "MOVE_MEGAHORN",
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_ROCK_SLIDE"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 59,
+ "species": "SPECIES_RAPIDASH",
+ "moves": [
+ "MOVE_FIRE_BLAST",
+ "MOVE_SUNNY_DAY",
+ "MOVE_BOUNCE",
+ "MOVE_WILL_O_WISP"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 60,
+ "species": "SPECIES_SNORLAX",
+ "moves": [
+ "MOVE_BODY_SLAM",
+ "MOVE_CRUNCH",
+ "MOVE_EARTHQUAKE",
+ "MOVE_REST"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 64,
+ "species": "SPECIES_EMPOLEON",
+ "moves": [
+ "MOVE_HYDRO_PUMP",
+ "MOVE_METAL_CLAW",
+ "MOVE_DRILL_PECK",
+ "MOVE_SHADOW_CLAW"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 840,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 250,
+ "level": 68,
+ "species": "SPECIES_STARAPTOR",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_AERIAL_ACE",
+ "MOVE_STEEL_WING",
+ "MOVE_U_TURN"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 69,
+ "species": "SPECIES_FLOATZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_CRUNCH",
+ "MOVE_ICE_FANG",
+ "MOVE_BRICK_BREAK"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 70,
+ "species": "SPECIES_HERACROSS",
+ "moves": [
+ "MOVE_MEGAHORN",
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_ROCK_SLIDE"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 69,
+ "species": "SPECIES_RAPIDASH",
+ "moves": [
+ "MOVE_FIRE_BLAST",
+ "MOVE_SUNNY_DAY",
+ "MOVE_MEGAHORN",
+ "MOVE_WILL_O_WISP"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 70,
+ "species": "SPECIES_SNORLAX",
+ "moves": [
+ "MOVE_GIGA_IMPACT",
+ "MOVE_CRUNCH",
+ "MOVE_EARTHQUAKE",
+ "MOVE_BRICK_BREAK"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 74,
+ "species": "SPECIES_TORTERRA",
+ "moves": [
+ "MOVE_LEAF_STORM",
+ "MOVE_EARTHQUAKE",
+ "MOVE_CRUNCH",
+ "MOVE_STONE_EDGE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 841,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 250,
+ "level": 68,
+ "species": "SPECIES_STARAPTOR",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_AERIAL_ACE",
+ "MOVE_STEEL_WING",
+ "MOVE_U_TURN"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 69,
+ "species": "SPECIES_FLOATZEL",
+ "moves": [
+ "MOVE_AQUA_JET",
+ "MOVE_CRUNCH",
+ "MOVE_ICE_FANG",
+ "MOVE_BRICK_BREAK"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 70,
+ "species": "SPECIES_HERACROSS",
+ "moves": [
+ "MOVE_MEGAHORN",
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_ROCK_SLIDE"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 69,
+ "species": "SPECIES_ROSERADE",
+ "moves": [
+ "MOVE_SLUDGE_BOMB",
+ "MOVE_GIGA_DRAIN",
+ "MOVE_SHADOW_BALL",
+ "MOVE_GRASS_WHISTLE"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 70,
+ "species": "SPECIES_SNORLAX",
+ "moves": [
+ "MOVE_GIGA_IMPACT",
+ "MOVE_CRUNCH",
+ "MOVE_EARTHQUAKE",
+ "MOVE_BRICK_BREAK"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 74,
+ "species": "SPECIES_INFERNAPE",
+ "moves": [
+ "MOVE_FLARE_BLITZ",
+ "MOVE_FOCUS_BLAST",
+ "MOVE_SHADOW_CLAW",
+ "MOVE_AERIAL_ACE"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 842,
+ "type": 1,
+ "class": 63,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 250,
+ "level": 68,
+ "species": "SPECIES_STARAPTOR",
+ "moves": [
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_AERIAL_ACE",
+ "MOVE_STEEL_WING",
+ "MOVE_U_TURN"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 69,
+ "species": "SPECIES_ROSERADE",
+ "moves": [
+ "MOVE_SLUDGE_BOMB",
+ "MOVE_GIGA_DRAIN",
+ "MOVE_SHADOW_BALL",
+ "MOVE_GRASS_WHISTLE"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 70,
+ "species": "SPECIES_HERACROSS",
+ "moves": [
+ "MOVE_MEGAHORN",
+ "MOVE_CLOSE_COMBAT",
+ "MOVE_NIGHT_SLASH",
+ "MOVE_ROCK_SLIDE"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 69,
+ "species": "SPECIES_RAPIDASH",
+ "moves": [
+ "MOVE_FIRE_BLAST",
+ "MOVE_SUNNY_DAY",
+ "MOVE_MEGAHORN",
+ "MOVE_WILL_O_WISP"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 70,
+ "species": "SPECIES_SNORLAX",
+ "moves": [
+ "MOVE_GIGA_IMPACT",
+ "MOVE_CRUNCH",
+ "MOVE_EARTHQUAKE",
+ "MOVE_BRICK_BREAK"
+ ]
+ },
+ {
+ "difficulty": 250,
+ "level": 74,
+ "species": "SPECIES_EMPOLEON",
+ "moves": [
+ "MOVE_HYDRO_PUMP",
+ "MOVE_METAL_CLAW",
+ "MOVE_DRILL_PECK",
+ "MOVE_ICE_BEAM"
+ ]
+ }
+ ]
+ },
+ {
+ "index": 843,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 11,
+ "species": "SPECIES_GLAMEOW"
+ }
+ ]
+ },
+ {
+ "index": 844,
+ "type": 0,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_MACHOP"
+ },
+ {
+ "difficulty": 0,
+ "level": 31,
+ "species": "SPECIES_MACHOKE"
+ }
+ ]
+ },
+ {
+ "index": 845,
+ "type": 0,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 33,
+ "species": "SPECIES_STEELIX"
+ }
+ ]
+ },
+ {
+ "index": 846,
+ "type": 0,
+ "class": 59,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 0,
+ "level": 33,
+ "species": "SPECIES_RAPIDASH"
+ }
+ ]
+ },
+ {
+ "index": 847,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 25,
+ "species": "SPECIES_GLAMEOW"
+ }
+ ]
+ },
+ {
+ "index": 848,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 25,
+ "species": "SPECIES_BEAUTIFLY"
+ },
+ {
+ "difficulty": 30,
+ "level": 25,
+ "species": "SPECIES_STUNKY"
+ }
+ ]
+ },
+ {
+ "index": 849,
+ "type": 0,
+ "class": 73,
+ "unk2": 0,
+ "items": [],
+ "unkC": 1,
+ "unk10": 0,
+ "party": [
+ {
+ "difficulty": 30,
+ "level": 25,
+ "species": "SPECIES_DUSTOX"
+ },
+ {
+ "difficulty": 30,
+ "level": 25,
+ "species": "SPECIES_CROAGUNK"
+ }
+ ]
+ }
+ ]
+}
diff --git a/files/poketool/trainer/trdata.json.txt b/files/poketool/trainer/trdata.json.txt
new file mode 100644
index 00000000..3c84dc27
--- /dev/null
+++ b/files/poketool/trainer/trdata.json.txt
@@ -0,0 +1,22 @@
+{{ doNotModifyHeader }}
+
+#include "global.h"
+#include "trainer_data.h"
+#include "constants/items.h"
+
+u32 __size = sizeof(struct TrainerData);
+
+const struct TrainerData __data[] = {
+ {},
+## for trainer in trdata
+ {
+ {{ trainer.type }},
+ {{ trainer.class }},
+ {{ trainer.unk2 }},
+ {{ length(trainer.party) }},
+ { {% for item in trainer.items %}{{ item }},{% endfor %} },
+ {{ trainer.unkC }},
+ {{ trainer.unk10 }}
+ },
+## endfor
+};
diff --git a/files/poketool/trainer/trdata/.knarcignore b/files/poketool/trainer/trdata/.knarcignore
deleted file mode 100644
index 2856080a..00000000
--- a/files/poketool/trainer/trdata/.knarcignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.png
-*.pal
diff --git a/files/poketool/trainer/trdata/narc_0000.bin b/files/poketool/trainer/trdata/narc_0000.bin
deleted file mode 100644
index df879cf4..00000000
--- a/files/poketool/trainer/trdata/narc_0000.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0001.bin b/files/poketool/trainer/trdata/narc_0001.bin
deleted file mode 100644
index 7f3f4d63..00000000
--- a/files/poketool/trainer/trdata/narc_0001.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0002.bin b/files/poketool/trainer/trdata/narc_0002.bin
deleted file mode 100644
index 7f3f4d63..00000000
--- a/files/poketool/trainer/trdata/narc_0002.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0003.bin b/files/poketool/trainer/trdata/narc_0003.bin
deleted file mode 100644
index f1a6c7be..00000000
--- a/files/poketool/trainer/trdata/narc_0003.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0004.bin b/files/poketool/trainer/trdata/narc_0004.bin
deleted file mode 100644
index 5f259161..00000000
--- a/files/poketool/trainer/trdata/narc_0004.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0005.bin b/files/poketool/trainer/trdata/narc_0005.bin
deleted file mode 100644
index 69c6f738..00000000
--- a/files/poketool/trainer/trdata/narc_0005.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0006.bin b/files/poketool/trainer/trdata/narc_0006.bin
deleted file mode 100644
index 69c6f738..00000000
--- a/files/poketool/trainer/trdata/narc_0006.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0007.bin b/files/poketool/trainer/trdata/narc_0007.bin
deleted file mode 100644
index e7a424ba..00000000
--- a/files/poketool/trainer/trdata/narc_0007.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0008.bin b/files/poketool/trainer/trdata/narc_0008.bin
deleted file mode 100644
index e7a424ba..00000000
--- a/files/poketool/trainer/trdata/narc_0008.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0009.bin b/files/poketool/trainer/trdata/narc_0009.bin
deleted file mode 100644
index 7f3f4d63..00000000
--- a/files/poketool/trainer/trdata/narc_0009.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0010.bin b/files/poketool/trainer/trdata/narc_0010.bin
deleted file mode 100644
index 5f259161..00000000
--- a/files/poketool/trainer/trdata/narc_0010.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0011.bin b/files/poketool/trainer/trdata/narc_0011.bin
deleted file mode 100644
index cc4b0ebf..00000000
--- a/files/poketool/trainer/trdata/narc_0011.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0012.bin b/files/poketool/trainer/trdata/narc_0012.bin
deleted file mode 100644
index cc4b0ebf..00000000
--- a/files/poketool/trainer/trdata/narc_0012.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0013.bin b/files/poketool/trainer/trdata/narc_0013.bin
deleted file mode 100644
index bbee0ad1..00000000
--- a/files/poketool/trainer/trdata/narc_0013.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0014.bin b/files/poketool/trainer/trdata/narc_0014.bin
deleted file mode 100644
index 570f4d80..00000000
--- a/files/poketool/trainer/trdata/narc_0014.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0015.bin b/files/poketool/trainer/trdata/narc_0015.bin
deleted file mode 100644
index 5b752f7d..00000000
--- a/files/poketool/trainer/trdata/narc_0015.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0016.bin b/files/poketool/trainer/trdata/narc_0016.bin
deleted file mode 100644
index 02a78315..00000000
--- a/files/poketool/trainer/trdata/narc_0016.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0017.bin b/files/poketool/trainer/trdata/narc_0017.bin
deleted file mode 100644
index 4766aa43..00000000
--- a/files/poketool/trainer/trdata/narc_0017.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0018.bin b/files/poketool/trainer/trdata/narc_0018.bin
deleted file mode 100644
index 696caf41..00000000
--- a/files/poketool/trainer/trdata/narc_0018.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0019.bin b/files/poketool/trainer/trdata/narc_0019.bin
deleted file mode 100644
index a26745d9..00000000
--- a/files/poketool/trainer/trdata/narc_0019.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0020.bin b/files/poketool/trainer/trdata/narc_0020.bin
deleted file mode 100644
index dd29802e..00000000
--- a/files/poketool/trainer/trdata/narc_0020.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0021.bin b/files/poketool/trainer/trdata/narc_0021.bin
deleted file mode 100644
index 41f66e47..00000000
--- a/files/poketool/trainer/trdata/narc_0021.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0022.bin b/files/poketool/trainer/trdata/narc_0022.bin
deleted file mode 100644
index 2e6217b0..00000000
--- a/files/poketool/trainer/trdata/narc_0022.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0023.bin b/files/poketool/trainer/trdata/narc_0023.bin
deleted file mode 100644
index 2bbdea64..00000000
--- a/files/poketool/trainer/trdata/narc_0023.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0024.bin b/files/poketool/trainer/trdata/narc_0024.bin
deleted file mode 100644
index 1b9114f9..00000000
--- a/files/poketool/trainer/trdata/narc_0024.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0025.bin b/files/poketool/trainer/trdata/narc_0025.bin
deleted file mode 100644
index 421bd2f3..00000000
--- a/files/poketool/trainer/trdata/narc_0025.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0026.bin b/files/poketool/trainer/trdata/narc_0026.bin
deleted file mode 100644
index 421bd2f3..00000000
--- a/files/poketool/trainer/trdata/narc_0026.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0027.bin b/files/poketool/trainer/trdata/narc_0027.bin
deleted file mode 100644
index ef7cb2c8..00000000
--- a/files/poketool/trainer/trdata/narc_0027.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0028.bin b/files/poketool/trainer/trdata/narc_0028.bin
deleted file mode 100644
index 421bd2f3..00000000
--- a/files/poketool/trainer/trdata/narc_0028.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0029.bin b/files/poketool/trainer/trdata/narc_0029.bin
deleted file mode 100644
index b3f17d3d..00000000
--- a/files/poketool/trainer/trdata/narc_0029.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0030.bin b/files/poketool/trainer/trdata/narc_0030.bin
deleted file mode 100644
index 6222c996..00000000
--- a/files/poketool/trainer/trdata/narc_0030.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0031.bin b/files/poketool/trainer/trdata/narc_0031.bin
deleted file mode 100644
index b3f17d3d..00000000
--- a/files/poketool/trainer/trdata/narc_0031.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0032.bin b/files/poketool/trainer/trdata/narc_0032.bin
deleted file mode 100644
index 6222c996..00000000
--- a/files/poketool/trainer/trdata/narc_0032.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0033.bin b/files/poketool/trainer/trdata/narc_0033.bin
deleted file mode 100644
index 6fe8c60d..00000000
--- a/files/poketool/trainer/trdata/narc_0033.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0034.bin b/files/poketool/trainer/trdata/narc_0034.bin
deleted file mode 100644
index 02a78315..00000000
--- a/files/poketool/trainer/trdata/narc_0034.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0035.bin b/files/poketool/trainer/trdata/narc_0035.bin
deleted file mode 100644
index 63471c10..00000000
--- a/files/poketool/trainer/trdata/narc_0035.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0036.bin b/files/poketool/trainer/trdata/narc_0036.bin
deleted file mode 100644
index 696caf41..00000000
--- a/files/poketool/trainer/trdata/narc_0036.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0037.bin b/files/poketool/trainer/trdata/narc_0037.bin
deleted file mode 100644
index 34600ee3..00000000
--- a/files/poketool/trainer/trdata/narc_0037.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0038.bin b/files/poketool/trainer/trdata/narc_0038.bin
deleted file mode 100644
index 3bdfd715..00000000
--- a/files/poketool/trainer/trdata/narc_0038.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0039.bin b/files/poketool/trainer/trdata/narc_0039.bin
deleted file mode 100644
index 34600ee3..00000000
--- a/files/poketool/trainer/trdata/narc_0039.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0040.bin b/files/poketool/trainer/trdata/narc_0040.bin
deleted file mode 100644
index 6bbdce94..00000000
--- a/files/poketool/trainer/trdata/narc_0040.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0041.bin b/files/poketool/trainer/trdata/narc_0041.bin
deleted file mode 100644
index a26745d9..00000000
--- a/files/poketool/trainer/trdata/narc_0041.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0042.bin b/files/poketool/trainer/trdata/narc_0042.bin
deleted file mode 100644
index 9c9d3435..00000000
--- a/files/poketool/trainer/trdata/narc_0042.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0043.bin b/files/poketool/trainer/trdata/narc_0043.bin
deleted file mode 100644
index 45af2a9b..00000000
--- a/files/poketool/trainer/trdata/narc_0043.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0044.bin b/files/poketool/trainer/trdata/narc_0044.bin
deleted file mode 100644
index 570f4d80..00000000
--- a/files/poketool/trainer/trdata/narc_0044.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0045.bin b/files/poketool/trainer/trdata/narc_0045.bin
deleted file mode 100644
index 93c51bf7..00000000
--- a/files/poketool/trainer/trdata/narc_0045.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0046.bin b/files/poketool/trainer/trdata/narc_0046.bin
deleted file mode 100644
index ee98e551..00000000
--- a/files/poketool/trainer/trdata/narc_0046.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0047.bin b/files/poketool/trainer/trdata/narc_0047.bin
deleted file mode 100644
index 14e818df..00000000
--- a/files/poketool/trainer/trdata/narc_0047.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0048.bin b/files/poketool/trainer/trdata/narc_0048.bin
deleted file mode 100644
index 2279a05a..00000000
--- a/files/poketool/trainer/trdata/narc_0048.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0049.bin b/files/poketool/trainer/trdata/narc_0049.bin
deleted file mode 100644
index 772fdcef..00000000
--- a/files/poketool/trainer/trdata/narc_0049.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0050.bin b/files/poketool/trainer/trdata/narc_0050.bin
deleted file mode 100644
index 0b892d1d..00000000
--- a/files/poketool/trainer/trdata/narc_0050.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0051.bin b/files/poketool/trainer/trdata/narc_0051.bin
deleted file mode 100644
index 33bbf307..00000000
--- a/files/poketool/trainer/trdata/narc_0051.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0052.bin b/files/poketool/trainer/trdata/narc_0052.bin
deleted file mode 100644
index 7f3f4d63..00000000
--- a/files/poketool/trainer/trdata/narc_0052.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0053.bin b/files/poketool/trainer/trdata/narc_0053.bin
deleted file mode 100644
index 7ac32e6c..00000000
--- a/files/poketool/trainer/trdata/narc_0053.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0054.bin b/files/poketool/trainer/trdata/narc_0054.bin
deleted file mode 100644
index 2bbdea64..00000000
--- a/files/poketool/trainer/trdata/narc_0054.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0055.bin b/files/poketool/trainer/trdata/narc_0055.bin
deleted file mode 100644
index 5f50e7c6..00000000
--- a/files/poketool/trainer/trdata/narc_0055.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0056.bin b/files/poketool/trainer/trdata/narc_0056.bin
deleted file mode 100644
index ee98e551..00000000
--- a/files/poketool/trainer/trdata/narc_0056.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0057.bin b/files/poketool/trainer/trdata/narc_0057.bin
deleted file mode 100644
index 14e818df..00000000
--- a/files/poketool/trainer/trdata/narc_0057.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0058.bin b/files/poketool/trainer/trdata/narc_0058.bin
deleted file mode 100644
index dc86effa..00000000
--- a/files/poketool/trainer/trdata/narc_0058.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0059.bin b/files/poketool/trainer/trdata/narc_0059.bin
deleted file mode 100644
index 772fdcef..00000000
--- a/files/poketool/trainer/trdata/narc_0059.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0060.bin b/files/poketool/trainer/trdata/narc_0060.bin
deleted file mode 100644
index 0b892d1d..00000000
--- a/files/poketool/trainer/trdata/narc_0060.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0061.bin b/files/poketool/trainer/trdata/narc_0061.bin
deleted file mode 100644
index 33bbf307..00000000
--- a/files/poketool/trainer/trdata/narc_0061.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0062.bin b/files/poketool/trainer/trdata/narc_0062.bin
deleted file mode 100644
index b5fceed9..00000000
--- a/files/poketool/trainer/trdata/narc_0062.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0063.bin b/files/poketool/trainer/trdata/narc_0063.bin
deleted file mode 100644
index a7f8a89a..00000000
--- a/files/poketool/trainer/trdata/narc_0063.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0064.bin b/files/poketool/trainer/trdata/narc_0064.bin
deleted file mode 100644
index faa97bff..00000000
--- a/files/poketool/trainer/trdata/narc_0064.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0065.bin b/files/poketool/trainer/trdata/narc_0065.bin
deleted file mode 100644
index 5b752f7d..00000000
--- a/files/poketool/trainer/trdata/narc_0065.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0066.bin b/files/poketool/trainer/trdata/narc_0066.bin
deleted file mode 100644
index 150ff10e..00000000
--- a/files/poketool/trainer/trdata/narc_0066.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0067.bin b/files/poketool/trainer/trdata/narc_0067.bin
deleted file mode 100644
index 7bfc3d16..00000000
--- a/files/poketool/trainer/trdata/narc_0067.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0068.bin b/files/poketool/trainer/trdata/narc_0068.bin
deleted file mode 100644
index 8d46840d..00000000
--- a/files/poketool/trainer/trdata/narc_0068.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0069.bin b/files/poketool/trainer/trdata/narc_0069.bin
deleted file mode 100644
index 9c9d3435..00000000
--- a/files/poketool/trainer/trdata/narc_0069.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0070.bin b/files/poketool/trainer/trdata/narc_0070.bin
deleted file mode 100644
index c1398d1e..00000000
--- a/files/poketool/trainer/trdata/narc_0070.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0071.bin b/files/poketool/trainer/trdata/narc_0071.bin
deleted file mode 100644
index 730e2129..00000000
--- a/files/poketool/trainer/trdata/narc_0071.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0072.bin b/files/poketool/trainer/trdata/narc_0072.bin
deleted file mode 100644
index ea80f172..00000000
--- a/files/poketool/trainer/trdata/narc_0072.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0073.bin b/files/poketool/trainer/trdata/narc_0073.bin
deleted file mode 100644
index b245c3b1..00000000
--- a/files/poketool/trainer/trdata/narc_0073.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0074.bin b/files/poketool/trainer/trdata/narc_0074.bin
deleted file mode 100644
index b954069c..00000000
--- a/files/poketool/trainer/trdata/narc_0074.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0075.bin b/files/poketool/trainer/trdata/narc_0075.bin
deleted file mode 100644
index f61b201a..00000000
--- a/files/poketool/trainer/trdata/narc_0075.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0076.bin b/files/poketool/trainer/trdata/narc_0076.bin
deleted file mode 100644
index 9c9d48b2..00000000
--- a/files/poketool/trainer/trdata/narc_0076.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0077.bin b/files/poketool/trainer/trdata/narc_0077.bin
deleted file mode 100644
index dd29802e..00000000
--- a/files/poketool/trainer/trdata/narc_0077.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0078.bin b/files/poketool/trainer/trdata/narc_0078.bin
deleted file mode 100644
index d1ba9d5c..00000000
--- a/files/poketool/trainer/trdata/narc_0078.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0079.bin b/files/poketool/trainer/trdata/narc_0079.bin
deleted file mode 100644
index 67ddc3a2..00000000
--- a/files/poketool/trainer/trdata/narc_0079.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0080.bin b/files/poketool/trainer/trdata/narc_0080.bin
deleted file mode 100644
index 730e2129..00000000
--- a/files/poketool/trainer/trdata/narc_0080.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0081.bin b/files/poketool/trainer/trdata/narc_0081.bin
deleted file mode 100644
index 9c9d48b2..00000000
--- a/files/poketool/trainer/trdata/narc_0081.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0082.bin b/files/poketool/trainer/trdata/narc_0082.bin
deleted file mode 100644
index aee5bdfe..00000000
--- a/files/poketool/trainer/trdata/narc_0082.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0083.bin b/files/poketool/trainer/trdata/narc_0083.bin
deleted file mode 100644
index dd4e0cac..00000000
--- a/files/poketool/trainer/trdata/narc_0083.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0084.bin b/files/poketool/trainer/trdata/narc_0084.bin
deleted file mode 100644
index 6f7608cb..00000000
--- a/files/poketool/trainer/trdata/narc_0084.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0085.bin b/files/poketool/trainer/trdata/narc_0085.bin
deleted file mode 100644
index 4e847a03..00000000
--- a/files/poketool/trainer/trdata/narc_0085.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0086.bin b/files/poketool/trainer/trdata/narc_0086.bin
deleted file mode 100644
index b58a1adb..00000000
--- a/files/poketool/trainer/trdata/narc_0086.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0087.bin b/files/poketool/trainer/trdata/narc_0087.bin
deleted file mode 100644
index 72cf2ebc..00000000
--- a/files/poketool/trainer/trdata/narc_0087.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0088.bin b/files/poketool/trainer/trdata/narc_0088.bin
deleted file mode 100644
index 7611c80a..00000000
--- a/files/poketool/trainer/trdata/narc_0088.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0089.bin b/files/poketool/trainer/trdata/narc_0089.bin
deleted file mode 100644
index 7611c80a..00000000
--- a/files/poketool/trainer/trdata/narc_0089.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0090.bin b/files/poketool/trainer/trdata/narc_0090.bin
deleted file mode 100644
index 7611c80a..00000000
--- a/files/poketool/trainer/trdata/narc_0090.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0091.bin b/files/poketool/trainer/trdata/narc_0091.bin
deleted file mode 100644
index 2bbdea64..00000000
--- a/files/poketool/trainer/trdata/narc_0091.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0092.bin b/files/poketool/trainer/trdata/narc_0092.bin
deleted file mode 100644
index 45af2a9b..00000000
--- a/files/poketool/trainer/trdata/narc_0092.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0093.bin b/files/poketool/trainer/trdata/narc_0093.bin
deleted file mode 100644
index c4df596c..00000000
--- a/files/poketool/trainer/trdata/narc_0093.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0094.bin b/files/poketool/trainer/trdata/narc_0094.bin
deleted file mode 100644
index b8562b25..00000000
--- a/files/poketool/trainer/trdata/narc_0094.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0095.bin b/files/poketool/trainer/trdata/narc_0095.bin
deleted file mode 100644
index b8562b25..00000000
--- a/files/poketool/trainer/trdata/narc_0095.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0096.bin b/files/poketool/trainer/trdata/narc_0096.bin
deleted file mode 100644
index 003eb31d..00000000
--- a/files/poketool/trainer/trdata/narc_0096.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0097.bin b/files/poketool/trainer/trdata/narc_0097.bin
deleted file mode 100644
index d2b6035c..00000000
--- a/files/poketool/trainer/trdata/narc_0097.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0098.bin b/files/poketool/trainer/trdata/narc_0098.bin
deleted file mode 100644
index 7b5ada8b..00000000
--- a/files/poketool/trainer/trdata/narc_0098.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0099.bin b/files/poketool/trainer/trdata/narc_0099.bin
deleted file mode 100644
index 8c1aa653..00000000
--- a/files/poketool/trainer/trdata/narc_0099.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0100.bin b/files/poketool/trainer/trdata/narc_0100.bin
deleted file mode 100644
index 7f3f4d63..00000000
--- a/files/poketool/trainer/trdata/narc_0100.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0101.bin b/files/poketool/trainer/trdata/narc_0101.bin
deleted file mode 100644
index 7f3f4d63..00000000
--- a/files/poketool/trainer/trdata/narc_0101.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0102.bin b/files/poketool/trainer/trdata/narc_0102.bin
deleted file mode 100644
index 7611c80a..00000000
--- a/files/poketool/trainer/trdata/narc_0102.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0103.bin b/files/poketool/trainer/trdata/narc_0103.bin
deleted file mode 100644
index fc4849c1..00000000
--- a/files/poketool/trainer/trdata/narc_0103.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0104.bin b/files/poketool/trainer/trdata/narc_0104.bin
deleted file mode 100644
index 06f70012..00000000
--- a/files/poketool/trainer/trdata/narc_0104.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0105.bin b/files/poketool/trainer/trdata/narc_0105.bin
deleted file mode 100644
index aeccc746..00000000
--- a/files/poketool/trainer/trdata/narc_0105.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0106.bin b/files/poketool/trainer/trdata/narc_0106.bin
deleted file mode 100644
index aeccc746..00000000
--- a/files/poketool/trainer/trdata/narc_0106.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0107.bin b/files/poketool/trainer/trdata/narc_0107.bin
deleted file mode 100644
index 337775bd..00000000
--- a/files/poketool/trainer/trdata/narc_0107.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0108.bin b/files/poketool/trainer/trdata/narc_0108.bin
deleted file mode 100644
index 63631284..00000000
--- a/files/poketool/trainer/trdata/narc_0108.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0109.bin b/files/poketool/trainer/trdata/narc_0109.bin
deleted file mode 100644
index dd29802e..00000000
--- a/files/poketool/trainer/trdata/narc_0109.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0110.bin b/files/poketool/trainer/trdata/narc_0110.bin
deleted file mode 100644
index 972c8d32..00000000
--- a/files/poketool/trainer/trdata/narc_0110.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0111.bin b/files/poketool/trainer/trdata/narc_0111.bin
deleted file mode 100644
index 1b9114f9..00000000
--- a/files/poketool/trainer/trdata/narc_0111.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0112.bin b/files/poketool/trainer/trdata/narc_0112.bin
deleted file mode 100644
index 8b908fcc..00000000
--- a/files/poketool/trainer/trdata/narc_0112.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0113.bin b/files/poketool/trainer/trdata/narc_0113.bin
deleted file mode 100644
index 9c98c21e..00000000
--- a/files/poketool/trainer/trdata/narc_0113.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0114.bin b/files/poketool/trainer/trdata/narc_0114.bin
deleted file mode 100644
index 8694d813..00000000
--- a/files/poketool/trainer/trdata/narc_0114.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0115.bin b/files/poketool/trainer/trdata/narc_0115.bin
deleted file mode 100644
index a26745d9..00000000
--- a/files/poketool/trainer/trdata/narc_0115.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0116.bin b/files/poketool/trainer/trdata/narc_0116.bin
deleted file mode 100644
index 007cd3fa..00000000
--- a/files/poketool/trainer/trdata/narc_0116.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0117.bin b/files/poketool/trainer/trdata/narc_0117.bin
deleted file mode 100644
index 69c6f738..00000000
--- a/files/poketool/trainer/trdata/narc_0117.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0118.bin b/files/poketool/trainer/trdata/narc_0118.bin
deleted file mode 100644
index e7a424ba..00000000
--- a/files/poketool/trainer/trdata/narc_0118.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0119.bin b/files/poketool/trainer/trdata/narc_0119.bin
deleted file mode 100644
index 5ce2c67c..00000000
--- a/files/poketool/trainer/trdata/narc_0119.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0120.bin b/files/poketool/trainer/trdata/narc_0120.bin
deleted file mode 100644
index cbfba442..00000000
--- a/files/poketool/trainer/trdata/narc_0120.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0121.bin b/files/poketool/trainer/trdata/narc_0121.bin
deleted file mode 100644
index 549da886..00000000
--- a/files/poketool/trainer/trdata/narc_0121.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0122.bin b/files/poketool/trainer/trdata/narc_0122.bin
deleted file mode 100644
index f322b90e..00000000
--- a/files/poketool/trainer/trdata/narc_0122.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0123.bin b/files/poketool/trainer/trdata/narc_0123.bin
deleted file mode 100644
index fca61ba2..00000000
--- a/files/poketool/trainer/trdata/narc_0123.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0124.bin b/files/poketool/trainer/trdata/narc_0124.bin
deleted file mode 100644
index b58a1adb..00000000
--- a/files/poketool/trainer/trdata/narc_0124.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0125.bin b/files/poketool/trainer/trdata/narc_0125.bin
deleted file mode 100644
index b58a1adb..00000000
--- a/files/poketool/trainer/trdata/narc_0125.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0126.bin b/files/poketool/trainer/trdata/narc_0126.bin
deleted file mode 100644
index 9c9d3435..00000000
--- a/files/poketool/trainer/trdata/narc_0126.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0127.bin b/files/poketool/trainer/trdata/narc_0127.bin
deleted file mode 100644
index 67ddc3a2..00000000
--- a/files/poketool/trainer/trdata/narc_0127.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0128.bin b/files/poketool/trainer/trdata/narc_0128.bin
deleted file mode 100644
index 9c9d3435..00000000
--- a/files/poketool/trainer/trdata/narc_0128.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0129.bin b/files/poketool/trainer/trdata/narc_0129.bin
deleted file mode 100644
index 67ddc3a2..00000000
--- a/files/poketool/trainer/trdata/narc_0129.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0130.bin b/files/poketool/trainer/trdata/narc_0130.bin
deleted file mode 100644
index 772fdcef..00000000
--- a/files/poketool/trainer/trdata/narc_0130.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0131.bin b/files/poketool/trainer/trdata/narc_0131.bin
deleted file mode 100644
index 9c9d48b2..00000000
--- a/files/poketool/trainer/trdata/narc_0131.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0132.bin b/files/poketool/trainer/trdata/narc_0132.bin
deleted file mode 100644
index d02a85a5..00000000
--- a/files/poketool/trainer/trdata/narc_0132.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0133.bin b/files/poketool/trainer/trdata/narc_0133.bin
deleted file mode 100644
index 942f4373..00000000
--- a/files/poketool/trainer/trdata/narc_0133.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0134.bin b/files/poketool/trainer/trdata/narc_0134.bin
deleted file mode 100644
index a3aab1c5..00000000
--- a/files/poketool/trainer/trdata/narc_0134.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0135.bin b/files/poketool/trainer/trdata/narc_0135.bin
deleted file mode 100644
index 02272b8e..00000000
--- a/files/poketool/trainer/trdata/narc_0135.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0136.bin b/files/poketool/trainer/trdata/narc_0136.bin
deleted file mode 100644
index 49115ae9..00000000
--- a/files/poketool/trainer/trdata/narc_0136.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0137.bin b/files/poketool/trainer/trdata/narc_0137.bin
deleted file mode 100644
index b7e00871..00000000
--- a/files/poketool/trainer/trdata/narc_0137.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0138.bin b/files/poketool/trainer/trdata/narc_0138.bin
deleted file mode 100644
index 9ead7ae9..00000000
--- a/files/poketool/trainer/trdata/narc_0138.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0139.bin b/files/poketool/trainer/trdata/narc_0139.bin
deleted file mode 100644
index 75ef0429..00000000
--- a/files/poketool/trainer/trdata/narc_0139.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0140.bin b/files/poketool/trainer/trdata/narc_0140.bin
deleted file mode 100644
index 942f4373..00000000
--- a/files/poketool/trainer/trdata/narc_0140.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0141.bin b/files/poketool/trainer/trdata/narc_0141.bin
deleted file mode 100644
index 0eb6d263..00000000
--- a/files/poketool/trainer/trdata/narc_0141.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0142.bin b/files/poketool/trainer/trdata/narc_0142.bin
deleted file mode 100644
index d318079b..00000000
--- a/files/poketool/trainer/trdata/narc_0142.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0143.bin b/files/poketool/trainer/trdata/narc_0143.bin
deleted file mode 100644
index bfe62fdb..00000000
--- a/files/poketool/trainer/trdata/narc_0143.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0144.bin b/files/poketool/trainer/trdata/narc_0144.bin
deleted file mode 100644
index 9ead7ae9..00000000
--- a/files/poketool/trainer/trdata/narc_0144.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0145.bin b/files/poketool/trainer/trdata/narc_0145.bin
deleted file mode 100644
index 75ef0429..00000000
--- a/files/poketool/trainer/trdata/narc_0145.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0146.bin b/files/poketool/trainer/trdata/narc_0146.bin
deleted file mode 100644
index c1398d1e..00000000
--- a/files/poketool/trainer/trdata/narc_0146.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0147.bin b/files/poketool/trainer/trdata/narc_0147.bin
deleted file mode 100644
index 730e2129..00000000
--- a/files/poketool/trainer/trdata/narc_0147.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0148.bin b/files/poketool/trainer/trdata/narc_0148.bin
deleted file mode 100644
index 67ddc3a2..00000000
--- a/files/poketool/trainer/trdata/narc_0148.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0149.bin b/files/poketool/trainer/trdata/narc_0149.bin
deleted file mode 100644
index f4f52d21..00000000
--- a/files/poketool/trainer/trdata/narc_0149.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0150.bin b/files/poketool/trainer/trdata/narc_0150.bin
deleted file mode 100644
index f4f52d21..00000000
--- a/files/poketool/trainer/trdata/narc_0150.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0151.bin b/files/poketool/trainer/trdata/narc_0151.bin
deleted file mode 100644
index 172b4b81..00000000
--- a/files/poketool/trainer/trdata/narc_0151.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0152.bin b/files/poketool/trainer/trdata/narc_0152.bin
deleted file mode 100644
index 172b4b81..00000000
--- a/files/poketool/trainer/trdata/narc_0152.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0153.bin b/files/poketool/trainer/trdata/narc_0153.bin
deleted file mode 100644
index 45af2a9b..00000000
--- a/files/poketool/trainer/trdata/narc_0153.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0154.bin b/files/poketool/trainer/trdata/narc_0154.bin
deleted file mode 100644
index e6c39810..00000000
--- a/files/poketool/trainer/trdata/narc_0154.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0155.bin b/files/poketool/trainer/trdata/narc_0155.bin
deleted file mode 100644
index 8b908fcc..00000000
--- a/files/poketool/trainer/trdata/narc_0155.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0156.bin b/files/poketool/trainer/trdata/narc_0156.bin
deleted file mode 100644
index f4f52d21..00000000
--- a/files/poketool/trainer/trdata/narc_0156.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0157.bin b/files/poketool/trainer/trdata/narc_0157.bin
deleted file mode 100644
index f4f52d21..00000000
--- a/files/poketool/trainer/trdata/narc_0157.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0158.bin b/files/poketool/trainer/trdata/narc_0158.bin
deleted file mode 100644
index 172b4b81..00000000
--- a/files/poketool/trainer/trdata/narc_0158.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0159.bin b/files/poketool/trainer/trdata/narc_0159.bin
deleted file mode 100644
index fc4849c1..00000000
--- a/files/poketool/trainer/trdata/narc_0159.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0160.bin b/files/poketool/trainer/trdata/narc_0160.bin
deleted file mode 100644
index f4f52d21..00000000
--- a/files/poketool/trainer/trdata/narc_0160.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0161.bin b/files/poketool/trainer/trdata/narc_0161.bin
deleted file mode 100644
index 06f70012..00000000
--- a/files/poketool/trainer/trdata/narc_0161.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0162.bin b/files/poketool/trainer/trdata/narc_0162.bin
deleted file mode 100644
index 241b0f45..00000000
--- a/files/poketool/trainer/trdata/narc_0162.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0163.bin b/files/poketool/trainer/trdata/narc_0163.bin
deleted file mode 100644
index aeccc746..00000000
--- a/files/poketool/trainer/trdata/narc_0163.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0164.bin b/files/poketool/trainer/trdata/narc_0164.bin
deleted file mode 100644
index bc2afe0e..00000000
--- a/files/poketool/trainer/trdata/narc_0164.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0165.bin b/files/poketool/trainer/trdata/narc_0165.bin
deleted file mode 100644
index 8b908fcc..00000000
--- a/files/poketool/trainer/trdata/narc_0165.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0166.bin b/files/poketool/trainer/trdata/narc_0166.bin
deleted file mode 100644
index 06f70012..00000000
--- a/files/poketool/trainer/trdata/narc_0166.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0167.bin b/files/poketool/trainer/trdata/narc_0167.bin
deleted file mode 100644
index 172b4b81..00000000
--- a/files/poketool/trainer/trdata/narc_0167.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0168.bin b/files/poketool/trainer/trdata/narc_0168.bin
deleted file mode 100644
index 1b9114f9..00000000
--- a/files/poketool/trainer/trdata/narc_0168.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0169.bin b/files/poketool/trainer/trdata/narc_0169.bin
deleted file mode 100644
index 8694d813..00000000
--- a/files/poketool/trainer/trdata/narc_0169.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0170.bin b/files/poketool/trainer/trdata/narc_0170.bin
deleted file mode 100644
index 1a48a8ce..00000000
--- a/files/poketool/trainer/trdata/narc_0170.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0171.bin b/files/poketool/trainer/trdata/narc_0171.bin
deleted file mode 100644
index 5f5dee1e..00000000
--- a/files/poketool/trainer/trdata/narc_0171.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0172.bin b/files/poketool/trainer/trdata/narc_0172.bin
deleted file mode 100644
index 1b9114f9..00000000
--- a/files/poketool/trainer/trdata/narc_0172.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0173.bin b/files/poketool/trainer/trdata/narc_0173.bin
deleted file mode 100644
index 45af2a9b..00000000
--- a/files/poketool/trainer/trdata/narc_0173.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0174.bin b/files/poketool/trainer/trdata/narc_0174.bin
deleted file mode 100644
index c4df596c..00000000
--- a/files/poketool/trainer/trdata/narc_0174.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0175.bin b/files/poketool/trainer/trdata/narc_0175.bin
deleted file mode 100644
index 1b9114f9..00000000
--- a/files/poketool/trainer/trdata/narc_0175.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0176.bin b/files/poketool/trainer/trdata/narc_0176.bin
deleted file mode 100644
index cde7cb76..00000000
--- a/files/poketool/trainer/trdata/narc_0176.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0177.bin b/files/poketool/trainer/trdata/narc_0177.bin
deleted file mode 100644
index cde7cb76..00000000
--- a/files/poketool/trainer/trdata/narc_0177.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0178.bin b/files/poketool/trainer/trdata/narc_0178.bin
deleted file mode 100644
index f322b90e..00000000
--- a/files/poketool/trainer/trdata/narc_0178.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0179.bin b/files/poketool/trainer/trdata/narc_0179.bin
deleted file mode 100644
index 94015172..00000000
--- a/files/poketool/trainer/trdata/narc_0179.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0180.bin b/files/poketool/trainer/trdata/narc_0180.bin
deleted file mode 100644
index 7e07d284..00000000
--- a/files/poketool/trainer/trdata/narc_0180.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0181.bin b/files/poketool/trainer/trdata/narc_0181.bin
deleted file mode 100644
index 2822319d..00000000
--- a/files/poketool/trainer/trdata/narc_0181.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0182.bin b/files/poketool/trainer/trdata/narc_0182.bin
deleted file mode 100644
index 5f50e7c6..00000000
--- a/files/poketool/trainer/trdata/narc_0182.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0183.bin b/files/poketool/trainer/trdata/narc_0183.bin
deleted file mode 100644
index 06f70012..00000000
--- a/files/poketool/trainer/trdata/narc_0183.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0184.bin b/files/poketool/trainer/trdata/narc_0184.bin
deleted file mode 100644
index f4f52d21..00000000
--- a/files/poketool/trainer/trdata/narc_0184.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0185.bin b/files/poketool/trainer/trdata/narc_0185.bin
deleted file mode 100644
index 06f70012..00000000
--- a/files/poketool/trainer/trdata/narc_0185.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0186.bin b/files/poketool/trainer/trdata/narc_0186.bin
deleted file mode 100644
index fc4849c1..00000000
--- a/files/poketool/trainer/trdata/narc_0186.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0187.bin b/files/poketool/trainer/trdata/narc_0187.bin
deleted file mode 100644
index f4f52d21..00000000
--- a/files/poketool/trainer/trdata/narc_0187.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0188.bin b/files/poketool/trainer/trdata/narc_0188.bin
deleted file mode 100644
index fc4849c1..00000000
--- a/files/poketool/trainer/trdata/narc_0188.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0189.bin b/files/poketool/trainer/trdata/narc_0189.bin
deleted file mode 100644
index 172b4b81..00000000
--- a/files/poketool/trainer/trdata/narc_0189.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0190.bin b/files/poketool/trainer/trdata/narc_0190.bin
deleted file mode 100644
index aeccc746..00000000
--- a/files/poketool/trainer/trdata/narc_0190.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0191.bin b/files/poketool/trainer/trdata/narc_0191.bin
deleted file mode 100644
index 4da77e80..00000000
--- a/files/poketool/trainer/trdata/narc_0191.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0192.bin b/files/poketool/trainer/trdata/narc_0192.bin
deleted file mode 100644
index aeccc746..00000000
--- a/files/poketool/trainer/trdata/narc_0192.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0193.bin b/files/poketool/trainer/trdata/narc_0193.bin
deleted file mode 100644
index aeccc746..00000000
--- a/files/poketool/trainer/trdata/narc_0193.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0194.bin b/files/poketool/trainer/trdata/narc_0194.bin
deleted file mode 100644
index 172b4b81..00000000
--- a/files/poketool/trainer/trdata/narc_0194.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0195.bin b/files/poketool/trainer/trdata/narc_0195.bin
deleted file mode 100644
index bda798c4..00000000
--- a/files/poketool/trainer/trdata/narc_0195.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0196.bin b/files/poketool/trainer/trdata/narc_0196.bin
deleted file mode 100644
index d68549f0..00000000
--- a/files/poketool/trainer/trdata/narc_0196.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0197.bin b/files/poketool/trainer/trdata/narc_0197.bin
deleted file mode 100644
index b1fae20e..00000000
--- a/files/poketool/trainer/trdata/narc_0197.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0198.bin b/files/poketool/trainer/trdata/narc_0198.bin
deleted file mode 100644
index 7b5ada8b..00000000
--- a/files/poketool/trainer/trdata/narc_0198.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0199.bin b/files/poketool/trainer/trdata/narc_0199.bin
deleted file mode 100644
index 7b5ada8b..00000000
--- a/files/poketool/trainer/trdata/narc_0199.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0200.bin b/files/poketool/trainer/trdata/narc_0200.bin
deleted file mode 100644
index 7b5ada8b..00000000
--- a/files/poketool/trainer/trdata/narc_0200.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0201.bin b/files/poketool/trainer/trdata/narc_0201.bin
deleted file mode 100644
index 9d28bc2d..00000000
--- a/files/poketool/trainer/trdata/narc_0201.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0202.bin b/files/poketool/trainer/trdata/narc_0202.bin
deleted file mode 100644
index 9d28bc2d..00000000
--- a/files/poketool/trainer/trdata/narc_0202.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0203.bin b/files/poketool/trainer/trdata/narc_0203.bin
deleted file mode 100644
index bbee0ad1..00000000
--- a/files/poketool/trainer/trdata/narc_0203.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0204.bin b/files/poketool/trainer/trdata/narc_0204.bin
deleted file mode 100644
index cc4b0ebf..00000000
--- a/files/poketool/trainer/trdata/narc_0204.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0205.bin b/files/poketool/trainer/trdata/narc_0205.bin
deleted file mode 100644
index 1aa75ca0..00000000
--- a/files/poketool/trainer/trdata/narc_0205.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0206.bin b/files/poketool/trainer/trdata/narc_0206.bin
deleted file mode 100644
index f239c87b..00000000
--- a/files/poketool/trainer/trdata/narc_0206.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0207.bin b/files/poketool/trainer/trdata/narc_0207.bin
deleted file mode 100644
index 5f50e7c6..00000000
--- a/files/poketool/trainer/trdata/narc_0207.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0208.bin b/files/poketool/trainer/trdata/narc_0208.bin
deleted file mode 100644
index b1fae20e..00000000
--- a/files/poketool/trainer/trdata/narc_0208.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0209.bin b/files/poketool/trainer/trdata/narc_0209.bin
deleted file mode 100644
index b1fae20e..00000000
--- a/files/poketool/trainer/trdata/narc_0209.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0210.bin b/files/poketool/trainer/trdata/narc_0210.bin
deleted file mode 100644
index b1fae20e..00000000
--- a/files/poketool/trainer/trdata/narc_0210.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0211.bin b/files/poketool/trainer/trdata/narc_0211.bin
deleted file mode 100644
index 3c50fede..00000000
--- a/files/poketool/trainer/trdata/narc_0211.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0212.bin b/files/poketool/trainer/trdata/narc_0212.bin
deleted file mode 100644
index 3c50fede..00000000
--- a/files/poketool/trainer/trdata/narc_0212.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0213.bin b/files/poketool/trainer/trdata/narc_0213.bin
deleted file mode 100644
index da84e8d1..00000000
--- a/files/poketool/trainer/trdata/narc_0213.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0214.bin b/files/poketool/trainer/trdata/narc_0214.bin
deleted file mode 100644
index da84e8d1..00000000
--- a/files/poketool/trainer/trdata/narc_0214.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0215.bin b/files/poketool/trainer/trdata/narc_0215.bin
deleted file mode 100644
index 007cd3fa..00000000
--- a/files/poketool/trainer/trdata/narc_0215.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0216.bin b/files/poketool/trainer/trdata/narc_0216.bin
deleted file mode 100644
index 007cd3fa..00000000
--- a/files/poketool/trainer/trdata/narc_0216.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0217.bin b/files/poketool/trainer/trdata/narc_0217.bin
deleted file mode 100644
index 69954115..00000000
--- a/files/poketool/trainer/trdata/narc_0217.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0218.bin b/files/poketool/trainer/trdata/narc_0218.bin
deleted file mode 100644
index 0cceb605..00000000
--- a/files/poketool/trainer/trdata/narc_0218.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0219.bin b/files/poketool/trainer/trdata/narc_0219.bin
deleted file mode 100644
index b245c3b1..00000000
--- a/files/poketool/trainer/trdata/narc_0219.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0220.bin b/files/poketool/trainer/trdata/narc_0220.bin
deleted file mode 100644
index 3ff5b340..00000000
--- a/files/poketool/trainer/trdata/narc_0220.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0221.bin b/files/poketool/trainer/trdata/narc_0221.bin
deleted file mode 100644
index 2338a967..00000000
--- a/files/poketool/trainer/trdata/narc_0221.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0222.bin b/files/poketool/trainer/trdata/narc_0222.bin
deleted file mode 100644
index be36e090..00000000
--- a/files/poketool/trainer/trdata/narc_0222.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0223.bin b/files/poketool/trainer/trdata/narc_0223.bin
deleted file mode 100644
index 5f50e7c6..00000000
--- a/files/poketool/trainer/trdata/narc_0223.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0224.bin b/files/poketool/trainer/trdata/narc_0224.bin
deleted file mode 100644
index 150ff10e..00000000
--- a/files/poketool/trainer/trdata/narc_0224.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0225.bin b/files/poketool/trainer/trdata/narc_0225.bin
deleted file mode 100644
index e5a38ad2..00000000
--- a/files/poketool/trainer/trdata/narc_0225.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0226.bin b/files/poketool/trainer/trdata/narc_0226.bin
deleted file mode 100644
index 7bfc3d16..00000000
--- a/files/poketool/trainer/trdata/narc_0226.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0227.bin b/files/poketool/trainer/trdata/narc_0227.bin
deleted file mode 100644
index 7bfc3d16..00000000
--- a/files/poketool/trainer/trdata/narc_0227.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0228.bin b/files/poketool/trainer/trdata/narc_0228.bin
deleted file mode 100644
index 8d46840d..00000000
--- a/files/poketool/trainer/trdata/narc_0228.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0229.bin b/files/poketool/trainer/trdata/narc_0229.bin
deleted file mode 100644
index fd1f828c..00000000
--- a/files/poketool/trainer/trdata/narc_0229.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0230.bin b/files/poketool/trainer/trdata/narc_0230.bin
deleted file mode 100644
index b245c3b1..00000000
--- a/files/poketool/trainer/trdata/narc_0230.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0231.bin b/files/poketool/trainer/trdata/narc_0231.bin
deleted file mode 100644
index fab42c3c..00000000
--- a/files/poketool/trainer/trdata/narc_0231.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0232.bin b/files/poketool/trainer/trdata/narc_0232.bin
deleted file mode 100644
index 77dec775..00000000
--- a/files/poketool/trainer/trdata/narc_0232.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0233.bin b/files/poketool/trainer/trdata/narc_0233.bin
deleted file mode 100644
index b954069c..00000000
--- a/files/poketool/trainer/trdata/narc_0233.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0234.bin b/files/poketool/trainer/trdata/narc_0234.bin
deleted file mode 100644
index bfd4bed2..00000000
--- a/files/poketool/trainer/trdata/narc_0234.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0235.bin b/files/poketool/trainer/trdata/narc_0235.bin
deleted file mode 100644
index c68fff44..00000000
--- a/files/poketool/trainer/trdata/narc_0235.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0236.bin b/files/poketool/trainer/trdata/narc_0236.bin
deleted file mode 100644
index f61b201a..00000000
--- a/files/poketool/trainer/trdata/narc_0236.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0237.bin b/files/poketool/trainer/trdata/narc_0237.bin
deleted file mode 100644
index f61b201a..00000000
--- a/files/poketool/trainer/trdata/narc_0237.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0238.bin b/files/poketool/trainer/trdata/narc_0238.bin
deleted file mode 100644
index 7f3f4d63..00000000
--- a/files/poketool/trainer/trdata/narc_0238.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0239.bin b/files/poketool/trainer/trdata/narc_0239.bin
deleted file mode 100644
index cc4b0ebf..00000000
--- a/files/poketool/trainer/trdata/narc_0239.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0240.bin b/files/poketool/trainer/trdata/narc_0240.bin
deleted file mode 100644
index 8d46840d..00000000
--- a/files/poketool/trainer/trdata/narc_0240.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0241.bin b/files/poketool/trainer/trdata/narc_0241.bin
deleted file mode 100644
index 2bbdea64..00000000
--- a/files/poketool/trainer/trdata/narc_0241.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0242.bin b/files/poketool/trainer/trdata/narc_0242.bin
deleted file mode 100644
index 3ff5b340..00000000
--- a/files/poketool/trainer/trdata/narc_0242.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0243.bin b/files/poketool/trainer/trdata/narc_0243.bin
deleted file mode 100644
index b58a1adb..00000000
--- a/files/poketool/trainer/trdata/narc_0243.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0244.bin b/files/poketool/trainer/trdata/narc_0244.bin
deleted file mode 100644
index 58ac33b0..00000000
--- a/files/poketool/trainer/trdata/narc_0244.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0245.bin b/files/poketool/trainer/trdata/narc_0245.bin
deleted file mode 100644
index 2b6fc472..00000000
--- a/files/poketool/trainer/trdata/narc_0245.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0246.bin b/files/poketool/trainer/trdata/narc_0246.bin
deleted file mode 100644
index feeff6e6..00000000
--- a/files/poketool/trainer/trdata/narc_0246.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0247.bin b/files/poketool/trainer/trdata/narc_0247.bin
deleted file mode 100644
index e5d8c9a2..00000000
--- a/files/poketool/trainer/trdata/narc_0247.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0248.bin b/files/poketool/trainer/trdata/narc_0248.bin
deleted file mode 100644
index e5d8c9a2..00000000
--- a/files/poketool/trainer/trdata/narc_0248.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0249.bin b/files/poketool/trainer/trdata/narc_0249.bin
deleted file mode 100644
index e5d8c9a2..00000000
--- a/files/poketool/trainer/trdata/narc_0249.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0250.bin b/files/poketool/trainer/trdata/narc_0250.bin
deleted file mode 100644
index e19b8c0e..00000000
--- a/files/poketool/trainer/trdata/narc_0250.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0251.bin b/files/poketool/trainer/trdata/narc_0251.bin
deleted file mode 100644
index a7f8a89a..00000000
--- a/files/poketool/trainer/trdata/narc_0251.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0252.bin b/files/poketool/trainer/trdata/narc_0252.bin
deleted file mode 100644
index 69c6f738..00000000
--- a/files/poketool/trainer/trdata/narc_0252.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0253.bin b/files/poketool/trainer/trdata/narc_0253.bin
deleted file mode 100644
index 69c6f738..00000000
--- a/files/poketool/trainer/trdata/narc_0253.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0254.bin b/files/poketool/trainer/trdata/narc_0254.bin
deleted file mode 100644
index 69c6f738..00000000
--- a/files/poketool/trainer/trdata/narc_0254.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0255.bin b/files/poketool/trainer/trdata/narc_0255.bin
deleted file mode 100644
index 69c6f738..00000000
--- a/files/poketool/trainer/trdata/narc_0255.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0256.bin b/files/poketool/trainer/trdata/narc_0256.bin
deleted file mode 100644
index 707f1525..00000000
--- a/files/poketool/trainer/trdata/narc_0256.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0257.bin b/files/poketool/trainer/trdata/narc_0257.bin
deleted file mode 100644
index d68549f0..00000000
--- a/files/poketool/trainer/trdata/narc_0257.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0258.bin b/files/poketool/trainer/trdata/narc_0258.bin
deleted file mode 100644
index 9c9d3435..00000000
--- a/files/poketool/trainer/trdata/narc_0258.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0259.bin b/files/poketool/trainer/trdata/narc_0259.bin
deleted file mode 100644
index 5e82fd45..00000000
--- a/files/poketool/trainer/trdata/narc_0259.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0260.bin b/files/poketool/trainer/trdata/narc_0260.bin
deleted file mode 100644
index 8ea78b0a..00000000
--- a/files/poketool/trainer/trdata/narc_0260.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0261.bin b/files/poketool/trainer/trdata/narc_0261.bin
deleted file mode 100644
index 7464edbf..00000000
--- a/files/poketool/trainer/trdata/narc_0261.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0262.bin b/files/poketool/trainer/trdata/narc_0262.bin
deleted file mode 100644
index 3d0df004..00000000
--- a/files/poketool/trainer/trdata/narc_0262.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0263.bin b/files/poketool/trainer/trdata/narc_0263.bin
deleted file mode 100644
index 832f2d02..00000000
--- a/files/poketool/trainer/trdata/narc_0263.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0264.bin b/files/poketool/trainer/trdata/narc_0264.bin
deleted file mode 100644
index e4a85266..00000000
--- a/files/poketool/trainer/trdata/narc_0264.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0265.bin b/files/poketool/trainer/trdata/narc_0265.bin
deleted file mode 100644
index 69c6f738..00000000
--- a/files/poketool/trainer/trdata/narc_0265.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0266.bin b/files/poketool/trainer/trdata/narc_0266.bin
deleted file mode 100644
index 1e546e4d..00000000
--- a/files/poketool/trainer/trdata/narc_0266.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0267.bin b/files/poketool/trainer/trdata/narc_0267.bin
deleted file mode 100644
index 39fce73d..00000000
--- a/files/poketool/trainer/trdata/narc_0267.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0268.bin b/files/poketool/trainer/trdata/narc_0268.bin
deleted file mode 100644
index d02a85a5..00000000
--- a/files/poketool/trainer/trdata/narc_0268.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0269.bin b/files/poketool/trainer/trdata/narc_0269.bin
deleted file mode 100644
index 19d0b19d..00000000
--- a/files/poketool/trainer/trdata/narc_0269.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0270.bin b/files/poketool/trainer/trdata/narc_0270.bin
deleted file mode 100644
index 02272b8e..00000000
--- a/files/poketool/trainer/trdata/narc_0270.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0271.bin b/files/poketool/trainer/trdata/narc_0271.bin
deleted file mode 100644
index 0eb6d263..00000000
--- a/files/poketool/trainer/trdata/narc_0271.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0272.bin b/files/poketool/trainer/trdata/narc_0272.bin
deleted file mode 100644
index 19a45642..00000000
--- a/files/poketool/trainer/trdata/narc_0272.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0273.bin b/files/poketool/trainer/trdata/narc_0273.bin
deleted file mode 100644
index 19a45642..00000000
--- a/files/poketool/trainer/trdata/narc_0273.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0274.bin b/files/poketool/trainer/trdata/narc_0274.bin
deleted file mode 100644
index 19a45642..00000000
--- a/files/poketool/trainer/trdata/narc_0274.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0275.bin b/files/poketool/trainer/trdata/narc_0275.bin
deleted file mode 100644
index 19a45642..00000000
--- a/files/poketool/trainer/trdata/narc_0275.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0276.bin b/files/poketool/trainer/trdata/narc_0276.bin
deleted file mode 100644
index 19a45642..00000000
--- a/files/poketool/trainer/trdata/narc_0276.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0277.bin b/files/poketool/trainer/trdata/narc_0277.bin
deleted file mode 100644
index c9b2c5ba..00000000
--- a/files/poketool/trainer/trdata/narc_0277.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0278.bin b/files/poketool/trainer/trdata/narc_0278.bin
deleted file mode 100644
index 1a48a8ce..00000000
--- a/files/poketool/trainer/trdata/narc_0278.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0279.bin b/files/poketool/trainer/trdata/narc_0279.bin
deleted file mode 100644
index 1a48a8ce..00000000
--- a/files/poketool/trainer/trdata/narc_0279.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0280.bin b/files/poketool/trainer/trdata/narc_0280.bin
deleted file mode 100644
index 150ff10e..00000000
--- a/files/poketool/trainer/trdata/narc_0280.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0281.bin b/files/poketool/trainer/trdata/narc_0281.bin
deleted file mode 100644
index 1a48a8ce..00000000
--- a/files/poketool/trainer/trdata/narc_0281.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0282.bin b/files/poketool/trainer/trdata/narc_0282.bin
deleted file mode 100644
index 1a48a8ce..00000000
--- a/files/poketool/trainer/trdata/narc_0282.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0283.bin b/files/poketool/trainer/trdata/narc_0283.bin
deleted file mode 100644
index c1b66113..00000000
--- a/files/poketool/trainer/trdata/narc_0283.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0284.bin b/files/poketool/trainer/trdata/narc_0284.bin
deleted file mode 100644
index 7bfc3d16..00000000
--- a/files/poketool/trainer/trdata/narc_0284.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0285.bin b/files/poketool/trainer/trdata/narc_0285.bin
deleted file mode 100644
index 7bfc3d16..00000000
--- a/files/poketool/trainer/trdata/narc_0285.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0286.bin b/files/poketool/trainer/trdata/narc_0286.bin
deleted file mode 100644
index c1b66113..00000000
--- a/files/poketool/trainer/trdata/narc_0286.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0287.bin b/files/poketool/trainer/trdata/narc_0287.bin
deleted file mode 100644
index 7bfc3d16..00000000
--- a/files/poketool/trainer/trdata/narc_0287.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0288.bin b/files/poketool/trainer/trdata/narc_0288.bin
deleted file mode 100644
index 5ce2c67c..00000000
--- a/files/poketool/trainer/trdata/narc_0288.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0289.bin b/files/poketool/trainer/trdata/narc_0289.bin
deleted file mode 100644
index c68fff44..00000000
--- a/files/poketool/trainer/trdata/narc_0289.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0290.bin b/files/poketool/trainer/trdata/narc_0290.bin
deleted file mode 100644
index 141f67b9..00000000
--- a/files/poketool/trainer/trdata/narc_0290.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0291.bin b/files/poketool/trainer/trdata/narc_0291.bin
deleted file mode 100644
index e79d339f..00000000
--- a/files/poketool/trainer/trdata/narc_0291.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0292.bin b/files/poketool/trainer/trdata/narc_0292.bin
deleted file mode 100644
index 4f026089..00000000
--- a/files/poketool/trainer/trdata/narc_0292.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0293.bin b/files/poketool/trainer/trdata/narc_0293.bin
deleted file mode 100644
index 1567b7b2..00000000
--- a/files/poketool/trainer/trdata/narc_0293.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0294.bin b/files/poketool/trainer/trdata/narc_0294.bin
deleted file mode 100644
index 5b752f7d..00000000
--- a/files/poketool/trainer/trdata/narc_0294.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0295.bin b/files/poketool/trainer/trdata/narc_0295.bin
deleted file mode 100644
index 0a9b9b0a..00000000
--- a/files/poketool/trainer/trdata/narc_0295.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0296.bin b/files/poketool/trainer/trdata/narc_0296.bin
deleted file mode 100644
index ba35ff8c..00000000
--- a/files/poketool/trainer/trdata/narc_0296.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0297.bin b/files/poketool/trainer/trdata/narc_0297.bin
deleted file mode 100644
index b5fae930..00000000
--- a/files/poketool/trainer/trdata/narc_0297.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0298.bin b/files/poketool/trainer/trdata/narc_0298.bin
deleted file mode 100644
index b5fae930..00000000
--- a/files/poketool/trainer/trdata/narc_0298.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0299.bin b/files/poketool/trainer/trdata/narc_0299.bin
deleted file mode 100644
index 4e09951f..00000000
--- a/files/poketool/trainer/trdata/narc_0299.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0300.bin b/files/poketool/trainer/trdata/narc_0300.bin
deleted file mode 100644
index f322b90e..00000000
--- a/files/poketool/trainer/trdata/narc_0300.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0301.bin b/files/poketool/trainer/trdata/narc_0301.bin
deleted file mode 100644
index 71ecbdf7..00000000
--- a/files/poketool/trainer/trdata/narc_0301.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0302.bin b/files/poketool/trainer/trdata/narc_0302.bin
deleted file mode 100644
index 04384397..00000000
--- a/files/poketool/trainer/trdata/narc_0302.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0303.bin b/files/poketool/trainer/trdata/narc_0303.bin
deleted file mode 100644
index 71ecbdf7..00000000
--- a/files/poketool/trainer/trdata/narc_0303.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0304.bin b/files/poketool/trainer/trdata/narc_0304.bin
deleted file mode 100644
index de816f46..00000000
--- a/files/poketool/trainer/trdata/narc_0304.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0305.bin b/files/poketool/trainer/trdata/narc_0305.bin
deleted file mode 100644
index 8694d813..00000000
--- a/files/poketool/trainer/trdata/narc_0305.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0306.bin b/files/poketool/trainer/trdata/narc_0306.bin
deleted file mode 100644
index 772fdcef..00000000
--- a/files/poketool/trainer/trdata/narc_0306.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0307.bin b/files/poketool/trainer/trdata/narc_0307.bin
deleted file mode 100644
index 2f326060..00000000
--- a/files/poketool/trainer/trdata/narc_0307.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0308.bin b/files/poketool/trainer/trdata/narc_0308.bin
deleted file mode 100644
index 772fdcef..00000000
--- a/files/poketool/trainer/trdata/narc_0308.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0309.bin b/files/poketool/trainer/trdata/narc_0309.bin
deleted file mode 100644
index d7baba3c..00000000
--- a/files/poketool/trainer/trdata/narc_0309.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0310.bin b/files/poketool/trainer/trdata/narc_0310.bin
deleted file mode 100644
index d7baba3c..00000000
--- a/files/poketool/trainer/trdata/narc_0310.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0311.bin b/files/poketool/trainer/trdata/narc_0311.bin
deleted file mode 100644
index 5d56750e..00000000
--- a/files/poketool/trainer/trdata/narc_0311.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0312.bin b/files/poketool/trainer/trdata/narc_0312.bin
deleted file mode 100644
index 77dec775..00000000
--- a/files/poketool/trainer/trdata/narc_0312.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0313.bin b/files/poketool/trainer/trdata/narc_0313.bin
deleted file mode 100644
index e6ddce27..00000000
--- a/files/poketool/trainer/trdata/narc_0313.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0314.bin b/files/poketool/trainer/trdata/narc_0314.bin
deleted file mode 100644
index 5d56750e..00000000
--- a/files/poketool/trainer/trdata/narc_0314.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0315.bin b/files/poketool/trainer/trdata/narc_0315.bin
deleted file mode 100644
index 7531a2b9..00000000
--- a/files/poketool/trainer/trdata/narc_0315.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0316.bin b/files/poketool/trainer/trdata/narc_0316.bin
deleted file mode 100644
index 9f14e5fb..00000000
--- a/files/poketool/trainer/trdata/narc_0316.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0317.bin b/files/poketool/trainer/trdata/narc_0317.bin
deleted file mode 100644
index a363a260..00000000
--- a/files/poketool/trainer/trdata/narc_0317.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0318.bin b/files/poketool/trainer/trdata/narc_0318.bin
deleted file mode 100644
index 7c7b14fb..00000000
--- a/files/poketool/trainer/trdata/narc_0318.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0319.bin b/files/poketool/trainer/trdata/narc_0319.bin
deleted file mode 100644
index 87719c31..00000000
--- a/files/poketool/trainer/trdata/narc_0319.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0320.bin b/files/poketool/trainer/trdata/narc_0320.bin
deleted file mode 100644
index 6cf82d80..00000000
--- a/files/poketool/trainer/trdata/narc_0320.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0321.bin b/files/poketool/trainer/trdata/narc_0321.bin
deleted file mode 100644
index cc4b0ebf..00000000
--- a/files/poketool/trainer/trdata/narc_0321.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0322.bin b/files/poketool/trainer/trdata/narc_0322.bin
deleted file mode 100644
index f1a6c7be..00000000
--- a/files/poketool/trainer/trdata/narc_0322.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0323.bin b/files/poketool/trainer/trdata/narc_0323.bin
deleted file mode 100644
index 29ca855d..00000000
--- a/files/poketool/trainer/trdata/narc_0323.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0324.bin b/files/poketool/trainer/trdata/narc_0324.bin
deleted file mode 100644
index ae12af86..00000000
--- a/files/poketool/trainer/trdata/narc_0324.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0325.bin b/files/poketool/trainer/trdata/narc_0325.bin
deleted file mode 100644
index 95fa6375..00000000
--- a/files/poketool/trainer/trdata/narc_0325.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0326.bin b/files/poketool/trainer/trdata/narc_0326.bin
deleted file mode 100644
index 34600ee3..00000000
--- a/files/poketool/trainer/trdata/narc_0326.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0327.bin b/files/poketool/trainer/trdata/narc_0327.bin
deleted file mode 100644
index c4fad157..00000000
--- a/files/poketool/trainer/trdata/narc_0327.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0328.bin b/files/poketool/trainer/trdata/narc_0328.bin
deleted file mode 100644
index d80b5fa5..00000000
--- a/files/poketool/trainer/trdata/narc_0328.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0329.bin b/files/poketool/trainer/trdata/narc_0329.bin
deleted file mode 100644
index 4766aa43..00000000
--- a/files/poketool/trainer/trdata/narc_0329.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0330.bin b/files/poketool/trainer/trdata/narc_0330.bin
deleted file mode 100644
index 4766aa43..00000000
--- a/files/poketool/trainer/trdata/narc_0330.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0331.bin b/files/poketool/trainer/trdata/narc_0331.bin
deleted file mode 100644
index a3e02695..00000000
--- a/files/poketool/trainer/trdata/narc_0331.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0332.bin b/files/poketool/trainer/trdata/narc_0332.bin
deleted file mode 100644
index 7611c80a..00000000
--- a/files/poketool/trainer/trdata/narc_0332.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0333.bin b/files/poketool/trainer/trdata/narc_0333.bin
deleted file mode 100644
index 7611c80a..00000000
--- a/files/poketool/trainer/trdata/narc_0333.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0334.bin b/files/poketool/trainer/trdata/narc_0334.bin
deleted file mode 100644
index 3b1cf942..00000000
--- a/files/poketool/trainer/trdata/narc_0334.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0335.bin b/files/poketool/trainer/trdata/narc_0335.bin
deleted file mode 100644
index 3b1cf942..00000000
--- a/files/poketool/trainer/trdata/narc_0335.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0336.bin b/files/poketool/trainer/trdata/narc_0336.bin
deleted file mode 100644
index 493573f7..00000000
--- a/files/poketool/trainer/trdata/narc_0336.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0337.bin b/files/poketool/trainer/trdata/narc_0337.bin
deleted file mode 100644
index 3ff5b340..00000000
--- a/files/poketool/trainer/trdata/narc_0337.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0338.bin b/files/poketool/trainer/trdata/narc_0338.bin
deleted file mode 100644
index 972c8d32..00000000
--- a/files/poketool/trainer/trdata/narc_0338.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0339.bin b/files/poketool/trainer/trdata/narc_0339.bin
deleted file mode 100644
index 1205b2ae..00000000
--- a/files/poketool/trainer/trdata/narc_0339.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0340.bin b/files/poketool/trainer/trdata/narc_0340.bin
deleted file mode 100644
index 34773a14..00000000
--- a/files/poketool/trainer/trdata/narc_0340.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0341.bin b/files/poketool/trainer/trdata/narc_0341.bin
deleted file mode 100644
index 34773a14..00000000
--- a/files/poketool/trainer/trdata/narc_0341.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0342.bin b/files/poketool/trainer/trdata/narc_0342.bin
deleted file mode 100644
index 34773a14..00000000
--- a/files/poketool/trainer/trdata/narc_0342.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0343.bin b/files/poketool/trainer/trdata/narc_0343.bin
deleted file mode 100644
index 24a13ddd..00000000
--- a/files/poketool/trainer/trdata/narc_0343.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0344.bin b/files/poketool/trainer/trdata/narc_0344.bin
deleted file mode 100644
index 707d6b2a..00000000
--- a/files/poketool/trainer/trdata/narc_0344.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0345.bin b/files/poketool/trainer/trdata/narc_0345.bin
deleted file mode 100644
index 707d6b2a..00000000
--- a/files/poketool/trainer/trdata/narc_0345.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0346.bin b/files/poketool/trainer/trdata/narc_0346.bin
deleted file mode 100644
index b58a1adb..00000000
--- a/files/poketool/trainer/trdata/narc_0346.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0347.bin b/files/poketool/trainer/trdata/narc_0347.bin
deleted file mode 100644
index b58a1adb..00000000
--- a/files/poketool/trainer/trdata/narc_0347.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0348.bin b/files/poketool/trainer/trdata/narc_0348.bin
deleted file mode 100644
index bff1e47e..00000000
--- a/files/poketool/trainer/trdata/narc_0348.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0349.bin b/files/poketool/trainer/trdata/narc_0349.bin
deleted file mode 100644
index b7e00871..00000000
--- a/files/poketool/trainer/trdata/narc_0349.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0350.bin b/files/poketool/trainer/trdata/narc_0350.bin
deleted file mode 100644
index 75ef0429..00000000
--- a/files/poketool/trainer/trdata/narc_0350.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0351.bin b/files/poketool/trainer/trdata/narc_0351.bin
deleted file mode 100644
index f4f52d21..00000000
--- a/files/poketool/trainer/trdata/narc_0351.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0352.bin b/files/poketool/trainer/trdata/narc_0352.bin
deleted file mode 100644
index f4f52d21..00000000
--- a/files/poketool/trainer/trdata/narc_0352.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0353.bin b/files/poketool/trainer/trdata/narc_0353.bin
deleted file mode 100644
index 172b4b81..00000000
--- a/files/poketool/trainer/trdata/narc_0353.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0354.bin b/files/poketool/trainer/trdata/narc_0354.bin
deleted file mode 100644
index 172b4b81..00000000
--- a/files/poketool/trainer/trdata/narc_0354.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0355.bin b/files/poketool/trainer/trdata/narc_0355.bin
deleted file mode 100644
index 7f3f4d63..00000000
--- a/files/poketool/trainer/trdata/narc_0355.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0356.bin b/files/poketool/trainer/trdata/narc_0356.bin
deleted file mode 100644
index 58ac33b0..00000000
--- a/files/poketool/trainer/trdata/narc_0356.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0357.bin b/files/poketool/trainer/trdata/narc_0357.bin
deleted file mode 100644
index 2b6fc472..00000000
--- a/files/poketool/trainer/trdata/narc_0357.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0358.bin b/files/poketool/trainer/trdata/narc_0358.bin
deleted file mode 100644
index 87c08c98..00000000
--- a/files/poketool/trainer/trdata/narc_0358.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0359.bin b/files/poketool/trainer/trdata/narc_0359.bin
deleted file mode 100644
index 3855e65d..00000000
--- a/files/poketool/trainer/trdata/narc_0359.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0360.bin b/files/poketool/trainer/trdata/narc_0360.bin
deleted file mode 100644
index 25b4b422..00000000
--- a/files/poketool/trainer/trdata/narc_0360.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0361.bin b/files/poketool/trainer/trdata/narc_0361.bin
deleted file mode 100644
index 0ece065b..00000000
--- a/files/poketool/trainer/trdata/narc_0361.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0362.bin b/files/poketool/trainer/trdata/narc_0362.bin
deleted file mode 100644
index 8d46840d..00000000
--- a/files/poketool/trainer/trdata/narc_0362.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0363.bin b/files/poketool/trainer/trdata/narc_0363.bin
deleted file mode 100644
index 0ac27deb..00000000
--- a/files/poketool/trainer/trdata/narc_0363.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0364.bin b/files/poketool/trainer/trdata/narc_0364.bin
deleted file mode 100644
index 0ac27deb..00000000
--- a/files/poketool/trainer/trdata/narc_0364.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0365.bin b/files/poketool/trainer/trdata/narc_0365.bin
deleted file mode 100644
index 0ac27deb..00000000
--- a/files/poketool/trainer/trdata/narc_0365.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0366.bin b/files/poketool/trainer/trdata/narc_0366.bin
deleted file mode 100644
index faa97bff..00000000
--- a/files/poketool/trainer/trdata/narc_0366.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0367.bin b/files/poketool/trainer/trdata/narc_0367.bin
deleted file mode 100644
index bda798c4..00000000
--- a/files/poketool/trainer/trdata/narc_0367.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0368.bin b/files/poketool/trainer/trdata/narc_0368.bin
deleted file mode 100644
index 84abdd3a..00000000
--- a/files/poketool/trainer/trdata/narc_0368.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0369.bin b/files/poketool/trainer/trdata/narc_0369.bin
deleted file mode 100644
index 1a29e585..00000000
--- a/files/poketool/trainer/trdata/narc_0369.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0370.bin b/files/poketool/trainer/trdata/narc_0370.bin
deleted file mode 100644
index a4bac0b2..00000000
--- a/files/poketool/trainer/trdata/narc_0370.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0371.bin b/files/poketool/trainer/trdata/narc_0371.bin
deleted file mode 100644
index cffdde91..00000000
--- a/files/poketool/trainer/trdata/narc_0371.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0372.bin b/files/poketool/trainer/trdata/narc_0372.bin
deleted file mode 100644
index dd29802e..00000000
--- a/files/poketool/trainer/trdata/narc_0372.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0373.bin b/files/poketool/trainer/trdata/narc_0373.bin
deleted file mode 100644
index b954069c..00000000
--- a/files/poketool/trainer/trdata/narc_0373.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0374.bin b/files/poketool/trainer/trdata/narc_0374.bin
deleted file mode 100644
index f31f73f7..00000000
--- a/files/poketool/trainer/trdata/narc_0374.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0375.bin b/files/poketool/trainer/trdata/narc_0375.bin
deleted file mode 100644
index 7ddeabc9..00000000
--- a/files/poketool/trainer/trdata/narc_0375.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0376.bin b/files/poketool/trainer/trdata/narc_0376.bin
deleted file mode 100644
index 1a29e585..00000000
--- a/files/poketool/trainer/trdata/narc_0376.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0377.bin b/files/poketool/trainer/trdata/narc_0377.bin
deleted file mode 100644
index 02a78315..00000000
--- a/files/poketool/trainer/trdata/narc_0377.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0378.bin b/files/poketool/trainer/trdata/narc_0378.bin
deleted file mode 100644
index 5bec4752..00000000
--- a/files/poketool/trainer/trdata/narc_0378.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0379.bin b/files/poketool/trainer/trdata/narc_0379.bin
deleted file mode 100644
index 5bec4752..00000000
--- a/files/poketool/trainer/trdata/narc_0379.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0380.bin b/files/poketool/trainer/trdata/narc_0380.bin
deleted file mode 100644
index 5bec4752..00000000
--- a/files/poketool/trainer/trdata/narc_0380.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0381.bin b/files/poketool/trainer/trdata/narc_0381.bin
deleted file mode 100644
index 19a45642..00000000
--- a/files/poketool/trainer/trdata/narc_0381.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0382.bin b/files/poketool/trainer/trdata/narc_0382.bin
deleted file mode 100644
index 19a45642..00000000
--- a/files/poketool/trainer/trdata/narc_0382.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0383.bin b/files/poketool/trainer/trdata/narc_0383.bin
deleted file mode 100644
index 19a45642..00000000
--- a/files/poketool/trainer/trdata/narc_0383.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0384.bin b/files/poketool/trainer/trdata/narc_0384.bin
deleted file mode 100644
index 0b892d1d..00000000
--- a/files/poketool/trainer/trdata/narc_0384.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0385.bin b/files/poketool/trainer/trdata/narc_0385.bin
deleted file mode 100644
index 33bbf307..00000000
--- a/files/poketool/trainer/trdata/narc_0385.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0386.bin b/files/poketool/trainer/trdata/narc_0386.bin
deleted file mode 100644
index c9b2c5ba..00000000
--- a/files/poketool/trainer/trdata/narc_0386.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0387.bin b/files/poketool/trainer/trdata/narc_0387.bin
deleted file mode 100644
index b5fceed9..00000000
--- a/files/poketool/trainer/trdata/narc_0387.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0388.bin b/files/poketool/trainer/trdata/narc_0388.bin
deleted file mode 100644
index 150ff10e..00000000
--- a/files/poketool/trainer/trdata/narc_0388.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0389.bin b/files/poketool/trainer/trdata/narc_0389.bin
deleted file mode 100644
index 150ff10e..00000000
--- a/files/poketool/trainer/trdata/narc_0389.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0390.bin b/files/poketool/trainer/trdata/narc_0390.bin
deleted file mode 100644
index 1a48a8ce..00000000
--- a/files/poketool/trainer/trdata/narc_0390.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0391.bin b/files/poketool/trainer/trdata/narc_0391.bin
deleted file mode 100644
index a7f8a89a..00000000
--- a/files/poketool/trainer/trdata/narc_0391.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0392.bin b/files/poketool/trainer/trdata/narc_0392.bin
deleted file mode 100644
index 7bfc3d16..00000000
--- a/files/poketool/trainer/trdata/narc_0392.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0393.bin b/files/poketool/trainer/trdata/narc_0393.bin
deleted file mode 100644
index 5f5dee1e..00000000
--- a/files/poketool/trainer/trdata/narc_0393.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0394.bin b/files/poketool/trainer/trdata/narc_0394.bin
deleted file mode 100644
index 5f5dee1e..00000000
--- a/files/poketool/trainer/trdata/narc_0394.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0395.bin b/files/poketool/trainer/trdata/narc_0395.bin
deleted file mode 100644
index 69954115..00000000
--- a/files/poketool/trainer/trdata/narc_0395.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0396.bin b/files/poketool/trainer/trdata/narc_0396.bin
deleted file mode 100644
index 69954115..00000000
--- a/files/poketool/trainer/trdata/narc_0396.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0397.bin b/files/poketool/trainer/trdata/narc_0397.bin
deleted file mode 100644
index 69954115..00000000
--- a/files/poketool/trainer/trdata/narc_0397.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0398.bin b/files/poketool/trainer/trdata/narc_0398.bin
deleted file mode 100644
index f239c87b..00000000
--- a/files/poketool/trainer/trdata/narc_0398.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0399.bin b/files/poketool/trainer/trdata/narc_0399.bin
deleted file mode 100644
index c68fff44..00000000
--- a/files/poketool/trainer/trdata/narc_0399.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0400.bin b/files/poketool/trainer/trdata/narc_0400.bin
deleted file mode 100644
index c68fff44..00000000
--- a/files/poketool/trainer/trdata/narc_0400.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0401.bin b/files/poketool/trainer/trdata/narc_0401.bin
deleted file mode 100644
index 5eb40ab0..00000000
--- a/files/poketool/trainer/trdata/narc_0401.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0402.bin b/files/poketool/trainer/trdata/narc_0402.bin
deleted file mode 100644
index 65f46d42..00000000
--- a/files/poketool/trainer/trdata/narc_0402.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0403.bin b/files/poketool/trainer/trdata/narc_0403.bin
deleted file mode 100644
index cf7404e8..00000000
--- a/files/poketool/trainer/trdata/narc_0403.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0404.bin b/files/poketool/trainer/trdata/narc_0404.bin
deleted file mode 100644
index 35a99bfa..00000000
--- a/files/poketool/trainer/trdata/narc_0404.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0405.bin b/files/poketool/trainer/trdata/narc_0405.bin
deleted file mode 100644
index 52d1e27f..00000000
--- a/files/poketool/trainer/trdata/narc_0405.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0406.bin b/files/poketool/trainer/trdata/narc_0406.bin
deleted file mode 100644
index 87852afd..00000000
--- a/files/poketool/trainer/trdata/narc_0406.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0407.bin b/files/poketool/trainer/trdata/narc_0407.bin
deleted file mode 100644
index 8d6b8c08..00000000
--- a/files/poketool/trainer/trdata/narc_0407.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0408.bin b/files/poketool/trainer/trdata/narc_0408.bin
deleted file mode 100644
index bdd1a4c8..00000000
--- a/files/poketool/trainer/trdata/narc_0408.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0409.bin b/files/poketool/trainer/trdata/narc_0409.bin
deleted file mode 100644
index bdd1a4c8..00000000
--- a/files/poketool/trainer/trdata/narc_0409.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0410.bin b/files/poketool/trainer/trdata/narc_0410.bin
deleted file mode 100644
index ba35ff8c..00000000
--- a/files/poketool/trainer/trdata/narc_0410.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0411.bin b/files/poketool/trainer/trdata/narc_0411.bin
deleted file mode 100644
index 5c3198fb..00000000
--- a/files/poketool/trainer/trdata/narc_0411.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0412.bin b/files/poketool/trainer/trdata/narc_0412.bin
deleted file mode 100644
index ba35ff8c..00000000
--- a/files/poketool/trainer/trdata/narc_0412.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0413.bin b/files/poketool/trainer/trdata/narc_0413.bin
deleted file mode 100644
index 5c3198fb..00000000
--- a/files/poketool/trainer/trdata/narc_0413.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0414.bin b/files/poketool/trainer/trdata/narc_0414.bin
deleted file mode 100644
index b5fae930..00000000
--- a/files/poketool/trainer/trdata/narc_0414.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0415.bin b/files/poketool/trainer/trdata/narc_0415.bin
deleted file mode 100644
index 5c3198fb..00000000
--- a/files/poketool/trainer/trdata/narc_0415.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0416.bin b/files/poketool/trainer/trdata/narc_0416.bin
deleted file mode 100644
index 4e09951f..00000000
--- a/files/poketool/trainer/trdata/narc_0416.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0417.bin b/files/poketool/trainer/trdata/narc_0417.bin
deleted file mode 100644
index 4e09951f..00000000
--- a/files/poketool/trainer/trdata/narc_0417.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0418.bin b/files/poketool/trainer/trdata/narc_0418.bin
deleted file mode 100644
index d7e26687..00000000
--- a/files/poketool/trainer/trdata/narc_0418.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0419.bin b/files/poketool/trainer/trdata/narc_0419.bin
deleted file mode 100644
index 5c3198fb..00000000
--- a/files/poketool/trainer/trdata/narc_0419.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0420.bin b/files/poketool/trainer/trdata/narc_0420.bin
deleted file mode 100644
index 4e09951f..00000000
--- a/files/poketool/trainer/trdata/narc_0420.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0421.bin b/files/poketool/trainer/trdata/narc_0421.bin
deleted file mode 100644
index 74051774..00000000
--- a/files/poketool/trainer/trdata/narc_0421.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0422.bin b/files/poketool/trainer/trdata/narc_0422.bin
deleted file mode 100644
index 39b9f511..00000000
--- a/files/poketool/trainer/trdata/narc_0422.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0423.bin b/files/poketool/trainer/trdata/narc_0423.bin
deleted file mode 100644
index 412c3d60..00000000
--- a/files/poketool/trainer/trdata/narc_0423.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0424.bin b/files/poketool/trainer/trdata/narc_0424.bin
deleted file mode 100644
index 6fd4e3c5..00000000
--- a/files/poketool/trainer/trdata/narc_0424.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0425.bin b/files/poketool/trainer/trdata/narc_0425.bin
deleted file mode 100644
index 74051774..00000000
--- a/files/poketool/trainer/trdata/narc_0425.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0426.bin b/files/poketool/trainer/trdata/narc_0426.bin
deleted file mode 100644
index 412c3d60..00000000
--- a/files/poketool/trainer/trdata/narc_0426.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0427.bin b/files/poketool/trainer/trdata/narc_0427.bin
deleted file mode 100644
index 74051774..00000000
--- a/files/poketool/trainer/trdata/narc_0427.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0428.bin b/files/poketool/trainer/trdata/narc_0428.bin
deleted file mode 100644
index 6fd4e3c5..00000000
--- a/files/poketool/trainer/trdata/narc_0428.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0429.bin b/files/poketool/trainer/trdata/narc_0429.bin
deleted file mode 100644
index 6fd4e3c5..00000000
--- a/files/poketool/trainer/trdata/narc_0429.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0430.bin b/files/poketool/trainer/trdata/narc_0430.bin
deleted file mode 100644
index 74051774..00000000
--- a/files/poketool/trainer/trdata/narc_0430.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0431.bin b/files/poketool/trainer/trdata/narc_0431.bin
deleted file mode 100644
index 38ea0dda..00000000
--- a/files/poketool/trainer/trdata/narc_0431.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0432.bin b/files/poketool/trainer/trdata/narc_0432.bin
deleted file mode 100644
index f322b90e..00000000
--- a/files/poketool/trainer/trdata/narc_0432.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0433.bin b/files/poketool/trainer/trdata/narc_0433.bin
deleted file mode 100644
index f322b90e..00000000
--- a/files/poketool/trainer/trdata/narc_0433.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0434.bin b/files/poketool/trainer/trdata/narc_0434.bin
deleted file mode 100644
index f322b90e..00000000
--- a/files/poketool/trainer/trdata/narc_0434.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0435.bin b/files/poketool/trainer/trdata/narc_0435.bin
deleted file mode 100644
index f322b90e..00000000
--- a/files/poketool/trainer/trdata/narc_0435.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0436.bin b/files/poketool/trainer/trdata/narc_0436.bin
deleted file mode 100644
index f322b90e..00000000
--- a/files/poketool/trainer/trdata/narc_0436.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0437.bin b/files/poketool/trainer/trdata/narc_0437.bin
deleted file mode 100644
index 895c47bd..00000000
--- a/files/poketool/trainer/trdata/narc_0437.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0438.bin b/files/poketool/trainer/trdata/narc_0438.bin
deleted file mode 100644
index 895c47bd..00000000
--- a/files/poketool/trainer/trdata/narc_0438.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0439.bin b/files/poketool/trainer/trdata/narc_0439.bin
deleted file mode 100644
index 895c47bd..00000000
--- a/files/poketool/trainer/trdata/narc_0439.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0440.bin b/files/poketool/trainer/trdata/narc_0440.bin
deleted file mode 100644
index 895c47bd..00000000
--- a/files/poketool/trainer/trdata/narc_0440.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0441.bin b/files/poketool/trainer/trdata/narc_0441.bin
deleted file mode 100644
index 8694d813..00000000
--- a/files/poketool/trainer/trdata/narc_0441.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0442.bin b/files/poketool/trainer/trdata/narc_0442.bin
deleted file mode 100644
index 8694d813..00000000
--- a/files/poketool/trainer/trdata/narc_0442.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0443.bin b/files/poketool/trainer/trdata/narc_0443.bin
deleted file mode 100644
index de816f46..00000000
--- a/files/poketool/trainer/trdata/narc_0443.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0444.bin b/files/poketool/trainer/trdata/narc_0444.bin
deleted file mode 100644
index 9c9d3435..00000000
--- a/files/poketool/trainer/trdata/narc_0444.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0445.bin b/files/poketool/trainer/trdata/narc_0445.bin
deleted file mode 100644
index 9c9d3435..00000000
--- a/files/poketool/trainer/trdata/narc_0445.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0446.bin b/files/poketool/trainer/trdata/narc_0446.bin
deleted file mode 100644
index e6ddce27..00000000
--- a/files/poketool/trainer/trdata/narc_0446.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0447.bin b/files/poketool/trainer/trdata/narc_0447.bin
deleted file mode 100644
index e6ddce27..00000000
--- a/files/poketool/trainer/trdata/narc_0447.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0448.bin b/files/poketool/trainer/trdata/narc_0448.bin
deleted file mode 100644
index 26a335b7..00000000
--- a/files/poketool/trainer/trdata/narc_0448.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0449.bin b/files/poketool/trainer/trdata/narc_0449.bin
deleted file mode 100644
index cc4b0ebf..00000000
--- a/files/poketool/trainer/trdata/narc_0449.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0450.bin b/files/poketool/trainer/trdata/narc_0450.bin
deleted file mode 100644
index cc4b0ebf..00000000
--- a/files/poketool/trainer/trdata/narc_0450.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0451.bin b/files/poketool/trainer/trdata/narc_0451.bin
deleted file mode 100644
index 34600ee3..00000000
--- a/files/poketool/trainer/trdata/narc_0451.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0452.bin b/files/poketool/trainer/trdata/narc_0452.bin
deleted file mode 100644
index 6bbdce94..00000000
--- a/files/poketool/trainer/trdata/narc_0452.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0453.bin b/files/poketool/trainer/trdata/narc_0453.bin
deleted file mode 100644
index 34600ee3..00000000
--- a/files/poketool/trainer/trdata/narc_0453.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0454.bin b/files/poketool/trainer/trdata/narc_0454.bin
deleted file mode 100644
index 34600ee3..00000000
--- a/files/poketool/trainer/trdata/narc_0454.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0455.bin b/files/poketool/trainer/trdata/narc_0455.bin
deleted file mode 100644
index a26745d9..00000000
--- a/files/poketool/trainer/trdata/narc_0455.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0456.bin b/files/poketool/trainer/trdata/narc_0456.bin
deleted file mode 100644
index 63471c10..00000000
--- a/files/poketool/trainer/trdata/narc_0456.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0457.bin b/files/poketool/trainer/trdata/narc_0457.bin
deleted file mode 100644
index 4766aa43..00000000
--- a/files/poketool/trainer/trdata/narc_0457.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0458.bin b/files/poketool/trainer/trdata/narc_0458.bin
deleted file mode 100644
index 4766aa43..00000000
--- a/files/poketool/trainer/trdata/narc_0458.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0459.bin b/files/poketool/trainer/trdata/narc_0459.bin
deleted file mode 100644
index 63471c10..00000000
--- a/files/poketool/trainer/trdata/narc_0459.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0460.bin b/files/poketool/trainer/trdata/narc_0460.bin
deleted file mode 100644
index 94015172..00000000
--- a/files/poketool/trainer/trdata/narc_0460.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0461.bin b/files/poketool/trainer/trdata/narc_0461.bin
deleted file mode 100644
index 94015172..00000000
--- a/files/poketool/trainer/trdata/narc_0461.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0462.bin b/files/poketool/trainer/trdata/narc_0462.bin
deleted file mode 100644
index 94015172..00000000
--- a/files/poketool/trainer/trdata/narc_0462.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0463.bin b/files/poketool/trainer/trdata/narc_0463.bin
deleted file mode 100644
index 94015172..00000000
--- a/files/poketool/trainer/trdata/narc_0463.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0464.bin b/files/poketool/trainer/trdata/narc_0464.bin
deleted file mode 100644
index 94015172..00000000
--- a/files/poketool/trainer/trdata/narc_0464.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0465.bin b/files/poketool/trainer/trdata/narc_0465.bin
deleted file mode 100644
index 8cdac29c..00000000
--- a/files/poketool/trainer/trdata/narc_0465.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0466.bin b/files/poketool/trainer/trdata/narc_0466.bin
deleted file mode 100644
index cc11cd42..00000000
--- a/files/poketool/trainer/trdata/narc_0466.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0467.bin b/files/poketool/trainer/trdata/narc_0467.bin
deleted file mode 100644
index 3b1cf942..00000000
--- a/files/poketool/trainer/trdata/narc_0467.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0468.bin b/files/poketool/trainer/trdata/narc_0468.bin
deleted file mode 100644
index 3b1cf942..00000000
--- a/files/poketool/trainer/trdata/narc_0468.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0469.bin b/files/poketool/trainer/trdata/narc_0469.bin
deleted file mode 100644
index 493573f7..00000000
--- a/files/poketool/trainer/trdata/narc_0469.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0470.bin b/files/poketool/trainer/trdata/narc_0470.bin
deleted file mode 100644
index 2a39ff7f..00000000
--- a/files/poketool/trainer/trdata/narc_0470.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0471.bin b/files/poketool/trainer/trdata/narc_0471.bin
deleted file mode 100644
index 2a39ff7f..00000000
--- a/files/poketool/trainer/trdata/narc_0471.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0472.bin b/files/poketool/trainer/trdata/narc_0472.bin
deleted file mode 100644
index 2a39ff7f..00000000
--- a/files/poketool/trainer/trdata/narc_0472.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0473.bin b/files/poketool/trainer/trdata/narc_0473.bin
deleted file mode 100644
index 2a39ff7f..00000000
--- a/files/poketool/trainer/trdata/narc_0473.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0474.bin b/files/poketool/trainer/trdata/narc_0474.bin
deleted file mode 100644
index 2a39ff7f..00000000
--- a/files/poketool/trainer/trdata/narc_0474.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0475.bin b/files/poketool/trainer/trdata/narc_0475.bin
deleted file mode 100644
index 2a39ff7f..00000000
--- a/files/poketool/trainer/trdata/narc_0475.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0476.bin b/files/poketool/trainer/trdata/narc_0476.bin
deleted file mode 100644
index bc46df5a..00000000
--- a/files/poketool/trainer/trdata/narc_0476.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0477.bin b/files/poketool/trainer/trdata/narc_0477.bin
deleted file mode 100644
index bc46df5a..00000000
--- a/files/poketool/trainer/trdata/narc_0477.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0478.bin b/files/poketool/trainer/trdata/narc_0478.bin
deleted file mode 100644
index bc46df5a..00000000
--- a/files/poketool/trainer/trdata/narc_0478.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0479.bin b/files/poketool/trainer/trdata/narc_0479.bin
deleted file mode 100644
index c188464a..00000000
--- a/files/poketool/trainer/trdata/narc_0479.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0480.bin b/files/poketool/trainer/trdata/narc_0480.bin
deleted file mode 100644
index c188464a..00000000
--- a/files/poketool/trainer/trdata/narc_0480.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0481.bin b/files/poketool/trainer/trdata/narc_0481.bin
deleted file mode 100644
index c188464a..00000000
--- a/files/poketool/trainer/trdata/narc_0481.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0482.bin b/files/poketool/trainer/trdata/narc_0482.bin
deleted file mode 100644
index 7e07d284..00000000
--- a/files/poketool/trainer/trdata/narc_0482.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0483.bin b/files/poketool/trainer/trdata/narc_0483.bin
deleted file mode 100644
index 9d15a4ec..00000000
--- a/files/poketool/trainer/trdata/narc_0483.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0484.bin b/files/poketool/trainer/trdata/narc_0484.bin
deleted file mode 100644
index 2338a967..00000000
--- a/files/poketool/trainer/trdata/narc_0484.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0485.bin b/files/poketool/trainer/trdata/narc_0485.bin
deleted file mode 100644
index be36e090..00000000
--- a/files/poketool/trainer/trdata/narc_0485.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0486.bin b/files/poketool/trainer/trdata/narc_0486.bin
deleted file mode 100644
index 20a9d315..00000000
--- a/files/poketool/trainer/trdata/narc_0486.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0487.bin b/files/poketool/trainer/trdata/narc_0487.bin
deleted file mode 100644
index 7b5ada8b..00000000
--- a/files/poketool/trainer/trdata/narc_0487.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0488.bin b/files/poketool/trainer/trdata/narc_0488.bin
deleted file mode 100644
index d1ba9d5c..00000000
--- a/files/poketool/trainer/trdata/narc_0488.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0489.bin b/files/poketool/trainer/trdata/narc_0489.bin
deleted file mode 100644
index 730e2129..00000000
--- a/files/poketool/trainer/trdata/narc_0489.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0490.bin b/files/poketool/trainer/trdata/narc_0490.bin
deleted file mode 100644
index ea80f172..00000000
--- a/files/poketool/trainer/trdata/narc_0490.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0491.bin b/files/poketool/trainer/trdata/narc_0491.bin
deleted file mode 100644
index b58a1adb..00000000
--- a/files/poketool/trainer/trdata/narc_0491.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0492.bin b/files/poketool/trainer/trdata/narc_0492.bin
deleted file mode 100644
index b58a1adb..00000000
--- a/files/poketool/trainer/trdata/narc_0492.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0493.bin b/files/poketool/trainer/trdata/narc_0493.bin
deleted file mode 100644
index f4f52d21..00000000
--- a/files/poketool/trainer/trdata/narc_0493.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0494.bin b/files/poketool/trainer/trdata/narc_0494.bin
deleted file mode 100644
index 172b4b81..00000000
--- a/files/poketool/trainer/trdata/narc_0494.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0495.bin b/files/poketool/trainer/trdata/narc_0495.bin
deleted file mode 100644
index 7f3f4d63..00000000
--- a/files/poketool/trainer/trdata/narc_0495.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0496.bin b/files/poketool/trainer/trdata/narc_0496.bin
deleted file mode 100644
index 6fe8c60d..00000000
--- a/files/poketool/trainer/trdata/narc_0496.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0497.bin b/files/poketool/trainer/trdata/narc_0497.bin
deleted file mode 100644
index 885c3018..00000000
--- a/files/poketool/trainer/trdata/narc_0497.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0498.bin b/files/poketool/trainer/trdata/narc_0498.bin
deleted file mode 100644
index c9ef989b..00000000
--- a/files/poketool/trainer/trdata/narc_0498.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0499.bin b/files/poketool/trainer/trdata/narc_0499.bin
deleted file mode 100644
index 8d46840d..00000000
--- a/files/poketool/trainer/trdata/narc_0499.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0500.bin b/files/poketool/trainer/trdata/narc_0500.bin
deleted file mode 100644
index 8d46840d..00000000
--- a/files/poketool/trainer/trdata/narc_0500.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0501.bin b/files/poketool/trainer/trdata/narc_0501.bin
deleted file mode 100644
index 0ac27deb..00000000
--- a/files/poketool/trainer/trdata/narc_0501.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0502.bin b/files/poketool/trainer/trdata/narc_0502.bin
deleted file mode 100644
index b1fae20e..00000000
--- a/files/poketool/trainer/trdata/narc_0502.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0503.bin b/files/poketool/trainer/trdata/narc_0503.bin
deleted file mode 100644
index 5354608b..00000000
--- a/files/poketool/trainer/trdata/narc_0503.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0504.bin b/files/poketool/trainer/trdata/narc_0504.bin
deleted file mode 100644
index b1fae20e..00000000
--- a/files/poketool/trainer/trdata/narc_0504.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0505.bin b/files/poketool/trainer/trdata/narc_0505.bin
deleted file mode 100644
index 5354608b..00000000
--- a/files/poketool/trainer/trdata/narc_0505.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0506.bin b/files/poketool/trainer/trdata/narc_0506.bin
deleted file mode 100644
index 8c82c171..00000000
--- a/files/poketool/trainer/trdata/narc_0506.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0507.bin b/files/poketool/trainer/trdata/narc_0507.bin
deleted file mode 100644
index 5c3198fb..00000000
--- a/files/poketool/trainer/trdata/narc_0507.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0508.bin b/files/poketool/trainer/trdata/narc_0508.bin
deleted file mode 100644
index 4e09951f..00000000
--- a/files/poketool/trainer/trdata/narc_0508.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0509.bin b/files/poketool/trainer/trdata/narc_0509.bin
deleted file mode 100644
index 5c3198fb..00000000
--- a/files/poketool/trainer/trdata/narc_0509.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0510.bin b/files/poketool/trainer/trdata/narc_0510.bin
deleted file mode 100644
index d7e26687..00000000
--- a/files/poketool/trainer/trdata/narc_0510.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0511.bin b/files/poketool/trainer/trdata/narc_0511.bin
deleted file mode 100644
index 5c3198fb..00000000
--- a/files/poketool/trainer/trdata/narc_0511.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0512.bin b/files/poketool/trainer/trdata/narc_0512.bin
deleted file mode 100644
index 4e09951f..00000000
--- a/files/poketool/trainer/trdata/narc_0512.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0513.bin b/files/poketool/trainer/trdata/narc_0513.bin
deleted file mode 100644
index 4e09951f..00000000
--- a/files/poketool/trainer/trdata/narc_0513.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0514.bin b/files/poketool/trainer/trdata/narc_0514.bin
deleted file mode 100644
index 4e09951f..00000000
--- a/files/poketool/trainer/trdata/narc_0514.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0515.bin b/files/poketool/trainer/trdata/narc_0515.bin
deleted file mode 100644
index 5c3198fb..00000000
--- a/files/poketool/trainer/trdata/narc_0515.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0516.bin b/files/poketool/trainer/trdata/narc_0516.bin
deleted file mode 100644
index d7e26687..00000000
--- a/files/poketool/trainer/trdata/narc_0516.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0517.bin b/files/poketool/trainer/trdata/narc_0517.bin
deleted file mode 100644
index 4e09951f..00000000
--- a/files/poketool/trainer/trdata/narc_0517.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0518.bin b/files/poketool/trainer/trdata/narc_0518.bin
deleted file mode 100644
index d7e26687..00000000
--- a/files/poketool/trainer/trdata/narc_0518.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0519.bin b/files/poketool/trainer/trdata/narc_0519.bin
deleted file mode 100644
index 5c3198fb..00000000
--- a/files/poketool/trainer/trdata/narc_0519.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0520.bin b/files/poketool/trainer/trdata/narc_0520.bin
deleted file mode 100644
index 4e09951f..00000000
--- a/files/poketool/trainer/trdata/narc_0520.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0521.bin b/files/poketool/trainer/trdata/narc_0521.bin
deleted file mode 100644
index 4e09951f..00000000
--- a/files/poketool/trainer/trdata/narc_0521.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0522.bin b/files/poketool/trainer/trdata/narc_0522.bin
deleted file mode 100644
index 6554b623..00000000
--- a/files/poketool/trainer/trdata/narc_0522.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0523.bin b/files/poketool/trainer/trdata/narc_0523.bin
deleted file mode 100644
index 6fd4e3c5..00000000
--- a/files/poketool/trainer/trdata/narc_0523.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0524.bin b/files/poketool/trainer/trdata/narc_0524.bin
deleted file mode 100644
index 6554b623..00000000
--- a/files/poketool/trainer/trdata/narc_0524.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0525.bin b/files/poketool/trainer/trdata/narc_0525.bin
deleted file mode 100644
index 74051774..00000000
--- a/files/poketool/trainer/trdata/narc_0525.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0526.bin b/files/poketool/trainer/trdata/narc_0526.bin
deleted file mode 100644
index 6554b623..00000000
--- a/files/poketool/trainer/trdata/narc_0526.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0527.bin b/files/poketool/trainer/trdata/narc_0527.bin
deleted file mode 100644
index 74051774..00000000
--- a/files/poketool/trainer/trdata/narc_0527.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0528.bin b/files/poketool/trainer/trdata/narc_0528.bin
deleted file mode 100644
index 52d1e27f..00000000
--- a/files/poketool/trainer/trdata/narc_0528.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0529.bin b/files/poketool/trainer/trdata/narc_0529.bin
deleted file mode 100644
index cde7cb76..00000000
--- a/files/poketool/trainer/trdata/narc_0529.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0530.bin b/files/poketool/trainer/trdata/narc_0530.bin
deleted file mode 100644
index 4a163b76..00000000
--- a/files/poketool/trainer/trdata/narc_0530.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0531.bin b/files/poketool/trainer/trdata/narc_0531.bin
deleted file mode 100644
index 33bbf307..00000000
--- a/files/poketool/trainer/trdata/narc_0531.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0532.bin b/files/poketool/trainer/trdata/narc_0532.bin
deleted file mode 100644
index 6fe8c60d..00000000
--- a/files/poketool/trainer/trdata/narc_0532.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0533.bin b/files/poketool/trainer/trdata/narc_0533.bin
deleted file mode 100644
index 141f67b9..00000000
--- a/files/poketool/trainer/trdata/narc_0533.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0534.bin b/files/poketool/trainer/trdata/narc_0534.bin
deleted file mode 100644
index 5f50e7c6..00000000
--- a/files/poketool/trainer/trdata/narc_0534.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0535.bin b/files/poketool/trainer/trdata/narc_0535.bin
deleted file mode 100644
index 41f66e47..00000000
--- a/files/poketool/trainer/trdata/narc_0535.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0536.bin b/files/poketool/trainer/trdata/narc_0536.bin
deleted file mode 100644
index 2822319d..00000000
--- a/files/poketool/trainer/trdata/narc_0536.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0537.bin b/files/poketool/trainer/trdata/narc_0537.bin
deleted file mode 100644
index 03f3ea6d..00000000
--- a/files/poketool/trainer/trdata/narc_0537.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0538.bin b/files/poketool/trainer/trdata/narc_0538.bin
deleted file mode 100644
index c5ec8936..00000000
--- a/files/poketool/trainer/trdata/narc_0538.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0539.bin b/files/poketool/trainer/trdata/narc_0539.bin
deleted file mode 100644
index 19a45642..00000000
--- a/files/poketool/trainer/trdata/narc_0539.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0540.bin b/files/poketool/trainer/trdata/narc_0540.bin
deleted file mode 100644
index 4b4e675f..00000000
--- a/files/poketool/trainer/trdata/narc_0540.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0541.bin b/files/poketool/trainer/trdata/narc_0541.bin
deleted file mode 100644
index c105598a..00000000
--- a/files/poketool/trainer/trdata/narc_0541.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0542.bin b/files/poketool/trainer/trdata/narc_0542.bin
deleted file mode 100644
index 6c34694a..00000000
--- a/files/poketool/trainer/trdata/narc_0542.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0543.bin b/files/poketool/trainer/trdata/narc_0543.bin
deleted file mode 100644
index 2adcf1cf..00000000
--- a/files/poketool/trainer/trdata/narc_0543.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0544.bin b/files/poketool/trainer/trdata/narc_0544.bin
deleted file mode 100644
index f1a6c7be..00000000
--- a/files/poketool/trainer/trdata/narc_0544.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0545.bin b/files/poketool/trainer/trdata/narc_0545.bin
deleted file mode 100644
index 3b1cf942..00000000
--- a/files/poketool/trainer/trdata/narc_0545.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0546.bin b/files/poketool/trainer/trdata/narc_0546.bin
deleted file mode 100644
index 49379142..00000000
--- a/files/poketool/trainer/trdata/narc_0546.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0547.bin b/files/poketool/trainer/trdata/narc_0547.bin
deleted file mode 100644
index a4bac0b2..00000000
--- a/files/poketool/trainer/trdata/narc_0547.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0548.bin b/files/poketool/trainer/trdata/narc_0548.bin
deleted file mode 100644
index 34773a14..00000000
--- a/files/poketool/trainer/trdata/narc_0548.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0549.bin b/files/poketool/trainer/trdata/narc_0549.bin
deleted file mode 100644
index 7b5ada8b..00000000
--- a/files/poketool/trainer/trdata/narc_0549.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0550.bin b/files/poketool/trainer/trdata/narc_0550.bin
deleted file mode 100644
index b58a1adb..00000000
--- a/files/poketool/trainer/trdata/narc_0550.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0551.bin b/files/poketool/trainer/trdata/narc_0551.bin
deleted file mode 100644
index b58a1adb..00000000
--- a/files/poketool/trainer/trdata/narc_0551.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0552.bin b/files/poketool/trainer/trdata/narc_0552.bin
deleted file mode 100644
index fd1f828c..00000000
--- a/files/poketool/trainer/trdata/narc_0552.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0553.bin b/files/poketool/trainer/trdata/narc_0553.bin
deleted file mode 100644
index 9c98c21e..00000000
--- a/files/poketool/trainer/trdata/narc_0553.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0554.bin b/files/poketool/trainer/trdata/narc_0554.bin
deleted file mode 100644
index b954069c..00000000
--- a/files/poketool/trainer/trdata/narc_0554.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0555.bin b/files/poketool/trainer/trdata/narc_0555.bin
deleted file mode 100644
index b954069c..00000000
--- a/files/poketool/trainer/trdata/narc_0555.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0556.bin b/files/poketool/trainer/trdata/narc_0556.bin
deleted file mode 100644
index 0075dde0..00000000
--- a/files/poketool/trainer/trdata/narc_0556.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0557.bin b/files/poketool/trainer/trdata/narc_0557.bin
deleted file mode 100644
index c9b2c5ba..00000000
--- a/files/poketool/trainer/trdata/narc_0557.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0558.bin b/files/poketool/trainer/trdata/narc_0558.bin
deleted file mode 100644
index b245c3b1..00000000
--- a/files/poketool/trainer/trdata/narc_0558.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0559.bin b/files/poketool/trainer/trdata/narc_0559.bin
deleted file mode 100644
index b245c3b1..00000000
--- a/files/poketool/trainer/trdata/narc_0559.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0560.bin b/files/poketool/trainer/trdata/narc_0560.bin
deleted file mode 100644
index c9b2c5ba..00000000
--- a/files/poketool/trainer/trdata/narc_0560.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0561.bin b/files/poketool/trainer/trdata/narc_0561.bin
deleted file mode 100644
index fab42c3c..00000000
--- a/files/poketool/trainer/trdata/narc_0561.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0562.bin b/files/poketool/trainer/trdata/narc_0562.bin
deleted file mode 100644
index c9b2c5ba..00000000
--- a/files/poketool/trainer/trdata/narc_0562.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0563.bin b/files/poketool/trainer/trdata/narc_0563.bin
deleted file mode 100644
index 1a48a8ce..00000000
--- a/files/poketool/trainer/trdata/narc_0563.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0564.bin b/files/poketool/trainer/trdata/narc_0564.bin
deleted file mode 100644
index e5a38ad2..00000000
--- a/files/poketool/trainer/trdata/narc_0564.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0565.bin b/files/poketool/trainer/trdata/narc_0565.bin
deleted file mode 100644
index 1a48a8ce..00000000
--- a/files/poketool/trainer/trdata/narc_0565.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0566.bin b/files/poketool/trainer/trdata/narc_0566.bin
deleted file mode 100644
index 1a48a8ce..00000000
--- a/files/poketool/trainer/trdata/narc_0566.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0567.bin b/files/poketool/trainer/trdata/narc_0567.bin
deleted file mode 100644
index 1a48a8ce..00000000
--- a/files/poketool/trainer/trdata/narc_0567.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0568.bin b/files/poketool/trainer/trdata/narc_0568.bin
deleted file mode 100644
index e5a38ad2..00000000
--- a/files/poketool/trainer/trdata/narc_0568.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0569.bin b/files/poketool/trainer/trdata/narc_0569.bin
deleted file mode 100644
index 1a48a8ce..00000000
--- a/files/poketool/trainer/trdata/narc_0569.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0570.bin b/files/poketool/trainer/trdata/narc_0570.bin
deleted file mode 100644
index 1a48a8ce..00000000
--- a/files/poketool/trainer/trdata/narc_0570.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0571.bin b/files/poketool/trainer/trdata/narc_0571.bin
deleted file mode 100644
index 1a48a8ce..00000000
--- a/files/poketool/trainer/trdata/narc_0571.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0572.bin b/files/poketool/trainer/trdata/narc_0572.bin
deleted file mode 100644
index e5a38ad2..00000000
--- a/files/poketool/trainer/trdata/narc_0572.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0573.bin b/files/poketool/trainer/trdata/narc_0573.bin
deleted file mode 100644
index 7bfc3d16..00000000
--- a/files/poketool/trainer/trdata/narc_0573.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0574.bin b/files/poketool/trainer/trdata/narc_0574.bin
deleted file mode 100644
index 5f5dee1e..00000000
--- a/files/poketool/trainer/trdata/narc_0574.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0575.bin b/files/poketool/trainer/trdata/narc_0575.bin
deleted file mode 100644
index 7bfc3d16..00000000
--- a/files/poketool/trainer/trdata/narc_0575.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0576.bin b/files/poketool/trainer/trdata/narc_0576.bin
deleted file mode 100644
index 5f5dee1e..00000000
--- a/files/poketool/trainer/trdata/narc_0576.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0577.bin b/files/poketool/trainer/trdata/narc_0577.bin
deleted file mode 100644
index 7bfc3d16..00000000
--- a/files/poketool/trainer/trdata/narc_0577.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0578.bin b/files/poketool/trainer/trdata/narc_0578.bin
deleted file mode 100644
index c1b66113..00000000
--- a/files/poketool/trainer/trdata/narc_0578.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0579.bin b/files/poketool/trainer/trdata/narc_0579.bin
deleted file mode 100644
index 7bfc3d16..00000000
--- a/files/poketool/trainer/trdata/narc_0579.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0580.bin b/files/poketool/trainer/trdata/narc_0580.bin
deleted file mode 100644
index c1b66113..00000000
--- a/files/poketool/trainer/trdata/narc_0580.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0581.bin b/files/poketool/trainer/trdata/narc_0581.bin
deleted file mode 100644
index 5f5dee1e..00000000
--- a/files/poketool/trainer/trdata/narc_0581.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0582.bin b/files/poketool/trainer/trdata/narc_0582.bin
deleted file mode 100644
index 7bfc3d16..00000000
--- a/files/poketool/trainer/trdata/narc_0582.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0583.bin b/files/poketool/trainer/trdata/narc_0583.bin
deleted file mode 100644
index 5ce2c67c..00000000
--- a/files/poketool/trainer/trdata/narc_0583.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0584.bin b/files/poketool/trainer/trdata/narc_0584.bin
deleted file mode 100644
index 5ce2c67c..00000000
--- a/files/poketool/trainer/trdata/narc_0584.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0585.bin b/files/poketool/trainer/trdata/narc_0585.bin
deleted file mode 100644
index c68fff44..00000000
--- a/files/poketool/trainer/trdata/narc_0585.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0586.bin b/files/poketool/trainer/trdata/narc_0586.bin
deleted file mode 100644
index c68fff44..00000000
--- a/files/poketool/trainer/trdata/narc_0586.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0587.bin b/files/poketool/trainer/trdata/narc_0587.bin
deleted file mode 100644
index 67ddc3a2..00000000
--- a/files/poketool/trainer/trdata/narc_0587.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0588.bin b/files/poketool/trainer/trdata/narc_0588.bin
deleted file mode 100644
index e6ddce27..00000000
--- a/files/poketool/trainer/trdata/narc_0588.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0589.bin b/files/poketool/trainer/trdata/narc_0589.bin
deleted file mode 100644
index 67ddc3a2..00000000
--- a/files/poketool/trainer/trdata/narc_0589.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0590.bin b/files/poketool/trainer/trdata/narc_0590.bin
deleted file mode 100644
index 9c9d3435..00000000
--- a/files/poketool/trainer/trdata/narc_0590.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0591.bin b/files/poketool/trainer/trdata/narc_0591.bin
deleted file mode 100644
index b8562b25..00000000
--- a/files/poketool/trainer/trdata/narc_0591.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0592.bin b/files/poketool/trainer/trdata/narc_0592.bin
deleted file mode 100644
index b8562b25..00000000
--- a/files/poketool/trainer/trdata/narc_0592.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0593.bin b/files/poketool/trainer/trdata/narc_0593.bin
deleted file mode 100644
index 5e6ea68f..00000000
--- a/files/poketool/trainer/trdata/narc_0593.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0594.bin b/files/poketool/trainer/trdata/narc_0594.bin
deleted file mode 100644
index 8843728d..00000000
--- a/files/poketool/trainer/trdata/narc_0594.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0595.bin b/files/poketool/trainer/trdata/narc_0595.bin
deleted file mode 100644
index 8843728d..00000000
--- a/files/poketool/trainer/trdata/narc_0595.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0596.bin b/files/poketool/trainer/trdata/narc_0596.bin
deleted file mode 100644
index 8843728d..00000000
--- a/files/poketool/trainer/trdata/narc_0596.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0597.bin b/files/poketool/trainer/trdata/narc_0597.bin
deleted file mode 100644
index 06f70012..00000000
--- a/files/poketool/trainer/trdata/narc_0597.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0598.bin b/files/poketool/trainer/trdata/narc_0598.bin
deleted file mode 100644
index f4f52d21..00000000
--- a/files/poketool/trainer/trdata/narc_0598.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0599.bin b/files/poketool/trainer/trdata/narc_0599.bin
deleted file mode 100644
index 06f70012..00000000
--- a/files/poketool/trainer/trdata/narc_0599.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0600.bin b/files/poketool/trainer/trdata/narc_0600.bin
deleted file mode 100644
index fc4849c1..00000000
--- a/files/poketool/trainer/trdata/narc_0600.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0601.bin b/files/poketool/trainer/trdata/narc_0601.bin
deleted file mode 100644
index aeccc746..00000000
--- a/files/poketool/trainer/trdata/narc_0601.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0602.bin b/files/poketool/trainer/trdata/narc_0602.bin
deleted file mode 100644
index aeccc746..00000000
--- a/files/poketool/trainer/trdata/narc_0602.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0603.bin b/files/poketool/trainer/trdata/narc_0603.bin
deleted file mode 100644
index aeccc746..00000000
--- a/files/poketool/trainer/trdata/narc_0603.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0604.bin b/files/poketool/trainer/trdata/narc_0604.bin
deleted file mode 100644
index 4da77e80..00000000
--- a/files/poketool/trainer/trdata/narc_0604.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0605.bin b/files/poketool/trainer/trdata/narc_0605.bin
deleted file mode 100644
index 007cd3fa..00000000
--- a/files/poketool/trainer/trdata/narc_0605.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0606.bin b/files/poketool/trainer/trdata/narc_0606.bin
deleted file mode 100644
index 8d46840d..00000000
--- a/files/poketool/trainer/trdata/narc_0606.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0607.bin b/files/poketool/trainer/trdata/narc_0607.bin
deleted file mode 100644
index c188464a..00000000
--- a/files/poketool/trainer/trdata/narc_0607.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0608.bin b/files/poketool/trainer/trdata/narc_0608.bin
deleted file mode 100644
index 25f19624..00000000
--- a/files/poketool/trainer/trdata/narc_0608.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0609.bin b/files/poketool/trainer/trdata/narc_0609.bin
deleted file mode 100644
index 4058d3e1..00000000
--- a/files/poketool/trainer/trdata/narc_0609.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0610.bin b/files/poketool/trainer/trdata/narc_0610.bin
deleted file mode 100644
index 51055bc8..00000000
--- a/files/poketool/trainer/trdata/narc_0610.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0611.bin b/files/poketool/trainer/trdata/narc_0611.bin
deleted file mode 100644
index a588f52b..00000000
--- a/files/poketool/trainer/trdata/narc_0611.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0612.bin b/files/poketool/trainer/trdata/narc_0612.bin
deleted file mode 100644
index c38d2bb7..00000000
--- a/files/poketool/trainer/trdata/narc_0612.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0613.bin b/files/poketool/trainer/trdata/narc_0613.bin
deleted file mode 100644
index adb67597..00000000
--- a/files/poketool/trainer/trdata/narc_0613.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0614.bin b/files/poketool/trainer/trdata/narc_0614.bin
deleted file mode 100644
index adb67597..00000000
--- a/files/poketool/trainer/trdata/narc_0614.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0615.bin b/files/poketool/trainer/trdata/narc_0615.bin
deleted file mode 100644
index adb67597..00000000
--- a/files/poketool/trainer/trdata/narc_0615.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0616.bin b/files/poketool/trainer/trdata/narc_0616.bin
deleted file mode 100644
index 3329300d..00000000
--- a/files/poketool/trainer/trdata/narc_0616.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0617.bin b/files/poketool/trainer/trdata/narc_0617.bin
deleted file mode 100644
index 3329300d..00000000
--- a/files/poketool/trainer/trdata/narc_0617.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0618.bin b/files/poketool/trainer/trdata/narc_0618.bin
deleted file mode 100644
index 3329300d..00000000
--- a/files/poketool/trainer/trdata/narc_0618.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0619.bin b/files/poketool/trainer/trdata/narc_0619.bin
deleted file mode 100644
index c188464a..00000000
--- a/files/poketool/trainer/trdata/narc_0619.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0620.bin b/files/poketool/trainer/trdata/narc_0620.bin
deleted file mode 100644
index c188464a..00000000
--- a/files/poketool/trainer/trdata/narc_0620.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0621.bin b/files/poketool/trainer/trdata/narc_0621.bin
deleted file mode 100644
index 8f1f80f0..00000000
--- a/files/poketool/trainer/trdata/narc_0621.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0622.bin b/files/poketool/trainer/trdata/narc_0622.bin
deleted file mode 100644
index 8f1f80f0..00000000
--- a/files/poketool/trainer/trdata/narc_0622.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0623.bin b/files/poketool/trainer/trdata/narc_0623.bin
deleted file mode 100644
index 8f1f80f0..00000000
--- a/files/poketool/trainer/trdata/narc_0623.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0624.bin b/files/poketool/trainer/trdata/narc_0624.bin
deleted file mode 100644
index ae755ee0..00000000
--- a/files/poketool/trainer/trdata/narc_0624.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0625.bin b/files/poketool/trainer/trdata/narc_0625.bin
deleted file mode 100644
index ae755ee0..00000000
--- a/files/poketool/trainer/trdata/narc_0625.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0626.bin b/files/poketool/trainer/trdata/narc_0626.bin
deleted file mode 100644
index ae755ee0..00000000
--- a/files/poketool/trainer/trdata/narc_0626.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0627.bin b/files/poketool/trainer/trdata/narc_0627.bin
deleted file mode 100644
index 41f66e47..00000000
--- a/files/poketool/trainer/trdata/narc_0627.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0628.bin b/files/poketool/trainer/trdata/narc_0628.bin
deleted file mode 100644
index 41f66e47..00000000
--- a/files/poketool/trainer/trdata/narc_0628.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0629.bin b/files/poketool/trainer/trdata/narc_0629.bin
deleted file mode 100644
index 41f66e47..00000000
--- a/files/poketool/trainer/trdata/narc_0629.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0630.bin b/files/poketool/trainer/trdata/narc_0630.bin
deleted file mode 100644
index 93c51bf7..00000000
--- a/files/poketool/trainer/trdata/narc_0630.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0631.bin b/files/poketool/trainer/trdata/narc_0631.bin
deleted file mode 100644
index 93c51bf7..00000000
--- a/files/poketool/trainer/trdata/narc_0631.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0632.bin b/files/poketool/trainer/trdata/narc_0632.bin
deleted file mode 100644
index 93c51bf7..00000000
--- a/files/poketool/trainer/trdata/narc_0632.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0633.bin b/files/poketool/trainer/trdata/narc_0633.bin
deleted file mode 100644
index 3bdfd715..00000000
--- a/files/poketool/trainer/trdata/narc_0633.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0634.bin b/files/poketool/trainer/trdata/narc_0634.bin
deleted file mode 100644
index 3bdfd715..00000000
--- a/files/poketool/trainer/trdata/narc_0634.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0635.bin b/files/poketool/trainer/trdata/narc_0635.bin
deleted file mode 100644
index 3bdfd715..00000000
--- a/files/poketool/trainer/trdata/narc_0635.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0636.bin b/files/poketool/trainer/trdata/narc_0636.bin
deleted file mode 100644
index b954069c..00000000
--- a/files/poketool/trainer/trdata/narc_0636.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0637.bin b/files/poketool/trainer/trdata/narc_0637.bin
deleted file mode 100644
index b954069c..00000000
--- a/files/poketool/trainer/trdata/narc_0637.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0638.bin b/files/poketool/trainer/trdata/narc_0638.bin
deleted file mode 100644
index b954069c..00000000
--- a/files/poketool/trainer/trdata/narc_0638.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0639.bin b/files/poketool/trainer/trdata/narc_0639.bin
deleted file mode 100644
index ee98e551..00000000
--- a/files/poketool/trainer/trdata/narc_0639.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0640.bin b/files/poketool/trainer/trdata/narc_0640.bin
deleted file mode 100644
index ee98e551..00000000
--- a/files/poketool/trainer/trdata/narc_0640.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0641.bin b/files/poketool/trainer/trdata/narc_0641.bin
deleted file mode 100644
index ee98e551..00000000
--- a/files/poketool/trainer/trdata/narc_0641.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0642.bin b/files/poketool/trainer/trdata/narc_0642.bin
deleted file mode 100644
index 14e818df..00000000
--- a/files/poketool/trainer/trdata/narc_0642.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0643.bin b/files/poketool/trainer/trdata/narc_0643.bin
deleted file mode 100644
index 14e818df..00000000
--- a/files/poketool/trainer/trdata/narc_0643.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0644.bin b/files/poketool/trainer/trdata/narc_0644.bin
deleted file mode 100644
index 14e818df..00000000
--- a/files/poketool/trainer/trdata/narc_0644.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0645.bin b/files/poketool/trainer/trdata/narc_0645.bin
deleted file mode 100644
index 02a78315..00000000
--- a/files/poketool/trainer/trdata/narc_0645.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0646.bin b/files/poketool/trainer/trdata/narc_0646.bin
deleted file mode 100644
index 02a78315..00000000
--- a/files/poketool/trainer/trdata/narc_0646.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0647.bin b/files/poketool/trainer/trdata/narc_0647.bin
deleted file mode 100644
index 02a78315..00000000
--- a/files/poketool/trainer/trdata/narc_0647.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0648.bin b/files/poketool/trainer/trdata/narc_0648.bin
deleted file mode 100644
index 942f4373..00000000
--- a/files/poketool/trainer/trdata/narc_0648.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0649.bin b/files/poketool/trainer/trdata/narc_0649.bin
deleted file mode 100644
index 0eb6d263..00000000
--- a/files/poketool/trainer/trdata/narc_0649.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0650.bin b/files/poketool/trainer/trdata/narc_0650.bin
deleted file mode 100644
index 19a45642..00000000
--- a/files/poketool/trainer/trdata/narc_0650.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0651.bin b/files/poketool/trainer/trdata/narc_0651.bin
deleted file mode 100644
index dc86effa..00000000
--- a/files/poketool/trainer/trdata/narc_0651.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0652.bin b/files/poketool/trainer/trdata/narc_0652.bin
deleted file mode 100644
index dc86effa..00000000
--- a/files/poketool/trainer/trdata/narc_0652.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0653.bin b/files/poketool/trainer/trdata/narc_0653.bin
deleted file mode 100644
index ef7cb2c8..00000000
--- a/files/poketool/trainer/trdata/narc_0653.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0654.bin b/files/poketool/trainer/trdata/narc_0654.bin
deleted file mode 100644
index ef7cb2c8..00000000
--- a/files/poketool/trainer/trdata/narc_0654.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0655.bin b/files/poketool/trainer/trdata/narc_0655.bin
deleted file mode 100644
index ef7cb2c8..00000000
--- a/files/poketool/trainer/trdata/narc_0655.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0656.bin b/files/poketool/trainer/trdata/narc_0656.bin
deleted file mode 100644
index b3f17d3d..00000000
--- a/files/poketool/trainer/trdata/narc_0656.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0657.bin b/files/poketool/trainer/trdata/narc_0657.bin
deleted file mode 100644
index b3f17d3d..00000000
--- a/files/poketool/trainer/trdata/narc_0657.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0658.bin b/files/poketool/trainer/trdata/narc_0658.bin
deleted file mode 100644
index b3f17d3d..00000000
--- a/files/poketool/trainer/trdata/narc_0658.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0659.bin b/files/poketool/trainer/trdata/narc_0659.bin
deleted file mode 100644
index b245c3b1..00000000
--- a/files/poketool/trainer/trdata/narc_0659.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0660.bin b/files/poketool/trainer/trdata/narc_0660.bin
deleted file mode 100644
index b245c3b1..00000000
--- a/files/poketool/trainer/trdata/narc_0660.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0661.bin b/files/poketool/trainer/trdata/narc_0661.bin
deleted file mode 100644
index c9b2c5ba..00000000
--- a/files/poketool/trainer/trdata/narc_0661.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0662.bin b/files/poketool/trainer/trdata/narc_0662.bin
deleted file mode 100644
index c9b2c5ba..00000000
--- a/files/poketool/trainer/trdata/narc_0662.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0663.bin b/files/poketool/trainer/trdata/narc_0663.bin
deleted file mode 100644
index 5dddc4c6..00000000
--- a/files/poketool/trainer/trdata/narc_0663.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0664.bin b/files/poketool/trainer/trdata/narc_0664.bin
deleted file mode 100644
index 150ff10e..00000000
--- a/files/poketool/trainer/trdata/narc_0664.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0665.bin b/files/poketool/trainer/trdata/narc_0665.bin
deleted file mode 100644
index 150ff10e..00000000
--- a/files/poketool/trainer/trdata/narc_0665.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0666.bin b/files/poketool/trainer/trdata/narc_0666.bin
deleted file mode 100644
index 1a48a8ce..00000000
--- a/files/poketool/trainer/trdata/narc_0666.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0667.bin b/files/poketool/trainer/trdata/narc_0667.bin
deleted file mode 100644
index e5a38ad2..00000000
--- a/files/poketool/trainer/trdata/narc_0667.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0668.bin b/files/poketool/trainer/trdata/narc_0668.bin
deleted file mode 100644
index 5f5dee1e..00000000
--- a/files/poketool/trainer/trdata/narc_0668.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0669.bin b/files/poketool/trainer/trdata/narc_0669.bin
deleted file mode 100644
index 7bfc3d16..00000000
--- a/files/poketool/trainer/trdata/narc_0669.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0670.bin b/files/poketool/trainer/trdata/narc_0670.bin
deleted file mode 100644
index 7bfc3d16..00000000
--- a/files/poketool/trainer/trdata/narc_0670.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0671.bin b/files/poketool/trainer/trdata/narc_0671.bin
deleted file mode 100644
index 7bfc3d16..00000000
--- a/files/poketool/trainer/trdata/narc_0671.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0672.bin b/files/poketool/trainer/trdata/narc_0672.bin
deleted file mode 100644
index 5f5dee1e..00000000
--- a/files/poketool/trainer/trdata/narc_0672.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0673.bin b/files/poketool/trainer/trdata/narc_0673.bin
deleted file mode 100644
index 5ce2c67c..00000000
--- a/files/poketool/trainer/trdata/narc_0673.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0674.bin b/files/poketool/trainer/trdata/narc_0674.bin
deleted file mode 100644
index 5ce2c67c..00000000
--- a/files/poketool/trainer/trdata/narc_0674.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0675.bin b/files/poketool/trainer/trdata/narc_0675.bin
deleted file mode 100644
index 5ce2c67c..00000000
--- a/files/poketool/trainer/trdata/narc_0675.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0676.bin b/files/poketool/trainer/trdata/narc_0676.bin
deleted file mode 100644
index 5ce2c67c..00000000
--- a/files/poketool/trainer/trdata/narc_0676.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0677.bin b/files/poketool/trainer/trdata/narc_0677.bin
deleted file mode 100644
index cbfba442..00000000
--- a/files/poketool/trainer/trdata/narc_0677.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0678.bin b/files/poketool/trainer/trdata/narc_0678.bin
deleted file mode 100644
index cbfba442..00000000
--- a/files/poketool/trainer/trdata/narc_0678.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0679.bin b/files/poketool/trainer/trdata/narc_0679.bin
deleted file mode 100644
index c68fff44..00000000
--- a/files/poketool/trainer/trdata/narc_0679.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0680.bin b/files/poketool/trainer/trdata/narc_0680.bin
deleted file mode 100644
index c68fff44..00000000
--- a/files/poketool/trainer/trdata/narc_0680.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0681.bin b/files/poketool/trainer/trdata/narc_0681.bin
deleted file mode 100644
index 4f026089..00000000
--- a/files/poketool/trainer/trdata/narc_0681.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0682.bin b/files/poketool/trainer/trdata/narc_0682.bin
deleted file mode 100644
index 4f026089..00000000
--- a/files/poketool/trainer/trdata/narc_0682.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0683.bin b/files/poketool/trainer/trdata/narc_0683.bin
deleted file mode 100644
index 2bbdea64..00000000
--- a/files/poketool/trainer/trdata/narc_0683.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0684.bin b/files/poketool/trainer/trdata/narc_0684.bin
deleted file mode 100644
index 2bbdea64..00000000
--- a/files/poketool/trainer/trdata/narc_0684.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0685.bin b/files/poketool/trainer/trdata/narc_0685.bin
deleted file mode 100644
index 45af2a9b..00000000
--- a/files/poketool/trainer/trdata/narc_0685.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0686.bin b/files/poketool/trainer/trdata/narc_0686.bin
deleted file mode 100644
index 45af2a9b..00000000
--- a/files/poketool/trainer/trdata/narc_0686.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0687.bin b/files/poketool/trainer/trdata/narc_0687.bin
deleted file mode 100644
index 5b752f7d..00000000
--- a/files/poketool/trainer/trdata/narc_0687.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0688.bin b/files/poketool/trainer/trdata/narc_0688.bin
deleted file mode 100644
index 5b752f7d..00000000
--- a/files/poketool/trainer/trdata/narc_0688.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0689.bin b/files/poketool/trainer/trdata/narc_0689.bin
deleted file mode 100644
index 549da886..00000000
--- a/files/poketool/trainer/trdata/narc_0689.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0690.bin b/files/poketool/trainer/trdata/narc_0690.bin
deleted file mode 100644
index 549da886..00000000
--- a/files/poketool/trainer/trdata/narc_0690.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0691.bin b/files/poketool/trainer/trdata/narc_0691.bin
deleted file mode 100644
index 6f7608cb..00000000
--- a/files/poketool/trainer/trdata/narc_0691.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0692.bin b/files/poketool/trainer/trdata/narc_0692.bin
deleted file mode 100644
index 6f7608cb..00000000
--- a/files/poketool/trainer/trdata/narc_0692.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0693.bin b/files/poketool/trainer/trdata/narc_0693.bin
deleted file mode 100644
index 6f7608cb..00000000
--- a/files/poketool/trainer/trdata/narc_0693.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0694.bin b/files/poketool/trainer/trdata/narc_0694.bin
deleted file mode 100644
index f322b90e..00000000
--- a/files/poketool/trainer/trdata/narc_0694.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0695.bin b/files/poketool/trainer/trdata/narc_0695.bin
deleted file mode 100644
index 8694d813..00000000
--- a/files/poketool/trainer/trdata/narc_0695.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0696.bin b/files/poketool/trainer/trdata/narc_0696.bin
deleted file mode 100644
index 8694d813..00000000
--- a/files/poketool/trainer/trdata/narc_0696.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0697.bin b/files/poketool/trainer/trdata/narc_0697.bin
deleted file mode 100644
index 2f326060..00000000
--- a/files/poketool/trainer/trdata/narc_0697.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0698.bin b/files/poketool/trainer/trdata/narc_0698.bin
deleted file mode 100644
index 2f326060..00000000
--- a/files/poketool/trainer/trdata/narc_0698.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0699.bin b/files/poketool/trainer/trdata/narc_0699.bin
deleted file mode 100644
index 9c9d3435..00000000
--- a/files/poketool/trainer/trdata/narc_0699.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0700.bin b/files/poketool/trainer/trdata/narc_0700.bin
deleted file mode 100644
index 67ddc3a2..00000000
--- a/files/poketool/trainer/trdata/narc_0700.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0701.bin b/files/poketool/trainer/trdata/narc_0701.bin
deleted file mode 100644
index 4e847a03..00000000
--- a/files/poketool/trainer/trdata/narc_0701.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0702.bin b/files/poketool/trainer/trdata/narc_0702.bin
deleted file mode 100644
index 4e847a03..00000000
--- a/files/poketool/trainer/trdata/narc_0702.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0703.bin b/files/poketool/trainer/trdata/narc_0703.bin
deleted file mode 100644
index cc4b0ebf..00000000
--- a/files/poketool/trainer/trdata/narc_0703.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0704.bin b/files/poketool/trainer/trdata/narc_0704.bin
deleted file mode 100644
index cc4b0ebf..00000000
--- a/files/poketool/trainer/trdata/narc_0704.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0705.bin b/files/poketool/trainer/trdata/narc_0705.bin
deleted file mode 100644
index cc4b0ebf..00000000
--- a/files/poketool/trainer/trdata/narc_0705.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0706.bin b/files/poketool/trainer/trdata/narc_0706.bin
deleted file mode 100644
index f1a6c7be..00000000
--- a/files/poketool/trainer/trdata/narc_0706.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0707.bin b/files/poketool/trainer/trdata/narc_0707.bin
deleted file mode 100644
index f1a6c7be..00000000
--- a/files/poketool/trainer/trdata/narc_0707.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0708.bin b/files/poketool/trainer/trdata/narc_0708.bin
deleted file mode 100644
index f1a6c7be..00000000
--- a/files/poketool/trainer/trdata/narc_0708.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0709.bin b/files/poketool/trainer/trdata/narc_0709.bin
deleted file mode 100644
index 34600ee3..00000000
--- a/files/poketool/trainer/trdata/narc_0709.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0710.bin b/files/poketool/trainer/trdata/narc_0710.bin
deleted file mode 100644
index 34600ee3..00000000
--- a/files/poketool/trainer/trdata/narc_0710.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0711.bin b/files/poketool/trainer/trdata/narc_0711.bin
deleted file mode 100644
index 34600ee3..00000000
--- a/files/poketool/trainer/trdata/narc_0711.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0712.bin b/files/poketool/trainer/trdata/narc_0712.bin
deleted file mode 100644
index bbee0ad1..00000000
--- a/files/poketool/trainer/trdata/narc_0712.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0713.bin b/files/poketool/trainer/trdata/narc_0713.bin
deleted file mode 100644
index bbee0ad1..00000000
--- a/files/poketool/trainer/trdata/narc_0713.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0714.bin b/files/poketool/trainer/trdata/narc_0714.bin
deleted file mode 100644
index bbee0ad1..00000000
--- a/files/poketool/trainer/trdata/narc_0714.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0715.bin b/files/poketool/trainer/trdata/narc_0715.bin
deleted file mode 100644
index c4fad157..00000000
--- a/files/poketool/trainer/trdata/narc_0715.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0716.bin b/files/poketool/trainer/trdata/narc_0716.bin
deleted file mode 100644
index c4fad157..00000000
--- a/files/poketool/trainer/trdata/narc_0716.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0717.bin b/files/poketool/trainer/trdata/narc_0717.bin
deleted file mode 100644
index c4fad157..00000000
--- a/files/poketool/trainer/trdata/narc_0717.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0718.bin b/files/poketool/trainer/trdata/narc_0718.bin
deleted file mode 100644
index 63471c10..00000000
--- a/files/poketool/trainer/trdata/narc_0718.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0719.bin b/files/poketool/trainer/trdata/narc_0719.bin
deleted file mode 100644
index 63471c10..00000000
--- a/files/poketool/trainer/trdata/narc_0719.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0720.bin b/files/poketool/trainer/trdata/narc_0720.bin
deleted file mode 100644
index 7640a237..00000000
--- a/files/poketool/trainer/trdata/narc_0720.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0721.bin b/files/poketool/trainer/trdata/narc_0721.bin
deleted file mode 100644
index 7ac32e6c..00000000
--- a/files/poketool/trainer/trdata/narc_0721.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0722.bin b/files/poketool/trainer/trdata/narc_0722.bin
deleted file mode 100644
index 7ac32e6c..00000000
--- a/files/poketool/trainer/trdata/narc_0722.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0723.bin b/files/poketool/trainer/trdata/narc_0723.bin
deleted file mode 100644
index 7ac32e6c..00000000
--- a/files/poketool/trainer/trdata/narc_0723.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0724.bin b/files/poketool/trainer/trdata/narc_0724.bin
deleted file mode 100644
index 7611c80a..00000000
--- a/files/poketool/trainer/trdata/narc_0724.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0725.bin b/files/poketool/trainer/trdata/narc_0725.bin
deleted file mode 100644
index 7611c80a..00000000
--- a/files/poketool/trainer/trdata/narc_0725.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0726.bin b/files/poketool/trainer/trdata/narc_0726.bin
deleted file mode 100644
index 7611c80a..00000000
--- a/files/poketool/trainer/trdata/narc_0726.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0727.bin b/files/poketool/trainer/trdata/narc_0727.bin
deleted file mode 100644
index 3b1cf942..00000000
--- a/files/poketool/trainer/trdata/narc_0727.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0728.bin b/files/poketool/trainer/trdata/narc_0728.bin
deleted file mode 100644
index 3b1cf942..00000000
--- a/files/poketool/trainer/trdata/narc_0728.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0729.bin b/files/poketool/trainer/trdata/narc_0729.bin
deleted file mode 100644
index dd4e0cac..00000000
--- a/files/poketool/trainer/trdata/narc_0729.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0730.bin b/files/poketool/trainer/trdata/narc_0730.bin
deleted file mode 100644
index dd4e0cac..00000000
--- a/files/poketool/trainer/trdata/narc_0730.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0731.bin b/files/poketool/trainer/trdata/narc_0731.bin
deleted file mode 100644
index dd4e0cac..00000000
--- a/files/poketool/trainer/trdata/narc_0731.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0732.bin b/files/poketool/trainer/trdata/narc_0732.bin
deleted file mode 100644
index b8562b25..00000000
--- a/files/poketool/trainer/trdata/narc_0732.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0733.bin b/files/poketool/trainer/trdata/narc_0733.bin
deleted file mode 100644
index b8562b25..00000000
--- a/files/poketool/trainer/trdata/narc_0733.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0734.bin b/files/poketool/trainer/trdata/narc_0734.bin
deleted file mode 100644
index b8562b25..00000000
--- a/files/poketool/trainer/trdata/narc_0734.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0735.bin b/files/poketool/trainer/trdata/narc_0735.bin
deleted file mode 100644
index b8562b25..00000000
--- a/files/poketool/trainer/trdata/narc_0735.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0736.bin b/files/poketool/trainer/trdata/narc_0736.bin
deleted file mode 100644
index 8843728d..00000000
--- a/files/poketool/trainer/trdata/narc_0736.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0737.bin b/files/poketool/trainer/trdata/narc_0737.bin
deleted file mode 100644
index 8843728d..00000000
--- a/files/poketool/trainer/trdata/narc_0737.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0738.bin b/files/poketool/trainer/trdata/narc_0738.bin
deleted file mode 100644
index 8843728d..00000000
--- a/files/poketool/trainer/trdata/narc_0738.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0739.bin b/files/poketool/trainer/trdata/narc_0739.bin
deleted file mode 100644
index 8843728d..00000000
--- a/files/poketool/trainer/trdata/narc_0739.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0740.bin b/files/poketool/trainer/trdata/narc_0740.bin
deleted file mode 100644
index 972c8d32..00000000
--- a/files/poketool/trainer/trdata/narc_0740.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0741.bin b/files/poketool/trainer/trdata/narc_0741.bin
deleted file mode 100644
index 972c8d32..00000000
--- a/files/poketool/trainer/trdata/narc_0741.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0742.bin b/files/poketool/trainer/trdata/narc_0742.bin
deleted file mode 100644
index 7e07d284..00000000
--- a/files/poketool/trainer/trdata/narc_0742.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0743.bin b/files/poketool/trainer/trdata/narc_0743.bin
deleted file mode 100644
index 4a1839af..00000000
--- a/files/poketool/trainer/trdata/narc_0743.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0744.bin b/files/poketool/trainer/trdata/narc_0744.bin
deleted file mode 100644
index 4a1839af..00000000
--- a/files/poketool/trainer/trdata/narc_0744.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0745.bin b/files/poketool/trainer/trdata/narc_0745.bin
deleted file mode 100644
index 4a1839af..00000000
--- a/files/poketool/trainer/trdata/narc_0745.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0746.bin b/files/poketool/trainer/trdata/narc_0746.bin
deleted file mode 100644
index d1ba9d5c..00000000
--- a/files/poketool/trainer/trdata/narc_0746.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0747.bin b/files/poketool/trainer/trdata/narc_0747.bin
deleted file mode 100644
index d1ba9d5c..00000000
--- a/files/poketool/trainer/trdata/narc_0747.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0748.bin b/files/poketool/trainer/trdata/narc_0748.bin
deleted file mode 100644
index d1ba9d5c..00000000
--- a/files/poketool/trainer/trdata/narc_0748.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0749.bin b/files/poketool/trainer/trdata/narc_0749.bin
deleted file mode 100644
index b58a1adb..00000000
--- a/files/poketool/trainer/trdata/narc_0749.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0750.bin b/files/poketool/trainer/trdata/narc_0750.bin
deleted file mode 100644
index b58a1adb..00000000
--- a/files/poketool/trainer/trdata/narc_0750.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0751.bin b/files/poketool/trainer/trdata/narc_0751.bin
deleted file mode 100644
index b7e00871..00000000
--- a/files/poketool/trainer/trdata/narc_0751.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0752.bin b/files/poketool/trainer/trdata/narc_0752.bin
deleted file mode 100644
index b7e00871..00000000
--- a/files/poketool/trainer/trdata/narc_0752.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0753.bin b/files/poketool/trainer/trdata/narc_0753.bin
deleted file mode 100644
index bfe62fdb..00000000
--- a/files/poketool/trainer/trdata/narc_0753.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0754.bin b/files/poketool/trainer/trdata/narc_0754.bin
deleted file mode 100644
index bfe62fdb..00000000
--- a/files/poketool/trainer/trdata/narc_0754.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0755.bin b/files/poketool/trainer/trdata/narc_0755.bin
deleted file mode 100644
index 75ef0429..00000000
--- a/files/poketool/trainer/trdata/narc_0755.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0756.bin b/files/poketool/trainer/trdata/narc_0756.bin
deleted file mode 100644
index 75ef0429..00000000
--- a/files/poketool/trainer/trdata/narc_0756.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0757.bin b/files/poketool/trainer/trdata/narc_0757.bin
deleted file mode 100644
index 75ef0429..00000000
--- a/files/poketool/trainer/trdata/narc_0757.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0758.bin b/files/poketool/trainer/trdata/narc_0758.bin
deleted file mode 100644
index 75ef0429..00000000
--- a/files/poketool/trainer/trdata/narc_0758.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0759.bin b/files/poketool/trainer/trdata/narc_0759.bin
deleted file mode 100644
index 06f70012..00000000
--- a/files/poketool/trainer/trdata/narc_0759.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0760.bin b/files/poketool/trainer/trdata/narc_0760.bin
deleted file mode 100644
index 06f70012..00000000
--- a/files/poketool/trainer/trdata/narc_0760.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0761.bin b/files/poketool/trainer/trdata/narc_0761.bin
deleted file mode 100644
index 06f70012..00000000
--- a/files/poketool/trainer/trdata/narc_0761.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0762.bin b/files/poketool/trainer/trdata/narc_0762.bin
deleted file mode 100644
index 172b4b81..00000000
--- a/files/poketool/trainer/trdata/narc_0762.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0763.bin b/files/poketool/trainer/trdata/narc_0763.bin
deleted file mode 100644
index aeccc746..00000000
--- a/files/poketool/trainer/trdata/narc_0763.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0764.bin b/files/poketool/trainer/trdata/narc_0764.bin
deleted file mode 100644
index aeccc746..00000000
--- a/files/poketool/trainer/trdata/narc_0764.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0765.bin b/files/poketool/trainer/trdata/narc_0765.bin
deleted file mode 100644
index 7f3f4d63..00000000
--- a/files/poketool/trainer/trdata/narc_0765.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0766.bin b/files/poketool/trainer/trdata/narc_0766.bin
deleted file mode 100644
index 7f3f4d63..00000000
--- a/files/poketool/trainer/trdata/narc_0766.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0767.bin b/files/poketool/trainer/trdata/narc_0767.bin
deleted file mode 100644
index 7f3f4d63..00000000
--- a/files/poketool/trainer/trdata/narc_0767.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0768.bin b/files/poketool/trainer/trdata/narc_0768.bin
deleted file mode 100644
index 7f3f4d63..00000000
--- a/files/poketool/trainer/trdata/narc_0768.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0769.bin b/files/poketool/trainer/trdata/narc_0769.bin
deleted file mode 100644
index 7f3f4d63..00000000
--- a/files/poketool/trainer/trdata/narc_0769.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0770.bin b/files/poketool/trainer/trdata/narc_0770.bin
deleted file mode 100644
index 7f3f4d63..00000000
--- a/files/poketool/trainer/trdata/narc_0770.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0771.bin b/files/poketool/trainer/trdata/narc_0771.bin
deleted file mode 100644
index 337775bd..00000000
--- a/files/poketool/trainer/trdata/narc_0771.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0772.bin b/files/poketool/trainer/trdata/narc_0772.bin
deleted file mode 100644
index 337775bd..00000000
--- a/files/poketool/trainer/trdata/narc_0772.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0773.bin b/files/poketool/trainer/trdata/narc_0773.bin
deleted file mode 100644
index 63631284..00000000
--- a/files/poketool/trainer/trdata/narc_0773.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0774.bin b/files/poketool/trainer/trdata/narc_0774.bin
deleted file mode 100644
index 8d46840d..00000000
--- a/files/poketool/trainer/trdata/narc_0774.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0775.bin b/files/poketool/trainer/trdata/narc_0775.bin
deleted file mode 100644
index 63631284..00000000
--- a/files/poketool/trainer/trdata/narc_0775.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0776.bin b/files/poketool/trainer/trdata/narc_0776.bin
deleted file mode 100644
index 8d46840d..00000000
--- a/files/poketool/trainer/trdata/narc_0776.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0777.bin b/files/poketool/trainer/trdata/narc_0777.bin
deleted file mode 100644
index 8d46840d..00000000
--- a/files/poketool/trainer/trdata/narc_0777.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0778.bin b/files/poketool/trainer/trdata/narc_0778.bin
deleted file mode 100644
index 007cd3fa..00000000
--- a/files/poketool/trainer/trdata/narc_0778.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0779.bin b/files/poketool/trainer/trdata/narc_0779.bin
deleted file mode 100644
index 1a29e585..00000000
--- a/files/poketool/trainer/trdata/narc_0779.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0780.bin b/files/poketool/trainer/trdata/narc_0780.bin
deleted file mode 100644
index 1a29e585..00000000
--- a/files/poketool/trainer/trdata/narc_0780.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0781.bin b/files/poketool/trainer/trdata/narc_0781.bin
deleted file mode 100644
index 1a29e585..00000000
--- a/files/poketool/trainer/trdata/narc_0781.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0782.bin b/files/poketool/trainer/trdata/narc_0782.bin
deleted file mode 100644
index 1a29e585..00000000
--- a/files/poketool/trainer/trdata/narc_0782.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0783.bin b/files/poketool/trainer/trdata/narc_0783.bin
deleted file mode 100644
index 1a29e585..00000000
--- a/files/poketool/trainer/trdata/narc_0783.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0784.bin b/files/poketool/trainer/trdata/narc_0784.bin
deleted file mode 100644
index f322b90e..00000000
--- a/files/poketool/trainer/trdata/narc_0784.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0785.bin b/files/poketool/trainer/trdata/narc_0785.bin
deleted file mode 100644
index f322b90e..00000000
--- a/files/poketool/trainer/trdata/narc_0785.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0786.bin b/files/poketool/trainer/trdata/narc_0786.bin
deleted file mode 100644
index f322b90e..00000000
--- a/files/poketool/trainer/trdata/narc_0786.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0787.bin b/files/poketool/trainer/trdata/narc_0787.bin
deleted file mode 100644
index f322b90e..00000000
--- a/files/poketool/trainer/trdata/narc_0787.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0788.bin b/files/poketool/trainer/trdata/narc_0788.bin
deleted file mode 100644
index f322b90e..00000000
--- a/files/poketool/trainer/trdata/narc_0788.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0789.bin b/files/poketool/trainer/trdata/narc_0789.bin
deleted file mode 100644
index f322b90e..00000000
--- a/files/poketool/trainer/trdata/narc_0789.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0790.bin b/files/poketool/trainer/trdata/narc_0790.bin
deleted file mode 100644
index 895c47bd..00000000
--- a/files/poketool/trainer/trdata/narc_0790.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0791.bin b/files/poketool/trainer/trdata/narc_0791.bin
deleted file mode 100644
index 895c47bd..00000000
--- a/files/poketool/trainer/trdata/narc_0791.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0792.bin b/files/poketool/trainer/trdata/narc_0792.bin
deleted file mode 100644
index 895c47bd..00000000
--- a/files/poketool/trainer/trdata/narc_0792.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0793.bin b/files/poketool/trainer/trdata/narc_0793.bin
deleted file mode 100644
index 895c47bd..00000000
--- a/files/poketool/trainer/trdata/narc_0793.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0794.bin b/files/poketool/trainer/trdata/narc_0794.bin
deleted file mode 100644
index 895c47bd..00000000
--- a/files/poketool/trainer/trdata/narc_0794.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0795.bin b/files/poketool/trainer/trdata/narc_0795.bin
deleted file mode 100644
index 84abdd3a..00000000
--- a/files/poketool/trainer/trdata/narc_0795.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0796.bin b/files/poketool/trainer/trdata/narc_0796.bin
deleted file mode 100644
index 84abdd3a..00000000
--- a/files/poketool/trainer/trdata/narc_0796.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0797.bin b/files/poketool/trainer/trdata/narc_0797.bin
deleted file mode 100644
index 84abdd3a..00000000
--- a/files/poketool/trainer/trdata/narc_0797.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0798.bin b/files/poketool/trainer/trdata/narc_0798.bin
deleted file mode 100644
index 84abdd3a..00000000
--- a/files/poketool/trainer/trdata/narc_0798.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0799.bin b/files/poketool/trainer/trdata/narc_0799.bin
deleted file mode 100644
index 94015172..00000000
--- a/files/poketool/trainer/trdata/narc_0799.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0800.bin b/files/poketool/trainer/trdata/narc_0800.bin
deleted file mode 100644
index 94015172..00000000
--- a/files/poketool/trainer/trdata/narc_0800.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0801.bin b/files/poketool/trainer/trdata/narc_0801.bin
deleted file mode 100644
index 94015172..00000000
--- a/files/poketool/trainer/trdata/narc_0801.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0802.bin b/files/poketool/trainer/trdata/narc_0802.bin
deleted file mode 100644
index 94015172..00000000
--- a/files/poketool/trainer/trdata/narc_0802.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0803.bin b/files/poketool/trainer/trdata/narc_0803.bin
deleted file mode 100644
index 94015172..00000000
--- a/files/poketool/trainer/trdata/narc_0803.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0804.bin b/files/poketool/trainer/trdata/narc_0804.bin
deleted file mode 100644
index 7ac32e6c..00000000
--- a/files/poketool/trainer/trdata/narc_0804.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0805.bin b/files/poketool/trainer/trdata/narc_0805.bin
deleted file mode 100644
index 7ac32e6c..00000000
--- a/files/poketool/trainer/trdata/narc_0805.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0806.bin b/files/poketool/trainer/trdata/narc_0806.bin
deleted file mode 100644
index 7ac32e6c..00000000
--- a/files/poketool/trainer/trdata/narc_0806.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0807.bin b/files/poketool/trainer/trdata/narc_0807.bin
deleted file mode 100644
index 7ac32e6c..00000000
--- a/files/poketool/trainer/trdata/narc_0807.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0808.bin b/files/poketool/trainer/trdata/narc_0808.bin
deleted file mode 100644
index cc11cd42..00000000
--- a/files/poketool/trainer/trdata/narc_0808.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0809.bin b/files/poketool/trainer/trdata/narc_0809.bin
deleted file mode 100644
index a4bac0b2..00000000
--- a/files/poketool/trainer/trdata/narc_0809.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0810.bin b/files/poketool/trainer/trdata/narc_0810.bin
deleted file mode 100644
index a4bac0b2..00000000
--- a/files/poketool/trainer/trdata/narc_0810.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0811.bin b/files/poketool/trainer/trdata/narc_0811.bin
deleted file mode 100644
index a4bac0b2..00000000
--- a/files/poketool/trainer/trdata/narc_0811.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0812.bin b/files/poketool/trainer/trdata/narc_0812.bin
deleted file mode 100644
index a4bac0b2..00000000
--- a/files/poketool/trainer/trdata/narc_0812.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0813.bin b/files/poketool/trainer/trdata/narc_0813.bin
deleted file mode 100644
index 7b5ada8b..00000000
--- a/files/poketool/trainer/trdata/narc_0813.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0814.bin b/files/poketool/trainer/trdata/narc_0814.bin
deleted file mode 100644
index f4f52d21..00000000
--- a/files/poketool/trainer/trdata/narc_0814.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0815.bin b/files/poketool/trainer/trdata/narc_0815.bin
deleted file mode 100644
index 0ac27deb..00000000
--- a/files/poketool/trainer/trdata/narc_0815.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0816.bin b/files/poketool/trainer/trdata/narc_0816.bin
deleted file mode 100644
index b1fae20e..00000000
--- a/files/poketool/trainer/trdata/narc_0816.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0817.bin b/files/poketool/trainer/trdata/narc_0817.bin
deleted file mode 100644
index 5f259161..00000000
--- a/files/poketool/trainer/trdata/narc_0817.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0818.bin b/files/poketool/trainer/trdata/narc_0818.bin
deleted file mode 100644
index ae12af86..00000000
--- a/files/poketool/trainer/trdata/narc_0818.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0819.bin b/files/poketool/trainer/trdata/narc_0819.bin
deleted file mode 100644
index 5f259161..00000000
--- a/files/poketool/trainer/trdata/narc_0819.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0820.bin b/files/poketool/trainer/trdata/narc_0820.bin
deleted file mode 100644
index 5f259161..00000000
--- a/files/poketool/trainer/trdata/narc_0820.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0821.bin b/files/poketool/trainer/trdata/narc_0821.bin
deleted file mode 100644
index ae12af86..00000000
--- a/files/poketool/trainer/trdata/narc_0821.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0822.bin b/files/poketool/trainer/trdata/narc_0822.bin
deleted file mode 100644
index 5f259161..00000000
--- a/files/poketool/trainer/trdata/narc_0822.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0823.bin b/files/poketool/trainer/trdata/narc_0823.bin
deleted file mode 100644
index 5f259161..00000000
--- a/files/poketool/trainer/trdata/narc_0823.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0824.bin b/files/poketool/trainer/trdata/narc_0824.bin
deleted file mode 100644
index f1a6c7be..00000000
--- a/files/poketool/trainer/trdata/narc_0824.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0825.bin b/files/poketool/trainer/trdata/narc_0825.bin
deleted file mode 100644
index 2b6fc472..00000000
--- a/files/poketool/trainer/trdata/narc_0825.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0826.bin b/files/poketool/trainer/trdata/narc_0826.bin
deleted file mode 100644
index b8b1054b..00000000
--- a/files/poketool/trainer/trdata/narc_0826.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0827.bin b/files/poketool/trainer/trdata/narc_0827.bin
deleted file mode 100644
index 19d0b19d..00000000
--- a/files/poketool/trainer/trdata/narc_0827.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0828.bin b/files/poketool/trainer/trdata/narc_0828.bin
deleted file mode 100644
index a3aab1c5..00000000
--- a/files/poketool/trainer/trdata/narc_0828.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0829.bin b/files/poketool/trainer/trdata/narc_0829.bin
deleted file mode 100644
index 8c1aa653..00000000
--- a/files/poketool/trainer/trdata/narc_0829.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0830.bin b/files/poketool/trainer/trdata/narc_0830.bin
deleted file mode 100644
index 20a9d315..00000000
--- a/files/poketool/trainer/trdata/narc_0830.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0831.bin b/files/poketool/trainer/trdata/narc_0831.bin
deleted file mode 100644
index 8c1aa653..00000000
--- a/files/poketool/trainer/trdata/narc_0831.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0832.bin b/files/poketool/trainer/trdata/narc_0832.bin
deleted file mode 100644
index 8cdac29c..00000000
--- a/files/poketool/trainer/trdata/narc_0832.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0833.bin b/files/poketool/trainer/trdata/narc_0833.bin
deleted file mode 100644
index 1fc45f0a..00000000
--- a/files/poketool/trainer/trdata/narc_0833.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0834.bin b/files/poketool/trainer/trdata/narc_0834.bin
deleted file mode 100644
index d7e26687..00000000
--- a/files/poketool/trainer/trdata/narc_0834.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0835.bin b/files/poketool/trainer/trdata/narc_0835.bin
deleted file mode 100644
index d7e26687..00000000
--- a/files/poketool/trainer/trdata/narc_0835.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0836.bin b/files/poketool/trainer/trdata/narc_0836.bin
deleted file mode 100644
index d7e26687..00000000
--- a/files/poketool/trainer/trdata/narc_0836.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0837.bin b/files/poketool/trainer/trdata/narc_0837.bin
deleted file mode 100644
index c188464a..00000000
--- a/files/poketool/trainer/trdata/narc_0837.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0838.bin b/files/poketool/trainer/trdata/narc_0838.bin
deleted file mode 100644
index c188464a..00000000
--- a/files/poketool/trainer/trdata/narc_0838.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0839.bin b/files/poketool/trainer/trdata/narc_0839.bin
deleted file mode 100644
index c188464a..00000000
--- a/files/poketool/trainer/trdata/narc_0839.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0840.bin b/files/poketool/trainer/trdata/narc_0840.bin
deleted file mode 100644
index c188464a..00000000
--- a/files/poketool/trainer/trdata/narc_0840.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0841.bin b/files/poketool/trainer/trdata/narc_0841.bin
deleted file mode 100644
index c188464a..00000000
--- a/files/poketool/trainer/trdata/narc_0841.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0842.bin b/files/poketool/trainer/trdata/narc_0842.bin
deleted file mode 100644
index c188464a..00000000
--- a/files/poketool/trainer/trdata/narc_0842.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0843.bin b/files/poketool/trainer/trdata/narc_0843.bin
deleted file mode 100644
index 5c3198fb..00000000
--- a/files/poketool/trainer/trdata/narc_0843.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0844.bin b/files/poketool/trainer/trdata/narc_0844.bin
deleted file mode 100644
index 5354608b..00000000
--- a/files/poketool/trainer/trdata/narc_0844.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0845.bin b/files/poketool/trainer/trdata/narc_0845.bin
deleted file mode 100644
index b1fae20e..00000000
--- a/files/poketool/trainer/trdata/narc_0845.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0846.bin b/files/poketool/trainer/trdata/narc_0846.bin
deleted file mode 100644
index b1fae20e..00000000
--- a/files/poketool/trainer/trdata/narc_0846.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0847.bin b/files/poketool/trainer/trdata/narc_0847.bin
deleted file mode 100644
index 5c3198fb..00000000
--- a/files/poketool/trainer/trdata/narc_0847.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0848.bin b/files/poketool/trainer/trdata/narc_0848.bin
deleted file mode 100644
index 4e09951f..00000000
--- a/files/poketool/trainer/trdata/narc_0848.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trdata/narc_0849.bin b/files/poketool/trainer/trdata/narc_0849.bin
deleted file mode 100644
index 4e09951f..00000000
--- a/files/poketool/trainer/trdata/narc_0849.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke.json.txt b/files/poketool/trainer/trpoke.json.txt
new file mode 100644
index 00000000..09fa70b3
--- /dev/null
+++ b/files/poketool/trainer/trpoke.json.txt
@@ -0,0 +1,52 @@
+{{ doNotModifyHeader }}
+
+#include "global.h"
+#include "trainer_data.h"
+#include "constants/species.h"
+#include "constants/moves.h"
+#include "constants/items.h"
+
+#define max(a, b) ((a) >= (b) ? (a) : (b))
+
+u32 __size[] = { 8,
+## for trainer in trdata
+ (max({{ length(trainer.party) }} * {% if trainer.type == 0 %}6{% else if trainer.type == 1 %}14{% else if trainer.type == 2 %}8{% else %}16{% endif %}, 8) + 3) & ~3,
+## endfor
+};
+
+const u16 __data[] = { 0, 0, 0, 0,
+## for trainer in trdata
+ // Trainer #{{ trainer.index }}
+## if trainer.type == 0
+## set mon_length = 3
+## else if trainer.type == 1
+## set mon_length = 7
+## else if trainer.type == 2
+## set mon_length = 4
+## else if trainer.type == 3
+## set mon_length = 8
+## endif
+## set total_length = mon_length * length(trainer.party)
+## for mon in trainer.party
+ {{ mon.difficulty }}, // Difficulty 0-255
+ {{ mon.level }}, // Level
+ {{ mon.species }}, // Species
+## if trainer.type == 2 or trainer.type == 3
+ {{ mon.item }}, // Held item
+## endif
+## if trainer.type == 1 or trainer.type == 3
+ // Moveset
+## for i in range(4)
+## if i < length(mon.moves)
+ {{ at(mon.moves, i) }},
+## else
+ MOVE_NONE,
+## endif
+## endfor
+## endif
+## endfor
+## if total_length < 4 or total_length % 2 != 0
+ 0, // Padding
+## endif
+## endfor
+};
diff --git a/files/poketool/trainer/trpoke/.knarcignore b/files/poketool/trainer/trpoke/.knarcignore
deleted file mode 100644
index 2856080a..00000000
--- a/files/poketool/trainer/trpoke/.knarcignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.png
-*.pal
diff --git a/files/poketool/trainer/trpoke/narc_0000.bin b/files/poketool/trainer/trpoke/narc_0000.bin
deleted file mode 100644
index 1b1cb4d4..00000000
--- a/files/poketool/trainer/trpoke/narc_0000.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0001.bin b/files/poketool/trainer/trpoke/narc_0001.bin
deleted file mode 100644
index bde4ded3..00000000
--- a/files/poketool/trainer/trpoke/narc_0001.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0002.bin b/files/poketool/trainer/trpoke/narc_0002.bin
deleted file mode 100644
index 6622f6c0..00000000
--- a/files/poketool/trainer/trpoke/narc_0002.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0003.bin b/files/poketool/trainer/trpoke/narc_0003.bin
deleted file mode 100644
index 7fc43875..00000000
--- a/files/poketool/trainer/trpoke/narc_0003.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0004.bin b/files/poketool/trainer/trpoke/narc_0004.bin
deleted file mode 100644
index 53370b72..00000000
--- a/files/poketool/trainer/trpoke/narc_0004.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0005.bin b/files/poketool/trainer/trpoke/narc_0005.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0005.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0006.bin b/files/poketool/trainer/trpoke/narc_0006.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0006.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0007.bin b/files/poketool/trainer/trpoke/narc_0007.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0007.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0008.bin b/files/poketool/trainer/trpoke/narc_0008.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0008.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0009.bin b/files/poketool/trainer/trpoke/narc_0009.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0009.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0010.bin b/files/poketool/trainer/trpoke/narc_0010.bin
deleted file mode 100644
index b319e69f..00000000
--- a/files/poketool/trainer/trpoke/narc_0010.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0011.bin b/files/poketool/trainer/trpoke/narc_0011.bin
deleted file mode 100644
index b8af87e1..00000000
--- a/files/poketool/trainer/trpoke/narc_0011.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0012.bin b/files/poketool/trainer/trpoke/narc_0012.bin
deleted file mode 100644
index 6cd579eb..00000000
--- a/files/poketool/trainer/trpoke/narc_0012.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0013.bin b/files/poketool/trainer/trpoke/narc_0013.bin
deleted file mode 100644
index e7a24611..00000000
--- a/files/poketool/trainer/trpoke/narc_0013.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0014.bin b/files/poketool/trainer/trpoke/narc_0014.bin
deleted file mode 100644
index 91b4d102..00000000
--- a/files/poketool/trainer/trpoke/narc_0014.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0015.bin b/files/poketool/trainer/trpoke/narc_0015.bin
deleted file mode 100644
index 1b09a2f0..00000000
--- a/files/poketool/trainer/trpoke/narc_0015.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0016.bin b/files/poketool/trainer/trpoke/narc_0016.bin
deleted file mode 100644
index 436335e9..00000000
--- a/files/poketool/trainer/trpoke/narc_0016.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0017.bin b/files/poketool/trainer/trpoke/narc_0017.bin
deleted file mode 100644
index b4d7e0c3..00000000
--- a/files/poketool/trainer/trpoke/narc_0017.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0018.bin b/files/poketool/trainer/trpoke/narc_0018.bin
deleted file mode 100644
index 5e19ed7b..00000000
--- a/files/poketool/trainer/trpoke/narc_0018.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0019.bin b/files/poketool/trainer/trpoke/narc_0019.bin
deleted file mode 100644
index 5971bf36..00000000
--- a/files/poketool/trainer/trpoke/narc_0019.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0020.bin b/files/poketool/trainer/trpoke/narc_0020.bin
deleted file mode 100644
index 909bf61a..00000000
--- a/files/poketool/trainer/trpoke/narc_0020.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0021.bin b/files/poketool/trainer/trpoke/narc_0021.bin
deleted file mode 100644
index 856cb429..00000000
--- a/files/poketool/trainer/trpoke/narc_0021.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0022.bin b/files/poketool/trainer/trpoke/narc_0022.bin
deleted file mode 100644
index bbcc073c..00000000
--- a/files/poketool/trainer/trpoke/narc_0022.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0023.bin b/files/poketool/trainer/trpoke/narc_0023.bin
deleted file mode 100644
index 2edcd028..00000000
--- a/files/poketool/trainer/trpoke/narc_0023.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0024.bin b/files/poketool/trainer/trpoke/narc_0024.bin
deleted file mode 100644
index d291493e..00000000
--- a/files/poketool/trainer/trpoke/narc_0024.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0025.bin b/files/poketool/trainer/trpoke/narc_0025.bin
deleted file mode 100644
index 11a4b6cb..00000000
--- a/files/poketool/trainer/trpoke/narc_0025.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0026.bin b/files/poketool/trainer/trpoke/narc_0026.bin
deleted file mode 100644
index 71d3e71d..00000000
--- a/files/poketool/trainer/trpoke/narc_0026.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0027.bin b/files/poketool/trainer/trpoke/narc_0027.bin
deleted file mode 100644
index 7bf26d48..00000000
--- a/files/poketool/trainer/trpoke/narc_0027.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0028.bin b/files/poketool/trainer/trpoke/narc_0028.bin
deleted file mode 100644
index 9f36bc24..00000000
--- a/files/poketool/trainer/trpoke/narc_0028.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0029.bin b/files/poketool/trainer/trpoke/narc_0029.bin
deleted file mode 100644
index bc24d65b..00000000
--- a/files/poketool/trainer/trpoke/narc_0029.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0030.bin b/files/poketool/trainer/trpoke/narc_0030.bin
deleted file mode 100644
index ecfa9d84..00000000
--- a/files/poketool/trainer/trpoke/narc_0030.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0031.bin b/files/poketool/trainer/trpoke/narc_0031.bin
deleted file mode 100644
index 6bf70a02..00000000
--- a/files/poketool/trainer/trpoke/narc_0031.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0032.bin b/files/poketool/trainer/trpoke/narc_0032.bin
deleted file mode 100644
index a6f8e7f4..00000000
--- a/files/poketool/trainer/trpoke/narc_0032.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0033.bin b/files/poketool/trainer/trpoke/narc_0033.bin
deleted file mode 100644
index d4be0a74..00000000
--- a/files/poketool/trainer/trpoke/narc_0033.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0034.bin b/files/poketool/trainer/trpoke/narc_0034.bin
deleted file mode 100644
index da6961f7..00000000
--- a/files/poketool/trainer/trpoke/narc_0034.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0035.bin b/files/poketool/trainer/trpoke/narc_0035.bin
deleted file mode 100644
index 5b79cf77..00000000
--- a/files/poketool/trainer/trpoke/narc_0035.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0036.bin b/files/poketool/trainer/trpoke/narc_0036.bin
deleted file mode 100644
index 0fed8833..00000000
--- a/files/poketool/trainer/trpoke/narc_0036.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0037.bin b/files/poketool/trainer/trpoke/narc_0037.bin
deleted file mode 100644
index f0567871..00000000
--- a/files/poketool/trainer/trpoke/narc_0037.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0038.bin b/files/poketool/trainer/trpoke/narc_0038.bin
deleted file mode 100644
index 4377c696..00000000
--- a/files/poketool/trainer/trpoke/narc_0038.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0039.bin b/files/poketool/trainer/trpoke/narc_0039.bin
deleted file mode 100644
index 9d7af69d..00000000
--- a/files/poketool/trainer/trpoke/narc_0039.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0040.bin b/files/poketool/trainer/trpoke/narc_0040.bin
deleted file mode 100644
index 78eb455a..00000000
--- a/files/poketool/trainer/trpoke/narc_0040.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0041.bin b/files/poketool/trainer/trpoke/narc_0041.bin
deleted file mode 100644
index 626ddce9..00000000
--- a/files/poketool/trainer/trpoke/narc_0041.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0042.bin b/files/poketool/trainer/trpoke/narc_0042.bin
deleted file mode 100644
index 401dd7c6..00000000
--- a/files/poketool/trainer/trpoke/narc_0042.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0043.bin b/files/poketool/trainer/trpoke/narc_0043.bin
deleted file mode 100644
index 965c71cb..00000000
--- a/files/poketool/trainer/trpoke/narc_0043.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0044.bin b/files/poketool/trainer/trpoke/narc_0044.bin
deleted file mode 100644
index 7178c05a..00000000
--- a/files/poketool/trainer/trpoke/narc_0044.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0045.bin b/files/poketool/trainer/trpoke/narc_0045.bin
deleted file mode 100644
index 73452543..00000000
--- a/files/poketool/trainer/trpoke/narc_0045.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0046.bin b/files/poketool/trainer/trpoke/narc_0046.bin
deleted file mode 100644
index 23e869bb..00000000
--- a/files/poketool/trainer/trpoke/narc_0046.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0047.bin b/files/poketool/trainer/trpoke/narc_0047.bin
deleted file mode 100644
index 5ffdc35e..00000000
--- a/files/poketool/trainer/trpoke/narc_0047.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0048.bin b/files/poketool/trainer/trpoke/narc_0048.bin
deleted file mode 100644
index 589dc44c..00000000
--- a/files/poketool/trainer/trpoke/narc_0048.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0049.bin b/files/poketool/trainer/trpoke/narc_0049.bin
deleted file mode 100644
index 4372e85d..00000000
--- a/files/poketool/trainer/trpoke/narc_0049.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0050.bin b/files/poketool/trainer/trpoke/narc_0050.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0050.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0051.bin b/files/poketool/trainer/trpoke/narc_0051.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0051.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0052.bin b/files/poketool/trainer/trpoke/narc_0052.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0052.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0053.bin b/files/poketool/trainer/trpoke/narc_0053.bin
deleted file mode 100644
index 4b9ee62f..00000000
--- a/files/poketool/trainer/trpoke/narc_0053.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0054.bin b/files/poketool/trainer/trpoke/narc_0054.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0054.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0055.bin b/files/poketool/trainer/trpoke/narc_0055.bin
deleted file mode 100644
index cbcdcb8b..00000000
--- a/files/poketool/trainer/trpoke/narc_0055.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0056.bin b/files/poketool/trainer/trpoke/narc_0056.bin
deleted file mode 100644
index 7aad7e94..00000000
--- a/files/poketool/trainer/trpoke/narc_0056.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0057.bin b/files/poketool/trainer/trpoke/narc_0057.bin
deleted file mode 100644
index db785ea9..00000000
--- a/files/poketool/trainer/trpoke/narc_0057.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0058.bin b/files/poketool/trainer/trpoke/narc_0058.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0058.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0059.bin b/files/poketool/trainer/trpoke/narc_0059.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0059.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0060.bin b/files/poketool/trainer/trpoke/narc_0060.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0060.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0061.bin b/files/poketool/trainer/trpoke/narc_0061.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0061.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0062.bin b/files/poketool/trainer/trpoke/narc_0062.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0062.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0063.bin b/files/poketool/trainer/trpoke/narc_0063.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0063.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0064.bin b/files/poketool/trainer/trpoke/narc_0064.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0064.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0065.bin b/files/poketool/trainer/trpoke/narc_0065.bin
deleted file mode 100644
index 102e8cf4..00000000
--- a/files/poketool/trainer/trpoke/narc_0065.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0066.bin b/files/poketool/trainer/trpoke/narc_0066.bin
deleted file mode 100644
index 3de6b9d3..00000000
--- a/files/poketool/trainer/trpoke/narc_0066.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0067.bin b/files/poketool/trainer/trpoke/narc_0067.bin
deleted file mode 100644
index 4b1f8db0..00000000
--- a/files/poketool/trainer/trpoke/narc_0067.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0068.bin b/files/poketool/trainer/trpoke/narc_0068.bin
deleted file mode 100644
index 24f6484c..00000000
--- a/files/poketool/trainer/trpoke/narc_0068.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0069.bin b/files/poketool/trainer/trpoke/narc_0069.bin
deleted file mode 100644
index 403b87e4..00000000
--- a/files/poketool/trainer/trpoke/narc_0069.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0070.bin b/files/poketool/trainer/trpoke/narc_0070.bin
deleted file mode 100644
index 444b7052..00000000
--- a/files/poketool/trainer/trpoke/narc_0070.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0071.bin b/files/poketool/trainer/trpoke/narc_0071.bin
deleted file mode 100644
index c5a73669..00000000
--- a/files/poketool/trainer/trpoke/narc_0071.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0072.bin b/files/poketool/trainer/trpoke/narc_0072.bin
deleted file mode 100644
index 7d67c824..00000000
--- a/files/poketool/trainer/trpoke/narc_0072.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0073.bin b/files/poketool/trainer/trpoke/narc_0073.bin
deleted file mode 100644
index 316c763f..00000000
--- a/files/poketool/trainer/trpoke/narc_0073.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0074.bin b/files/poketool/trainer/trpoke/narc_0074.bin
deleted file mode 100644
index badf8e8b..00000000
--- a/files/poketool/trainer/trpoke/narc_0074.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0075.bin b/files/poketool/trainer/trpoke/narc_0075.bin
deleted file mode 100644
index 4316723c..00000000
--- a/files/poketool/trainer/trpoke/narc_0075.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0076.bin b/files/poketool/trainer/trpoke/narc_0076.bin
deleted file mode 100644
index 010df800..00000000
--- a/files/poketool/trainer/trpoke/narc_0076.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0077.bin b/files/poketool/trainer/trpoke/narc_0077.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0077.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0078.bin b/files/poketool/trainer/trpoke/narc_0078.bin
deleted file mode 100644
index f2444b07..00000000
--- a/files/poketool/trainer/trpoke/narc_0078.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0079.bin b/files/poketool/trainer/trpoke/narc_0079.bin
deleted file mode 100644
index eb996607..00000000
--- a/files/poketool/trainer/trpoke/narc_0079.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0080.bin b/files/poketool/trainer/trpoke/narc_0080.bin
deleted file mode 100644
index f1fbdba1..00000000
--- a/files/poketool/trainer/trpoke/narc_0080.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0081.bin b/files/poketool/trainer/trpoke/narc_0081.bin
deleted file mode 100644
index ff2b829c..00000000
--- a/files/poketool/trainer/trpoke/narc_0081.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0082.bin b/files/poketool/trainer/trpoke/narc_0082.bin
deleted file mode 100644
index 4372e85d..00000000
--- a/files/poketool/trainer/trpoke/narc_0082.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0083.bin b/files/poketool/trainer/trpoke/narc_0083.bin
deleted file mode 100644
index f64eecd1..00000000
--- a/files/poketool/trainer/trpoke/narc_0083.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0084.bin b/files/poketool/trainer/trpoke/narc_0084.bin
deleted file mode 100644
index 90ed0817..00000000
--- a/files/poketool/trainer/trpoke/narc_0084.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0085.bin b/files/poketool/trainer/trpoke/narc_0085.bin
deleted file mode 100644
index bc0f7a5f..00000000
--- a/files/poketool/trainer/trpoke/narc_0085.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0086.bin b/files/poketool/trainer/trpoke/narc_0086.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0086.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0087.bin b/files/poketool/trainer/trpoke/narc_0087.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0087.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0088.bin b/files/poketool/trainer/trpoke/narc_0088.bin
deleted file mode 100644
index f96e5e8f..00000000
--- a/files/poketool/trainer/trpoke/narc_0088.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0089.bin b/files/poketool/trainer/trpoke/narc_0089.bin
deleted file mode 100644
index f96e5e8f..00000000
--- a/files/poketool/trainer/trpoke/narc_0089.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0090.bin b/files/poketool/trainer/trpoke/narc_0090.bin
deleted file mode 100644
index 3d32274a..00000000
--- a/files/poketool/trainer/trpoke/narc_0090.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0091.bin b/files/poketool/trainer/trpoke/narc_0091.bin
deleted file mode 100644
index 619da722..00000000
--- a/files/poketool/trainer/trpoke/narc_0091.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0092.bin b/files/poketool/trainer/trpoke/narc_0092.bin
deleted file mode 100644
index f2fd51ab..00000000
--- a/files/poketool/trainer/trpoke/narc_0092.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0093.bin b/files/poketool/trainer/trpoke/narc_0093.bin
deleted file mode 100644
index 5f48099d..00000000
--- a/files/poketool/trainer/trpoke/narc_0093.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0094.bin b/files/poketool/trainer/trpoke/narc_0094.bin
deleted file mode 100644
index 161df9be..00000000
--- a/files/poketool/trainer/trpoke/narc_0094.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0095.bin b/files/poketool/trainer/trpoke/narc_0095.bin
deleted file mode 100644
index eabc9eaf..00000000
--- a/files/poketool/trainer/trpoke/narc_0095.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0096.bin b/files/poketool/trainer/trpoke/narc_0096.bin
deleted file mode 100644
index 32274c8a..00000000
--- a/files/poketool/trainer/trpoke/narc_0096.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0097.bin b/files/poketool/trainer/trpoke/narc_0097.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0097.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0098.bin b/files/poketool/trainer/trpoke/narc_0098.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0098.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0099.bin b/files/poketool/trainer/trpoke/narc_0099.bin
deleted file mode 100644
index da1bcdd9..00000000
--- a/files/poketool/trainer/trpoke/narc_0099.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0100.bin b/files/poketool/trainer/trpoke/narc_0100.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0100.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0101.bin b/files/poketool/trainer/trpoke/narc_0101.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0101.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0102.bin b/files/poketool/trainer/trpoke/narc_0102.bin
deleted file mode 100644
index 4e1a338f..00000000
--- a/files/poketool/trainer/trpoke/narc_0102.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0103.bin b/files/poketool/trainer/trpoke/narc_0103.bin
deleted file mode 100644
index 85ef5856..00000000
--- a/files/poketool/trainer/trpoke/narc_0103.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0104.bin b/files/poketool/trainer/trpoke/narc_0104.bin
deleted file mode 100644
index 9565c74e..00000000
--- a/files/poketool/trainer/trpoke/narc_0104.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0105.bin b/files/poketool/trainer/trpoke/narc_0105.bin
deleted file mode 100644
index e22cc17a..00000000
--- a/files/poketool/trainer/trpoke/narc_0105.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0106.bin b/files/poketool/trainer/trpoke/narc_0106.bin
deleted file mode 100644
index f6cae125..00000000
--- a/files/poketool/trainer/trpoke/narc_0106.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0107.bin b/files/poketool/trainer/trpoke/narc_0107.bin
deleted file mode 100644
index 8a563178..00000000
--- a/files/poketool/trainer/trpoke/narc_0107.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0108.bin b/files/poketool/trainer/trpoke/narc_0108.bin
deleted file mode 100644
index a932f54c..00000000
--- a/files/poketool/trainer/trpoke/narc_0108.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0109.bin b/files/poketool/trainer/trpoke/narc_0109.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0109.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0110.bin b/files/poketool/trainer/trpoke/narc_0110.bin
deleted file mode 100644
index d91ff941..00000000
--- a/files/poketool/trainer/trpoke/narc_0110.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0111.bin b/files/poketool/trainer/trpoke/narc_0111.bin
deleted file mode 100644
index 62c56ef3..00000000
--- a/files/poketool/trainer/trpoke/narc_0111.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0112.bin b/files/poketool/trainer/trpoke/narc_0112.bin
deleted file mode 100644
index 1f22752b..00000000
--- a/files/poketool/trainer/trpoke/narc_0112.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0113.bin b/files/poketool/trainer/trpoke/narc_0113.bin
deleted file mode 100644
index 71621a0b..00000000
--- a/files/poketool/trainer/trpoke/narc_0113.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0114.bin b/files/poketool/trainer/trpoke/narc_0114.bin
deleted file mode 100644
index 05ca87ee..00000000
--- a/files/poketool/trainer/trpoke/narc_0114.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0115.bin b/files/poketool/trainer/trpoke/narc_0115.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0115.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0116.bin b/files/poketool/trainer/trpoke/narc_0116.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0116.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0117.bin b/files/poketool/trainer/trpoke/narc_0117.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0117.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0118.bin b/files/poketool/trainer/trpoke/narc_0118.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0118.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0119.bin b/files/poketool/trainer/trpoke/narc_0119.bin
deleted file mode 100644
index 328994ce..00000000
--- a/files/poketool/trainer/trpoke/narc_0119.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0120.bin b/files/poketool/trainer/trpoke/narc_0120.bin
deleted file mode 100644
index 086a0bf1..00000000
--- a/files/poketool/trainer/trpoke/narc_0120.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0121.bin b/files/poketool/trainer/trpoke/narc_0121.bin
deleted file mode 100644
index 383e5174..00000000
--- a/files/poketool/trainer/trpoke/narc_0121.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0122.bin b/files/poketool/trainer/trpoke/narc_0122.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0122.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0123.bin b/files/poketool/trainer/trpoke/narc_0123.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0123.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0124.bin b/files/poketool/trainer/trpoke/narc_0124.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0124.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0125.bin b/files/poketool/trainer/trpoke/narc_0125.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0125.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0126.bin b/files/poketool/trainer/trpoke/narc_0126.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0126.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0127.bin b/files/poketool/trainer/trpoke/narc_0127.bin
deleted file mode 100644
index 3cd413a0..00000000
--- a/files/poketool/trainer/trpoke/narc_0127.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0128.bin b/files/poketool/trainer/trpoke/narc_0128.bin
deleted file mode 100644
index b3a3c96b..00000000
--- a/files/poketool/trainer/trpoke/narc_0128.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0129.bin b/files/poketool/trainer/trpoke/narc_0129.bin
deleted file mode 100644
index be159e9e..00000000
--- a/files/poketool/trainer/trpoke/narc_0129.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0130.bin b/files/poketool/trainer/trpoke/narc_0130.bin
deleted file mode 100644
index 5e5c1fc5..00000000
--- a/files/poketool/trainer/trpoke/narc_0130.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0131.bin b/files/poketool/trainer/trpoke/narc_0131.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0131.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0132.bin b/files/poketool/trainer/trpoke/narc_0132.bin
deleted file mode 100644
index cc0d6729..00000000
--- a/files/poketool/trainer/trpoke/narc_0132.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0133.bin b/files/poketool/trainer/trpoke/narc_0133.bin
deleted file mode 100644
index e55a7e8e..00000000
--- a/files/poketool/trainer/trpoke/narc_0133.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0134.bin b/files/poketool/trainer/trpoke/narc_0134.bin
deleted file mode 100644
index ce0ad7c6..00000000
--- a/files/poketool/trainer/trpoke/narc_0134.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0135.bin b/files/poketool/trainer/trpoke/narc_0135.bin
deleted file mode 100644
index af775466..00000000
--- a/files/poketool/trainer/trpoke/narc_0135.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0136.bin b/files/poketool/trainer/trpoke/narc_0136.bin
deleted file mode 100644
index 2a9a47fe..00000000
--- a/files/poketool/trainer/trpoke/narc_0136.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0137.bin b/files/poketool/trainer/trpoke/narc_0137.bin
deleted file mode 100644
index 2e8055fc..00000000
--- a/files/poketool/trainer/trpoke/narc_0137.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0138.bin b/files/poketool/trainer/trpoke/narc_0138.bin
deleted file mode 100644
index ce4f614e..00000000
--- a/files/poketool/trainer/trpoke/narc_0138.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0139.bin b/files/poketool/trainer/trpoke/narc_0139.bin
deleted file mode 100644
index 3951a055..00000000
--- a/files/poketool/trainer/trpoke/narc_0139.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0140.bin b/files/poketool/trainer/trpoke/narc_0140.bin
deleted file mode 100644
index 9cf702b8..00000000
--- a/files/poketool/trainer/trpoke/narc_0140.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0141.bin b/files/poketool/trainer/trpoke/narc_0141.bin
deleted file mode 100644
index dbb2285a..00000000
--- a/files/poketool/trainer/trpoke/narc_0141.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0142.bin b/files/poketool/trainer/trpoke/narc_0142.bin
deleted file mode 100644
index 5c34e164..00000000
--- a/files/poketool/trainer/trpoke/narc_0142.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0143.bin b/files/poketool/trainer/trpoke/narc_0143.bin
deleted file mode 100644
index 7ce5b0a3..00000000
--- a/files/poketool/trainer/trpoke/narc_0143.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0144.bin b/files/poketool/trainer/trpoke/narc_0144.bin
deleted file mode 100644
index df91eab4..00000000
--- a/files/poketool/trainer/trpoke/narc_0144.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0145.bin b/files/poketool/trainer/trpoke/narc_0145.bin
deleted file mode 100644
index 275c6520..00000000
--- a/files/poketool/trainer/trpoke/narc_0145.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0146.bin b/files/poketool/trainer/trpoke/narc_0146.bin
deleted file mode 100644
index f413d6c5..00000000
--- a/files/poketool/trainer/trpoke/narc_0146.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0147.bin b/files/poketool/trainer/trpoke/narc_0147.bin
deleted file mode 100644
index 54568767..00000000
--- a/files/poketool/trainer/trpoke/narc_0147.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0148.bin b/files/poketool/trainer/trpoke/narc_0148.bin
deleted file mode 100644
index 4b119089..00000000
--- a/files/poketool/trainer/trpoke/narc_0148.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0149.bin b/files/poketool/trainer/trpoke/narc_0149.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0149.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0150.bin b/files/poketool/trainer/trpoke/narc_0150.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0150.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0151.bin b/files/poketool/trainer/trpoke/narc_0151.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0151.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0152.bin b/files/poketool/trainer/trpoke/narc_0152.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0152.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0153.bin b/files/poketool/trainer/trpoke/narc_0153.bin
deleted file mode 100644
index 87a57231..00000000
--- a/files/poketool/trainer/trpoke/narc_0153.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0154.bin b/files/poketool/trainer/trpoke/narc_0154.bin
deleted file mode 100644
index 8250e034..00000000
--- a/files/poketool/trainer/trpoke/narc_0154.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0155.bin b/files/poketool/trainer/trpoke/narc_0155.bin
deleted file mode 100644
index 1f22752b..00000000
--- a/files/poketool/trainer/trpoke/narc_0155.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0156.bin b/files/poketool/trainer/trpoke/narc_0156.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0156.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0157.bin b/files/poketool/trainer/trpoke/narc_0157.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0157.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0158.bin b/files/poketool/trainer/trpoke/narc_0158.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0158.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0159.bin b/files/poketool/trainer/trpoke/narc_0159.bin
deleted file mode 100644
index 6d0b6dfb..00000000
--- a/files/poketool/trainer/trpoke/narc_0159.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0160.bin b/files/poketool/trainer/trpoke/narc_0160.bin
deleted file mode 100644
index ba01e5d5..00000000
--- a/files/poketool/trainer/trpoke/narc_0160.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0161.bin b/files/poketool/trainer/trpoke/narc_0161.bin
deleted file mode 100644
index 79ed30c8..00000000
--- a/files/poketool/trainer/trpoke/narc_0161.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0162.bin b/files/poketool/trainer/trpoke/narc_0162.bin
deleted file mode 100644
index b6abc936..00000000
--- a/files/poketool/trainer/trpoke/narc_0162.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0163.bin b/files/poketool/trainer/trpoke/narc_0163.bin
deleted file mode 100644
index 3cfaf03b..00000000
--- a/files/poketool/trainer/trpoke/narc_0163.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0164.bin b/files/poketool/trainer/trpoke/narc_0164.bin
deleted file mode 100644
index 85c95f36..00000000
--- a/files/poketool/trainer/trpoke/narc_0164.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0165.bin b/files/poketool/trainer/trpoke/narc_0165.bin
deleted file mode 100644
index 1f22752b..00000000
--- a/files/poketool/trainer/trpoke/narc_0165.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0166.bin b/files/poketool/trainer/trpoke/narc_0166.bin
deleted file mode 100644
index 5c051846..00000000
--- a/files/poketool/trainer/trpoke/narc_0166.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0167.bin b/files/poketool/trainer/trpoke/narc_0167.bin
deleted file mode 100644
index d9834188..00000000
--- a/files/poketool/trainer/trpoke/narc_0167.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0168.bin b/files/poketool/trainer/trpoke/narc_0168.bin
deleted file mode 100644
index 61aa2c84..00000000
--- a/files/poketool/trainer/trpoke/narc_0168.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0169.bin b/files/poketool/trainer/trpoke/narc_0169.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0169.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0170.bin b/files/poketool/trainer/trpoke/narc_0170.bin
deleted file mode 100644
index 6395744c..00000000
--- a/files/poketool/trainer/trpoke/narc_0170.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0171.bin b/files/poketool/trainer/trpoke/narc_0171.bin
deleted file mode 100644
index 468b52c4..00000000
--- a/files/poketool/trainer/trpoke/narc_0171.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0172.bin b/files/poketool/trainer/trpoke/narc_0172.bin
deleted file mode 100644
index 059bb431..00000000
--- a/files/poketool/trainer/trpoke/narc_0172.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0173.bin b/files/poketool/trainer/trpoke/narc_0173.bin
deleted file mode 100644
index a11fe469..00000000
--- a/files/poketool/trainer/trpoke/narc_0173.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0174.bin b/files/poketool/trainer/trpoke/narc_0174.bin
deleted file mode 100644
index f9fcdc48..00000000
--- a/files/poketool/trainer/trpoke/narc_0174.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0175.bin b/files/poketool/trainer/trpoke/narc_0175.bin
deleted file mode 100644
index 8ad3b596..00000000
--- a/files/poketool/trainer/trpoke/narc_0175.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0176.bin b/files/poketool/trainer/trpoke/narc_0176.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0176.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0177.bin b/files/poketool/trainer/trpoke/narc_0177.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0177.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0178.bin b/files/poketool/trainer/trpoke/narc_0178.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0178.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0179.bin b/files/poketool/trainer/trpoke/narc_0179.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0179.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0180.bin b/files/poketool/trainer/trpoke/narc_0180.bin
deleted file mode 100644
index 96c06305..00000000
--- a/files/poketool/trainer/trpoke/narc_0180.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0181.bin b/files/poketool/trainer/trpoke/narc_0181.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0181.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0182.bin b/files/poketool/trainer/trpoke/narc_0182.bin
deleted file mode 100644
index 1f22752b..00000000
--- a/files/poketool/trainer/trpoke/narc_0182.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0183.bin b/files/poketool/trainer/trpoke/narc_0183.bin
deleted file mode 100644
index 975343a4..00000000
--- a/files/poketool/trainer/trpoke/narc_0183.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0184.bin b/files/poketool/trainer/trpoke/narc_0184.bin
deleted file mode 100644
index fa62cffe..00000000
--- a/files/poketool/trainer/trpoke/narc_0184.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0185.bin b/files/poketool/trainer/trpoke/narc_0185.bin
deleted file mode 100644
index 68f44358..00000000
--- a/files/poketool/trainer/trpoke/narc_0185.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0186.bin b/files/poketool/trainer/trpoke/narc_0186.bin
deleted file mode 100644
index 79ad7b47..00000000
--- a/files/poketool/trainer/trpoke/narc_0186.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0187.bin b/files/poketool/trainer/trpoke/narc_0187.bin
deleted file mode 100644
index a0b7d7eb..00000000
--- a/files/poketool/trainer/trpoke/narc_0187.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0188.bin b/files/poketool/trainer/trpoke/narc_0188.bin
deleted file mode 100644
index 0d6a79ea..00000000
--- a/files/poketool/trainer/trpoke/narc_0188.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0189.bin b/files/poketool/trainer/trpoke/narc_0189.bin
deleted file mode 100644
index a9a39d70..00000000
--- a/files/poketool/trainer/trpoke/narc_0189.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0190.bin b/files/poketool/trainer/trpoke/narc_0190.bin
deleted file mode 100644
index d8292792..00000000
--- a/files/poketool/trainer/trpoke/narc_0190.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0191.bin b/files/poketool/trainer/trpoke/narc_0191.bin
deleted file mode 100644
index a03e617e..00000000
--- a/files/poketool/trainer/trpoke/narc_0191.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0192.bin b/files/poketool/trainer/trpoke/narc_0192.bin
deleted file mode 100644
index 7a31e70b..00000000
--- a/files/poketool/trainer/trpoke/narc_0192.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0193.bin b/files/poketool/trainer/trpoke/narc_0193.bin
deleted file mode 100644
index 239eadba..00000000
--- a/files/poketool/trainer/trpoke/narc_0193.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0194.bin b/files/poketool/trainer/trpoke/narc_0194.bin
deleted file mode 100644
index 207845e6..00000000
--- a/files/poketool/trainer/trpoke/narc_0194.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0195.bin b/files/poketool/trainer/trpoke/narc_0195.bin
deleted file mode 100644
index ac2b65ec..00000000
--- a/files/poketool/trainer/trpoke/narc_0195.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0196.bin b/files/poketool/trainer/trpoke/narc_0196.bin
deleted file mode 100644
index 6cad203a..00000000
--- a/files/poketool/trainer/trpoke/narc_0196.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0197.bin b/files/poketool/trainer/trpoke/narc_0197.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0197.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0198.bin b/files/poketool/trainer/trpoke/narc_0198.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0198.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0199.bin b/files/poketool/trainer/trpoke/narc_0199.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0199.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0200.bin b/files/poketool/trainer/trpoke/narc_0200.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0200.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0201.bin b/files/poketool/trainer/trpoke/narc_0201.bin
deleted file mode 100644
index 566188c9..00000000
--- a/files/poketool/trainer/trpoke/narc_0201.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0202.bin b/files/poketool/trainer/trpoke/narc_0202.bin
deleted file mode 100644
index e5a29b7b..00000000
--- a/files/poketool/trainer/trpoke/narc_0202.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0203.bin b/files/poketool/trainer/trpoke/narc_0203.bin
deleted file mode 100644
index 7ac1a6de..00000000
--- a/files/poketool/trainer/trpoke/narc_0203.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0204.bin b/files/poketool/trainer/trpoke/narc_0204.bin
deleted file mode 100644
index 8b2c6878..00000000
--- a/files/poketool/trainer/trpoke/narc_0204.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0205.bin b/files/poketool/trainer/trpoke/narc_0205.bin
deleted file mode 100644
index 5c116114..00000000
--- a/files/poketool/trainer/trpoke/narc_0205.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0206.bin b/files/poketool/trainer/trpoke/narc_0206.bin
deleted file mode 100644
index 5c116114..00000000
--- a/files/poketool/trainer/trpoke/narc_0206.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0207.bin b/files/poketool/trainer/trpoke/narc_0207.bin
deleted file mode 100644
index 1f22752b..00000000
--- a/files/poketool/trainer/trpoke/narc_0207.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0208.bin b/files/poketool/trainer/trpoke/narc_0208.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0208.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0209.bin b/files/poketool/trainer/trpoke/narc_0209.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0209.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0210.bin b/files/poketool/trainer/trpoke/narc_0210.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0210.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0211.bin b/files/poketool/trainer/trpoke/narc_0211.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0211.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0212.bin b/files/poketool/trainer/trpoke/narc_0212.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0212.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0213.bin b/files/poketool/trainer/trpoke/narc_0213.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0213.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0214.bin b/files/poketool/trainer/trpoke/narc_0214.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0214.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0215.bin b/files/poketool/trainer/trpoke/narc_0215.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0215.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0216.bin b/files/poketool/trainer/trpoke/narc_0216.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0216.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0217.bin b/files/poketool/trainer/trpoke/narc_0217.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0217.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0218.bin b/files/poketool/trainer/trpoke/narc_0218.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0218.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0219.bin b/files/poketool/trainer/trpoke/narc_0219.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0219.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0220.bin b/files/poketool/trainer/trpoke/narc_0220.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0220.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0221.bin b/files/poketool/trainer/trpoke/narc_0221.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0221.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0222.bin b/files/poketool/trainer/trpoke/narc_0222.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0222.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0223.bin b/files/poketool/trainer/trpoke/narc_0223.bin
deleted file mode 100644
index 1f22752b..00000000
--- a/files/poketool/trainer/trpoke/narc_0223.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0224.bin b/files/poketool/trainer/trpoke/narc_0224.bin
deleted file mode 100644
index f148bf98..00000000
--- a/files/poketool/trainer/trpoke/narc_0224.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0225.bin b/files/poketool/trainer/trpoke/narc_0225.bin
deleted file mode 100644
index bd1a6911..00000000
--- a/files/poketool/trainer/trpoke/narc_0225.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0226.bin b/files/poketool/trainer/trpoke/narc_0226.bin
deleted file mode 100644
index f620303e..00000000
--- a/files/poketool/trainer/trpoke/narc_0226.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0227.bin b/files/poketool/trainer/trpoke/narc_0227.bin
deleted file mode 100644
index 9415a01d..00000000
--- a/files/poketool/trainer/trpoke/narc_0227.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0228.bin b/files/poketool/trainer/trpoke/narc_0228.bin
deleted file mode 100644
index be0f967c..00000000
--- a/files/poketool/trainer/trpoke/narc_0228.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0229.bin b/files/poketool/trainer/trpoke/narc_0229.bin
deleted file mode 100644
index c7285213..00000000
--- a/files/poketool/trainer/trpoke/narc_0229.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0230.bin b/files/poketool/trainer/trpoke/narc_0230.bin
deleted file mode 100644
index dad54170..00000000
--- a/files/poketool/trainer/trpoke/narc_0230.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0231.bin b/files/poketool/trainer/trpoke/narc_0231.bin
deleted file mode 100644
index 90de6414..00000000
--- a/files/poketool/trainer/trpoke/narc_0231.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0232.bin b/files/poketool/trainer/trpoke/narc_0232.bin
deleted file mode 100644
index 1412bb22..00000000
--- a/files/poketool/trainer/trpoke/narc_0232.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0233.bin b/files/poketool/trainer/trpoke/narc_0233.bin
deleted file mode 100644
index 1df2d494..00000000
--- a/files/poketool/trainer/trpoke/narc_0233.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0234.bin b/files/poketool/trainer/trpoke/narc_0234.bin
deleted file mode 100644
index bbb9eee7..00000000
--- a/files/poketool/trainer/trpoke/narc_0234.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0235.bin b/files/poketool/trainer/trpoke/narc_0235.bin
deleted file mode 100644
index 5e7ac6c5..00000000
--- a/files/poketool/trainer/trpoke/narc_0235.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0236.bin b/files/poketool/trainer/trpoke/narc_0236.bin
deleted file mode 100644
index 371aa93d..00000000
--- a/files/poketool/trainer/trpoke/narc_0236.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0237.bin b/files/poketool/trainer/trpoke/narc_0237.bin
deleted file mode 100644
index 9a6af012..00000000
--- a/files/poketool/trainer/trpoke/narc_0237.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0238.bin b/files/poketool/trainer/trpoke/narc_0238.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0238.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0239.bin b/files/poketool/trainer/trpoke/narc_0239.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0239.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0240.bin b/files/poketool/trainer/trpoke/narc_0240.bin
deleted file mode 100644
index 5bcf9522..00000000
--- a/files/poketool/trainer/trpoke/narc_0240.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0241.bin b/files/poketool/trainer/trpoke/narc_0241.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0241.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0242.bin b/files/poketool/trainer/trpoke/narc_0242.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0242.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0243.bin b/files/poketool/trainer/trpoke/narc_0243.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0243.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0244.bin b/files/poketool/trainer/trpoke/narc_0244.bin
deleted file mode 100644
index 356d873b..00000000
--- a/files/poketool/trainer/trpoke/narc_0244.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0245.bin b/files/poketool/trainer/trpoke/narc_0245.bin
deleted file mode 100644
index c99dca2b..00000000
--- a/files/poketool/trainer/trpoke/narc_0245.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0246.bin b/files/poketool/trainer/trpoke/narc_0246.bin
deleted file mode 100644
index 686270af..00000000
--- a/files/poketool/trainer/trpoke/narc_0246.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0247.bin b/files/poketool/trainer/trpoke/narc_0247.bin
deleted file mode 100644
index 446a62fa..00000000
--- a/files/poketool/trainer/trpoke/narc_0247.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0248.bin b/files/poketool/trainer/trpoke/narc_0248.bin
deleted file mode 100644
index 8e125291..00000000
--- a/files/poketool/trainer/trpoke/narc_0248.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0249.bin b/files/poketool/trainer/trpoke/narc_0249.bin
deleted file mode 100644
index 7a9294bc..00000000
--- a/files/poketool/trainer/trpoke/narc_0249.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0250.bin b/files/poketool/trainer/trpoke/narc_0250.bin
deleted file mode 100644
index 3ed0bfc9..00000000
--- a/files/poketool/trainer/trpoke/narc_0250.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0251.bin b/files/poketool/trainer/trpoke/narc_0251.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0251.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0252.bin b/files/poketool/trainer/trpoke/narc_0252.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0252.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0253.bin b/files/poketool/trainer/trpoke/narc_0253.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0253.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0254.bin b/files/poketool/trainer/trpoke/narc_0254.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0254.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0255.bin b/files/poketool/trainer/trpoke/narc_0255.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0255.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0256.bin b/files/poketool/trainer/trpoke/narc_0256.bin
deleted file mode 100644
index 9fec2408..00000000
--- a/files/poketool/trainer/trpoke/narc_0256.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0257.bin b/files/poketool/trainer/trpoke/narc_0257.bin
deleted file mode 100644
index 75f65560..00000000
--- a/files/poketool/trainer/trpoke/narc_0257.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0258.bin b/files/poketool/trainer/trpoke/narc_0258.bin
deleted file mode 100644
index 14040d15..00000000
--- a/files/poketool/trainer/trpoke/narc_0258.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0259.bin b/files/poketool/trainer/trpoke/narc_0259.bin
deleted file mode 100644
index 9294a927..00000000
--- a/files/poketool/trainer/trpoke/narc_0259.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0260.bin b/files/poketool/trainer/trpoke/narc_0260.bin
deleted file mode 100644
index bdc31772..00000000
--- a/files/poketool/trainer/trpoke/narc_0260.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0261.bin b/files/poketool/trainer/trpoke/narc_0261.bin
deleted file mode 100644
index b1b4861f..00000000
--- a/files/poketool/trainer/trpoke/narc_0261.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0262.bin b/files/poketool/trainer/trpoke/narc_0262.bin
deleted file mode 100644
index a9af199a..00000000
--- a/files/poketool/trainer/trpoke/narc_0262.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0263.bin b/files/poketool/trainer/trpoke/narc_0263.bin
deleted file mode 100644
index 5581dc0b..00000000
--- a/files/poketool/trainer/trpoke/narc_0263.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0264.bin b/files/poketool/trainer/trpoke/narc_0264.bin
deleted file mode 100644
index 6626c9f3..00000000
--- a/files/poketool/trainer/trpoke/narc_0264.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0265.bin b/files/poketool/trainer/trpoke/narc_0265.bin
deleted file mode 100644
index de72b3eb..00000000
--- a/files/poketool/trainer/trpoke/narc_0265.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0266.bin b/files/poketool/trainer/trpoke/narc_0266.bin
deleted file mode 100644
index be37eb48..00000000
--- a/files/poketool/trainer/trpoke/narc_0266.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0267.bin b/files/poketool/trainer/trpoke/narc_0267.bin
deleted file mode 100644
index 533f78cd..00000000
--- a/files/poketool/trainer/trpoke/narc_0267.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0268.bin b/files/poketool/trainer/trpoke/narc_0268.bin
deleted file mode 100644
index 577967c1..00000000
--- a/files/poketool/trainer/trpoke/narc_0268.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0269.bin b/files/poketool/trainer/trpoke/narc_0269.bin
deleted file mode 100644
index 91c61437..00000000
--- a/files/poketool/trainer/trpoke/narc_0269.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0270.bin b/files/poketool/trainer/trpoke/narc_0270.bin
deleted file mode 100644
index a9afb2b2..00000000
--- a/files/poketool/trainer/trpoke/narc_0270.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0271.bin b/files/poketool/trainer/trpoke/narc_0271.bin
deleted file mode 100644
index b538ebcf..00000000
--- a/files/poketool/trainer/trpoke/narc_0271.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0272.bin b/files/poketool/trainer/trpoke/narc_0272.bin
deleted file mode 100644
index d0b481d4..00000000
--- a/files/poketool/trainer/trpoke/narc_0272.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0273.bin b/files/poketool/trainer/trpoke/narc_0273.bin
deleted file mode 100644
index 6fb067bb..00000000
--- a/files/poketool/trainer/trpoke/narc_0273.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0274.bin b/files/poketool/trainer/trpoke/narc_0274.bin
deleted file mode 100644
index 4fed4365..00000000
--- a/files/poketool/trainer/trpoke/narc_0274.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0275.bin b/files/poketool/trainer/trpoke/narc_0275.bin
deleted file mode 100644
index 60c54bb9..00000000
--- a/files/poketool/trainer/trpoke/narc_0275.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0276.bin b/files/poketool/trainer/trpoke/narc_0276.bin
deleted file mode 100644
index 4ad03280..00000000
--- a/files/poketool/trainer/trpoke/narc_0276.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0277.bin b/files/poketool/trainer/trpoke/narc_0277.bin
deleted file mode 100644
index ac372841..00000000
--- a/files/poketool/trainer/trpoke/narc_0277.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0278.bin b/files/poketool/trainer/trpoke/narc_0278.bin
deleted file mode 100644
index aff35644..00000000
--- a/files/poketool/trainer/trpoke/narc_0278.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0279.bin b/files/poketool/trainer/trpoke/narc_0279.bin
deleted file mode 100644
index 706bb066..00000000
--- a/files/poketool/trainer/trpoke/narc_0279.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0280.bin b/files/poketool/trainer/trpoke/narc_0280.bin
deleted file mode 100644
index 08077519..00000000
--- a/files/poketool/trainer/trpoke/narc_0280.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0281.bin b/files/poketool/trainer/trpoke/narc_0281.bin
deleted file mode 100644
index 4f742f74..00000000
--- a/files/poketool/trainer/trpoke/narc_0281.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0282.bin b/files/poketool/trainer/trpoke/narc_0282.bin
deleted file mode 100644
index 383bc05b..00000000
--- a/files/poketool/trainer/trpoke/narc_0282.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0283.bin b/files/poketool/trainer/trpoke/narc_0283.bin
deleted file mode 100644
index 0212f1fb..00000000
--- a/files/poketool/trainer/trpoke/narc_0283.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0284.bin b/files/poketool/trainer/trpoke/narc_0284.bin
deleted file mode 100644
index c087267c..00000000
--- a/files/poketool/trainer/trpoke/narc_0284.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0285.bin b/files/poketool/trainer/trpoke/narc_0285.bin
deleted file mode 100644
index 2a3a413e..00000000
--- a/files/poketool/trainer/trpoke/narc_0285.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0286.bin b/files/poketool/trainer/trpoke/narc_0286.bin
deleted file mode 100644
index 82b331f2..00000000
--- a/files/poketool/trainer/trpoke/narc_0286.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0287.bin b/files/poketool/trainer/trpoke/narc_0287.bin
deleted file mode 100644
index e831aefe..00000000
--- a/files/poketool/trainer/trpoke/narc_0287.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0288.bin b/files/poketool/trainer/trpoke/narc_0288.bin
deleted file mode 100644
index 70910a39..00000000
--- a/files/poketool/trainer/trpoke/narc_0288.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0289.bin b/files/poketool/trainer/trpoke/narc_0289.bin
deleted file mode 100644
index 6bb9f01b..00000000
--- a/files/poketool/trainer/trpoke/narc_0289.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0290.bin b/files/poketool/trainer/trpoke/narc_0290.bin
deleted file mode 100644
index df2847c6..00000000
--- a/files/poketool/trainer/trpoke/narc_0290.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0291.bin b/files/poketool/trainer/trpoke/narc_0291.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0291.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0292.bin b/files/poketool/trainer/trpoke/narc_0292.bin
deleted file mode 100644
index 8b3428b5..00000000
--- a/files/poketool/trainer/trpoke/narc_0292.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0293.bin b/files/poketool/trainer/trpoke/narc_0293.bin
deleted file mode 100644
index d42677ce..00000000
--- a/files/poketool/trainer/trpoke/narc_0293.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0294.bin b/files/poketool/trainer/trpoke/narc_0294.bin
deleted file mode 100644
index 86542ab8..00000000
--- a/files/poketool/trainer/trpoke/narc_0294.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0295.bin b/files/poketool/trainer/trpoke/narc_0295.bin
deleted file mode 100644
index a3eb4b31..00000000
--- a/files/poketool/trainer/trpoke/narc_0295.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0296.bin b/files/poketool/trainer/trpoke/narc_0296.bin
deleted file mode 100644
index 8bb1c558..00000000
--- a/files/poketool/trainer/trpoke/narc_0296.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0297.bin b/files/poketool/trainer/trpoke/narc_0297.bin
deleted file mode 100644
index 2e85e6f1..00000000
--- a/files/poketool/trainer/trpoke/narc_0297.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0298.bin b/files/poketool/trainer/trpoke/narc_0298.bin
deleted file mode 100644
index 424b9653..00000000
--- a/files/poketool/trainer/trpoke/narc_0298.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0299.bin b/files/poketool/trainer/trpoke/narc_0299.bin
deleted file mode 100644
index 7612c43b..00000000
--- a/files/poketool/trainer/trpoke/narc_0299.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0300.bin b/files/poketool/trainer/trpoke/narc_0300.bin
deleted file mode 100644
index d0a517d4..00000000
--- a/files/poketool/trainer/trpoke/narc_0300.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0301.bin b/files/poketool/trainer/trpoke/narc_0301.bin
deleted file mode 100644
index 3e42047a..00000000
--- a/files/poketool/trainer/trpoke/narc_0301.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0302.bin b/files/poketool/trainer/trpoke/narc_0302.bin
deleted file mode 100644
index 24ed3701..00000000
--- a/files/poketool/trainer/trpoke/narc_0302.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0303.bin b/files/poketool/trainer/trpoke/narc_0303.bin
deleted file mode 100644
index 18b9422d..00000000
--- a/files/poketool/trainer/trpoke/narc_0303.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0304.bin b/files/poketool/trainer/trpoke/narc_0304.bin
deleted file mode 100644
index 1f2fb3e4..00000000
--- a/files/poketool/trainer/trpoke/narc_0304.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0305.bin b/files/poketool/trainer/trpoke/narc_0305.bin
deleted file mode 100644
index f9ad5301..00000000
--- a/files/poketool/trainer/trpoke/narc_0305.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0306.bin b/files/poketool/trainer/trpoke/narc_0306.bin
deleted file mode 100644
index edec42fe..00000000
--- a/files/poketool/trainer/trpoke/narc_0306.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0307.bin b/files/poketool/trainer/trpoke/narc_0307.bin
deleted file mode 100644
index a95da80c..00000000
--- a/files/poketool/trainer/trpoke/narc_0307.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0308.bin b/files/poketool/trainer/trpoke/narc_0308.bin
deleted file mode 100644
index 32a37c9c..00000000
--- a/files/poketool/trainer/trpoke/narc_0308.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0309.bin b/files/poketool/trainer/trpoke/narc_0309.bin
deleted file mode 100644
index 24572e49..00000000
--- a/files/poketool/trainer/trpoke/narc_0309.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0310.bin b/files/poketool/trainer/trpoke/narc_0310.bin
deleted file mode 100644
index 570f8931..00000000
--- a/files/poketool/trainer/trpoke/narc_0310.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0311.bin b/files/poketool/trainer/trpoke/narc_0311.bin
deleted file mode 100644
index 747b51d1..00000000
--- a/files/poketool/trainer/trpoke/narc_0311.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0312.bin b/files/poketool/trainer/trpoke/narc_0312.bin
deleted file mode 100644
index 278ea689..00000000
--- a/files/poketool/trainer/trpoke/narc_0312.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0313.bin b/files/poketool/trainer/trpoke/narc_0313.bin
deleted file mode 100644
index 0ff790c7..00000000
--- a/files/poketool/trainer/trpoke/narc_0313.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0314.bin b/files/poketool/trainer/trpoke/narc_0314.bin
deleted file mode 100644
index 20233005..00000000
--- a/files/poketool/trainer/trpoke/narc_0314.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0315.bin b/files/poketool/trainer/trpoke/narc_0315.bin
deleted file mode 100644
index dd777cf7..00000000
--- a/files/poketool/trainer/trpoke/narc_0315.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0316.bin b/files/poketool/trainer/trpoke/narc_0316.bin
deleted file mode 100644
index bd6d222a..00000000
--- a/files/poketool/trainer/trpoke/narc_0316.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0317.bin b/files/poketool/trainer/trpoke/narc_0317.bin
deleted file mode 100644
index f53d26d9..00000000
--- a/files/poketool/trainer/trpoke/narc_0317.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0318.bin b/files/poketool/trainer/trpoke/narc_0318.bin
deleted file mode 100644
index 7a5a949a..00000000
--- a/files/poketool/trainer/trpoke/narc_0318.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0319.bin b/files/poketool/trainer/trpoke/narc_0319.bin
deleted file mode 100644
index 2334f3a7..00000000
--- a/files/poketool/trainer/trpoke/narc_0319.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0320.bin b/files/poketool/trainer/trpoke/narc_0320.bin
deleted file mode 100644
index d53d3d89..00000000
--- a/files/poketool/trainer/trpoke/narc_0320.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0321.bin b/files/poketool/trainer/trpoke/narc_0321.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0321.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0322.bin b/files/poketool/trainer/trpoke/narc_0322.bin
deleted file mode 100644
index 53b333dc..00000000
--- a/files/poketool/trainer/trpoke/narc_0322.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0323.bin b/files/poketool/trainer/trpoke/narc_0323.bin
deleted file mode 100644
index 1e494b79..00000000
--- a/files/poketool/trainer/trpoke/narc_0323.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0324.bin b/files/poketool/trainer/trpoke/narc_0324.bin
deleted file mode 100644
index ef8e41db..00000000
--- a/files/poketool/trainer/trpoke/narc_0324.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0325.bin b/files/poketool/trainer/trpoke/narc_0325.bin
deleted file mode 100644
index 4865b9b3..00000000
--- a/files/poketool/trainer/trpoke/narc_0325.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0326.bin b/files/poketool/trainer/trpoke/narc_0326.bin
deleted file mode 100644
index 63cb6122..00000000
--- a/files/poketool/trainer/trpoke/narc_0326.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0327.bin b/files/poketool/trainer/trpoke/narc_0327.bin
deleted file mode 100644
index 8c29b81a..00000000
--- a/files/poketool/trainer/trpoke/narc_0327.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0328.bin b/files/poketool/trainer/trpoke/narc_0328.bin
deleted file mode 100644
index d2a00314..00000000
--- a/files/poketool/trainer/trpoke/narc_0328.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0329.bin b/files/poketool/trainer/trpoke/narc_0329.bin
deleted file mode 100644
index d5fe9a68..00000000
--- a/files/poketool/trainer/trpoke/narc_0329.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0330.bin b/files/poketool/trainer/trpoke/narc_0330.bin
deleted file mode 100644
index d48beca1..00000000
--- a/files/poketool/trainer/trpoke/narc_0330.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0331.bin b/files/poketool/trainer/trpoke/narc_0331.bin
deleted file mode 100644
index c2ffb263..00000000
--- a/files/poketool/trainer/trpoke/narc_0331.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0332.bin b/files/poketool/trainer/trpoke/narc_0332.bin
deleted file mode 100644
index c9c11d34..00000000
--- a/files/poketool/trainer/trpoke/narc_0332.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0333.bin b/files/poketool/trainer/trpoke/narc_0333.bin
deleted file mode 100644
index 92c395c3..00000000
--- a/files/poketool/trainer/trpoke/narc_0333.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0334.bin b/files/poketool/trainer/trpoke/narc_0334.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0334.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0335.bin b/files/poketool/trainer/trpoke/narc_0335.bin
deleted file mode 100644
index 6e072826..00000000
--- a/files/poketool/trainer/trpoke/narc_0335.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0336.bin b/files/poketool/trainer/trpoke/narc_0336.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0336.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0337.bin b/files/poketool/trainer/trpoke/narc_0337.bin
deleted file mode 100644
index 883a7915..00000000
--- a/files/poketool/trainer/trpoke/narc_0337.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0338.bin b/files/poketool/trainer/trpoke/narc_0338.bin
deleted file mode 100644
index 9ad99c86..00000000
--- a/files/poketool/trainer/trpoke/narc_0338.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0339.bin b/files/poketool/trainer/trpoke/narc_0339.bin
deleted file mode 100644
index 75039461..00000000
--- a/files/poketool/trainer/trpoke/narc_0339.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0340.bin b/files/poketool/trainer/trpoke/narc_0340.bin
deleted file mode 100644
index 1f836178..00000000
--- a/files/poketool/trainer/trpoke/narc_0340.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0341.bin b/files/poketool/trainer/trpoke/narc_0341.bin
deleted file mode 100644
index a9574182..00000000
--- a/files/poketool/trainer/trpoke/narc_0341.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0342.bin b/files/poketool/trainer/trpoke/narc_0342.bin
deleted file mode 100644
index bd1a3a00..00000000
--- a/files/poketool/trainer/trpoke/narc_0342.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0343.bin b/files/poketool/trainer/trpoke/narc_0343.bin
deleted file mode 100644
index c23473be..00000000
--- a/files/poketool/trainer/trpoke/narc_0343.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0344.bin b/files/poketool/trainer/trpoke/narc_0344.bin
deleted file mode 100644
index 32ca4a11..00000000
--- a/files/poketool/trainer/trpoke/narc_0344.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0345.bin b/files/poketool/trainer/trpoke/narc_0345.bin
deleted file mode 100644
index bd1a3a00..00000000
--- a/files/poketool/trainer/trpoke/narc_0345.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0346.bin b/files/poketool/trainer/trpoke/narc_0346.bin
deleted file mode 100644
index 5dbb0048..00000000
--- a/files/poketool/trainer/trpoke/narc_0346.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0347.bin b/files/poketool/trainer/trpoke/narc_0347.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0347.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0348.bin b/files/poketool/trainer/trpoke/narc_0348.bin
deleted file mode 100644
index c62e48fe..00000000
--- a/files/poketool/trainer/trpoke/narc_0348.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0349.bin b/files/poketool/trainer/trpoke/narc_0349.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0349.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0350.bin b/files/poketool/trainer/trpoke/narc_0350.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0350.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0351.bin b/files/poketool/trainer/trpoke/narc_0351.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0351.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0352.bin b/files/poketool/trainer/trpoke/narc_0352.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0352.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0353.bin b/files/poketool/trainer/trpoke/narc_0353.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0353.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0354.bin b/files/poketool/trainer/trpoke/narc_0354.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0354.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0355.bin b/files/poketool/trainer/trpoke/narc_0355.bin
deleted file mode 100644
index da8d8587..00000000
--- a/files/poketool/trainer/trpoke/narc_0355.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0356.bin b/files/poketool/trainer/trpoke/narc_0356.bin
deleted file mode 100644
index 5e1b7612..00000000
--- a/files/poketool/trainer/trpoke/narc_0356.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0357.bin b/files/poketool/trainer/trpoke/narc_0357.bin
deleted file mode 100644
index 9046fc50..00000000
--- a/files/poketool/trainer/trpoke/narc_0357.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0358.bin b/files/poketool/trainer/trpoke/narc_0358.bin
deleted file mode 100644
index 0bba190b..00000000
--- a/files/poketool/trainer/trpoke/narc_0358.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0359.bin b/files/poketool/trainer/trpoke/narc_0359.bin
deleted file mode 100644
index e3bb3cdc..00000000
--- a/files/poketool/trainer/trpoke/narc_0359.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0360.bin b/files/poketool/trainer/trpoke/narc_0360.bin
deleted file mode 100644
index 04bd42b2..00000000
--- a/files/poketool/trainer/trpoke/narc_0360.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0361.bin b/files/poketool/trainer/trpoke/narc_0361.bin
deleted file mode 100644
index e3bb3cdc..00000000
--- a/files/poketool/trainer/trpoke/narc_0361.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0362.bin b/files/poketool/trainer/trpoke/narc_0362.bin
deleted file mode 100644
index fdbe922a..00000000
--- a/files/poketool/trainer/trpoke/narc_0362.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0363.bin b/files/poketool/trainer/trpoke/narc_0363.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0363.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0364.bin b/files/poketool/trainer/trpoke/narc_0364.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0364.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0365.bin b/files/poketool/trainer/trpoke/narc_0365.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0365.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0366.bin b/files/poketool/trainer/trpoke/narc_0366.bin
deleted file mode 100644
index 709741fb..00000000
--- a/files/poketool/trainer/trpoke/narc_0366.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0367.bin b/files/poketool/trainer/trpoke/narc_0367.bin
deleted file mode 100644
index 70f3bc41..00000000
--- a/files/poketool/trainer/trpoke/narc_0367.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0368.bin b/files/poketool/trainer/trpoke/narc_0368.bin
deleted file mode 100644
index fa76c897..00000000
--- a/files/poketool/trainer/trpoke/narc_0368.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0369.bin b/files/poketool/trainer/trpoke/narc_0369.bin
deleted file mode 100644
index 6278de98..00000000
--- a/files/poketool/trainer/trpoke/narc_0369.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0370.bin b/files/poketool/trainer/trpoke/narc_0370.bin
deleted file mode 100644
index 40761994..00000000
--- a/files/poketool/trainer/trpoke/narc_0370.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0371.bin b/files/poketool/trainer/trpoke/narc_0371.bin
deleted file mode 100644
index 0e165865..00000000
--- a/files/poketool/trainer/trpoke/narc_0371.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0372.bin b/files/poketool/trainer/trpoke/narc_0372.bin
deleted file mode 100644
index a54fb52a..00000000
--- a/files/poketool/trainer/trpoke/narc_0372.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0373.bin b/files/poketool/trainer/trpoke/narc_0373.bin
deleted file mode 100644
index 14d8f1b4..00000000
--- a/files/poketool/trainer/trpoke/narc_0373.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0374.bin b/files/poketool/trainer/trpoke/narc_0374.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0374.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0375.bin b/files/poketool/trainer/trpoke/narc_0375.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0375.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0376.bin b/files/poketool/trainer/trpoke/narc_0376.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0376.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0377.bin b/files/poketool/trainer/trpoke/narc_0377.bin
deleted file mode 100644
index 50c40993..00000000
--- a/files/poketool/trainer/trpoke/narc_0377.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0378.bin b/files/poketool/trainer/trpoke/narc_0378.bin
deleted file mode 100644
index 0502e968..00000000
--- a/files/poketool/trainer/trpoke/narc_0378.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0379.bin b/files/poketool/trainer/trpoke/narc_0379.bin
deleted file mode 100644
index 7593e320..00000000
--- a/files/poketool/trainer/trpoke/narc_0379.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0380.bin b/files/poketool/trainer/trpoke/narc_0380.bin
deleted file mode 100644
index a4846fd1..00000000
--- a/files/poketool/trainer/trpoke/narc_0380.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0381.bin b/files/poketool/trainer/trpoke/narc_0381.bin
deleted file mode 100644
index bd82de5a..00000000
--- a/files/poketool/trainer/trpoke/narc_0381.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0382.bin b/files/poketool/trainer/trpoke/narc_0382.bin
deleted file mode 100644
index 92498594..00000000
--- a/files/poketool/trainer/trpoke/narc_0382.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0383.bin b/files/poketool/trainer/trpoke/narc_0383.bin
deleted file mode 100644
index 51004f3d..00000000
--- a/files/poketool/trainer/trpoke/narc_0383.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0384.bin b/files/poketool/trainer/trpoke/narc_0384.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0384.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0385.bin b/files/poketool/trainer/trpoke/narc_0385.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0385.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0386.bin b/files/poketool/trainer/trpoke/narc_0386.bin
deleted file mode 100644
index 720427a7..00000000
--- a/files/poketool/trainer/trpoke/narc_0386.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0387.bin b/files/poketool/trainer/trpoke/narc_0387.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0387.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0388.bin b/files/poketool/trainer/trpoke/narc_0388.bin
deleted file mode 100644
index 78fb8797..00000000
--- a/files/poketool/trainer/trpoke/narc_0388.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0389.bin b/files/poketool/trainer/trpoke/narc_0389.bin
deleted file mode 100644
index be4aed5d..00000000
--- a/files/poketool/trainer/trpoke/narc_0389.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0390.bin b/files/poketool/trainer/trpoke/narc_0390.bin
deleted file mode 100644
index 6ae8b4fb..00000000
--- a/files/poketool/trainer/trpoke/narc_0390.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0391.bin b/files/poketool/trainer/trpoke/narc_0391.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0391.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0392.bin b/files/poketool/trainer/trpoke/narc_0392.bin
deleted file mode 100644
index ea1586fe..00000000
--- a/files/poketool/trainer/trpoke/narc_0392.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0393.bin b/files/poketool/trainer/trpoke/narc_0393.bin
deleted file mode 100644
index 859c2230..00000000
--- a/files/poketool/trainer/trpoke/narc_0393.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0394.bin b/files/poketool/trainer/trpoke/narc_0394.bin
deleted file mode 100644
index c93f70b3..00000000
--- a/files/poketool/trainer/trpoke/narc_0394.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0395.bin b/files/poketool/trainer/trpoke/narc_0395.bin
deleted file mode 100644
index 3b0f3f74..00000000
--- a/files/poketool/trainer/trpoke/narc_0395.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0396.bin b/files/poketool/trainer/trpoke/narc_0396.bin
deleted file mode 100644
index 052be167..00000000
--- a/files/poketool/trainer/trpoke/narc_0396.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0397.bin b/files/poketool/trainer/trpoke/narc_0397.bin
deleted file mode 100644
index b7254a78..00000000
--- a/files/poketool/trainer/trpoke/narc_0397.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0398.bin b/files/poketool/trainer/trpoke/narc_0398.bin
deleted file mode 100644
index fdff36b1..00000000
--- a/files/poketool/trainer/trpoke/narc_0398.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0399.bin b/files/poketool/trainer/trpoke/narc_0399.bin
deleted file mode 100644
index 97b070f8..00000000
--- a/files/poketool/trainer/trpoke/narc_0399.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0400.bin b/files/poketool/trainer/trpoke/narc_0400.bin
deleted file mode 100644
index 68cf3512..00000000
--- a/files/poketool/trainer/trpoke/narc_0400.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0401.bin b/files/poketool/trainer/trpoke/narc_0401.bin
deleted file mode 100644
index 46f2ae05..00000000
--- a/files/poketool/trainer/trpoke/narc_0401.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0402.bin b/files/poketool/trainer/trpoke/narc_0402.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0402.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0403.bin b/files/poketool/trainer/trpoke/narc_0403.bin
deleted file mode 100644
index 1b8cfbdc..00000000
--- a/files/poketool/trainer/trpoke/narc_0403.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0404.bin b/files/poketool/trainer/trpoke/narc_0404.bin
deleted file mode 100644
index 8280fe4f..00000000
--- a/files/poketool/trainer/trpoke/narc_0404.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0405.bin b/files/poketool/trainer/trpoke/narc_0405.bin
deleted file mode 100644
index 3521ce95..00000000
--- a/files/poketool/trainer/trpoke/narc_0405.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0406.bin b/files/poketool/trainer/trpoke/narc_0406.bin
deleted file mode 100644
index 58c1c9f1..00000000
--- a/files/poketool/trainer/trpoke/narc_0406.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0407.bin b/files/poketool/trainer/trpoke/narc_0407.bin
deleted file mode 100644
index 514457f9..00000000
--- a/files/poketool/trainer/trpoke/narc_0407.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0408.bin b/files/poketool/trainer/trpoke/narc_0408.bin
deleted file mode 100644
index bd62c6b0..00000000
--- a/files/poketool/trainer/trpoke/narc_0408.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0409.bin b/files/poketool/trainer/trpoke/narc_0409.bin
deleted file mode 100644
index 012123b6..00000000
--- a/files/poketool/trainer/trpoke/narc_0409.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0410.bin b/files/poketool/trainer/trpoke/narc_0410.bin
deleted file mode 100644
index 48d04a4f..00000000
--- a/files/poketool/trainer/trpoke/narc_0410.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0411.bin b/files/poketool/trainer/trpoke/narc_0411.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0411.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0412.bin b/files/poketool/trainer/trpoke/narc_0412.bin
deleted file mode 100644
index b4355b75..00000000
--- a/files/poketool/trainer/trpoke/narc_0412.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0413.bin b/files/poketool/trainer/trpoke/narc_0413.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0413.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0414.bin b/files/poketool/trainer/trpoke/narc_0414.bin
deleted file mode 100644
index 611933c2..00000000
--- a/files/poketool/trainer/trpoke/narc_0414.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0415.bin b/files/poketool/trainer/trpoke/narc_0415.bin
deleted file mode 100644
index 5eb3e193..00000000
--- a/files/poketool/trainer/trpoke/narc_0415.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0416.bin b/files/poketool/trainer/trpoke/narc_0416.bin
deleted file mode 100644
index 3b29de3b..00000000
--- a/files/poketool/trainer/trpoke/narc_0416.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0417.bin b/files/poketool/trainer/trpoke/narc_0417.bin
deleted file mode 100644
index 72406ca8..00000000
--- a/files/poketool/trainer/trpoke/narc_0417.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0418.bin b/files/poketool/trainer/trpoke/narc_0418.bin
deleted file mode 100644
index ce4329d6..00000000
--- a/files/poketool/trainer/trpoke/narc_0418.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0419.bin b/files/poketool/trainer/trpoke/narc_0419.bin
deleted file mode 100644
index 6c2a74a3..00000000
--- a/files/poketool/trainer/trpoke/narc_0419.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0420.bin b/files/poketool/trainer/trpoke/narc_0420.bin
deleted file mode 100644
index 11b69564..00000000
--- a/files/poketool/trainer/trpoke/narc_0420.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0421.bin b/files/poketool/trainer/trpoke/narc_0421.bin
deleted file mode 100644
index 4d14643f..00000000
--- a/files/poketool/trainer/trpoke/narc_0421.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0422.bin b/files/poketool/trainer/trpoke/narc_0422.bin
deleted file mode 100644
index 506871a9..00000000
--- a/files/poketool/trainer/trpoke/narc_0422.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0423.bin b/files/poketool/trainer/trpoke/narc_0423.bin
deleted file mode 100644
index 980194e0..00000000
--- a/files/poketool/trainer/trpoke/narc_0423.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0424.bin b/files/poketool/trainer/trpoke/narc_0424.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0424.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0425.bin b/files/poketool/trainer/trpoke/narc_0425.bin
deleted file mode 100644
index 2e378b28..00000000
--- a/files/poketool/trainer/trpoke/narc_0425.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0426.bin b/files/poketool/trainer/trpoke/narc_0426.bin
deleted file mode 100644
index 4ea0add4..00000000
--- a/files/poketool/trainer/trpoke/narc_0426.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0427.bin b/files/poketool/trainer/trpoke/narc_0427.bin
deleted file mode 100644
index 9d322bc8..00000000
--- a/files/poketool/trainer/trpoke/narc_0427.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0428.bin b/files/poketool/trainer/trpoke/narc_0428.bin
deleted file mode 100644
index f602934d..00000000
--- a/files/poketool/trainer/trpoke/narc_0428.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0429.bin b/files/poketool/trainer/trpoke/narc_0429.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0429.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0430.bin b/files/poketool/trainer/trpoke/narc_0430.bin
deleted file mode 100644
index dcf5f2a7..00000000
--- a/files/poketool/trainer/trpoke/narc_0430.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0431.bin b/files/poketool/trainer/trpoke/narc_0431.bin
deleted file mode 100644
index 79f6d603..00000000
--- a/files/poketool/trainer/trpoke/narc_0431.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0432.bin b/files/poketool/trainer/trpoke/narc_0432.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0432.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0433.bin b/files/poketool/trainer/trpoke/narc_0433.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0433.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0434.bin b/files/poketool/trainer/trpoke/narc_0434.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0434.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0435.bin b/files/poketool/trainer/trpoke/narc_0435.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0435.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0436.bin b/files/poketool/trainer/trpoke/narc_0436.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0436.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0437.bin b/files/poketool/trainer/trpoke/narc_0437.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0437.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0438.bin b/files/poketool/trainer/trpoke/narc_0438.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0438.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0439.bin b/files/poketool/trainer/trpoke/narc_0439.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0439.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0440.bin b/files/poketool/trainer/trpoke/narc_0440.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0440.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0441.bin b/files/poketool/trainer/trpoke/narc_0441.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0441.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0442.bin b/files/poketool/trainer/trpoke/narc_0442.bin
deleted file mode 100644
index 855b609e..00000000
--- a/files/poketool/trainer/trpoke/narc_0442.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0443.bin b/files/poketool/trainer/trpoke/narc_0443.bin
deleted file mode 100644
index 802bf124..00000000
--- a/files/poketool/trainer/trpoke/narc_0443.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0444.bin b/files/poketool/trainer/trpoke/narc_0444.bin
deleted file mode 100644
index d5218b5c..00000000
--- a/files/poketool/trainer/trpoke/narc_0444.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0445.bin b/files/poketool/trainer/trpoke/narc_0445.bin
deleted file mode 100644
index 68bbcb0b..00000000
--- a/files/poketool/trainer/trpoke/narc_0445.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0446.bin b/files/poketool/trainer/trpoke/narc_0446.bin
deleted file mode 100644
index 7701c9b1..00000000
--- a/files/poketool/trainer/trpoke/narc_0446.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0447.bin b/files/poketool/trainer/trpoke/narc_0447.bin
deleted file mode 100644
index 5f8f8dce..00000000
--- a/files/poketool/trainer/trpoke/narc_0447.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0448.bin b/files/poketool/trainer/trpoke/narc_0448.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0448.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0449.bin b/files/poketool/trainer/trpoke/narc_0449.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0449.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0450.bin b/files/poketool/trainer/trpoke/narc_0450.bin
deleted file mode 100644
index 134dec23..00000000
--- a/files/poketool/trainer/trpoke/narc_0450.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0451.bin b/files/poketool/trainer/trpoke/narc_0451.bin
deleted file mode 100644
index fd9ce376..00000000
--- a/files/poketool/trainer/trpoke/narc_0451.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0452.bin b/files/poketool/trainer/trpoke/narc_0452.bin
deleted file mode 100644
index 3d2bd7da..00000000
--- a/files/poketool/trainer/trpoke/narc_0452.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0453.bin b/files/poketool/trainer/trpoke/narc_0453.bin
deleted file mode 100644
index a4661347..00000000
--- a/files/poketool/trainer/trpoke/narc_0453.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0454.bin b/files/poketool/trainer/trpoke/narc_0454.bin
deleted file mode 100644
index d1f81d45..00000000
--- a/files/poketool/trainer/trpoke/narc_0454.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0455.bin b/files/poketool/trainer/trpoke/narc_0455.bin
deleted file mode 100644
index c0c485ab..00000000
--- a/files/poketool/trainer/trpoke/narc_0455.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0456.bin b/files/poketool/trainer/trpoke/narc_0456.bin
deleted file mode 100644
index af5dc133..00000000
--- a/files/poketool/trainer/trpoke/narc_0456.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0457.bin b/files/poketool/trainer/trpoke/narc_0457.bin
deleted file mode 100644
index b6bf5440..00000000
--- a/files/poketool/trainer/trpoke/narc_0457.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0458.bin b/files/poketool/trainer/trpoke/narc_0458.bin
deleted file mode 100644
index ac9bdda6..00000000
--- a/files/poketool/trainer/trpoke/narc_0458.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0459.bin b/files/poketool/trainer/trpoke/narc_0459.bin
deleted file mode 100644
index e9593343..00000000
--- a/files/poketool/trainer/trpoke/narc_0459.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0460.bin b/files/poketool/trainer/trpoke/narc_0460.bin
deleted file mode 100644
index 0cacb61d..00000000
--- a/files/poketool/trainer/trpoke/narc_0460.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0461.bin b/files/poketool/trainer/trpoke/narc_0461.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0461.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0462.bin b/files/poketool/trainer/trpoke/narc_0462.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0462.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0463.bin b/files/poketool/trainer/trpoke/narc_0463.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0463.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0464.bin b/files/poketool/trainer/trpoke/narc_0464.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0464.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0465.bin b/files/poketool/trainer/trpoke/narc_0465.bin
deleted file mode 100644
index 39f13891..00000000
--- a/files/poketool/trainer/trpoke/narc_0465.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0466.bin b/files/poketool/trainer/trpoke/narc_0466.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0466.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0467.bin b/files/poketool/trainer/trpoke/narc_0467.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0467.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0468.bin b/files/poketool/trainer/trpoke/narc_0468.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0468.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0469.bin b/files/poketool/trainer/trpoke/narc_0469.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0469.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0470.bin b/files/poketool/trainer/trpoke/narc_0470.bin
deleted file mode 100644
index 44bdcbd6..00000000
--- a/files/poketool/trainer/trpoke/narc_0470.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0471.bin b/files/poketool/trainer/trpoke/narc_0471.bin
deleted file mode 100644
index 960fb43d..00000000
--- a/files/poketool/trainer/trpoke/narc_0471.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0472.bin b/files/poketool/trainer/trpoke/narc_0472.bin
deleted file mode 100644
index 36a65e6d..00000000
--- a/files/poketool/trainer/trpoke/narc_0472.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0473.bin b/files/poketool/trainer/trpoke/narc_0473.bin
deleted file mode 100644
index 16587a11..00000000
--- a/files/poketool/trainer/trpoke/narc_0473.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0474.bin b/files/poketool/trainer/trpoke/narc_0474.bin
deleted file mode 100644
index 74e3fdd6..00000000
--- a/files/poketool/trainer/trpoke/narc_0474.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0475.bin b/files/poketool/trainer/trpoke/narc_0475.bin
deleted file mode 100644
index 4ca3047d..00000000
--- a/files/poketool/trainer/trpoke/narc_0475.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0476.bin b/files/poketool/trainer/trpoke/narc_0476.bin
deleted file mode 100644
index 09675a7b..00000000
--- a/files/poketool/trainer/trpoke/narc_0476.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0477.bin b/files/poketool/trainer/trpoke/narc_0477.bin
deleted file mode 100644
index 28e1bc01..00000000
--- a/files/poketool/trainer/trpoke/narc_0477.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0478.bin b/files/poketool/trainer/trpoke/narc_0478.bin
deleted file mode 100644
index 467d03b3..00000000
--- a/files/poketool/trainer/trpoke/narc_0478.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0479.bin b/files/poketool/trainer/trpoke/narc_0479.bin
deleted file mode 100644
index bf00933f..00000000
--- a/files/poketool/trainer/trpoke/narc_0479.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0480.bin b/files/poketool/trainer/trpoke/narc_0480.bin
deleted file mode 100644
index bd3a169a..00000000
--- a/files/poketool/trainer/trpoke/narc_0480.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0481.bin b/files/poketool/trainer/trpoke/narc_0481.bin
deleted file mode 100644
index 9eca7919..00000000
--- a/files/poketool/trainer/trpoke/narc_0481.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0482.bin b/files/poketool/trainer/trpoke/narc_0482.bin
deleted file mode 100644
index c9503907..00000000
--- a/files/poketool/trainer/trpoke/narc_0482.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0483.bin b/files/poketool/trainer/trpoke/narc_0483.bin
deleted file mode 100644
index 0aaa21eb..00000000
--- a/files/poketool/trainer/trpoke/narc_0483.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0484.bin b/files/poketool/trainer/trpoke/narc_0484.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0484.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0485.bin b/files/poketool/trainer/trpoke/narc_0485.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0485.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0486.bin b/files/poketool/trainer/trpoke/narc_0486.bin
deleted file mode 100644
index 4c1caf40..00000000
--- a/files/poketool/trainer/trpoke/narc_0486.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0487.bin b/files/poketool/trainer/trpoke/narc_0487.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0487.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0488.bin b/files/poketool/trainer/trpoke/narc_0488.bin
deleted file mode 100644
index a4713982..00000000
--- a/files/poketool/trainer/trpoke/narc_0488.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0489.bin b/files/poketool/trainer/trpoke/narc_0489.bin
deleted file mode 100644
index 78ebe7c0..00000000
--- a/files/poketool/trainer/trpoke/narc_0489.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0490.bin b/files/poketool/trainer/trpoke/narc_0490.bin
deleted file mode 100644
index 76ab47cc..00000000
--- a/files/poketool/trainer/trpoke/narc_0490.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0491.bin b/files/poketool/trainer/trpoke/narc_0491.bin
deleted file mode 100644
index 93ef49ce..00000000
--- a/files/poketool/trainer/trpoke/narc_0491.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0492.bin b/files/poketool/trainer/trpoke/narc_0492.bin
deleted file mode 100644
index f2118689..00000000
--- a/files/poketool/trainer/trpoke/narc_0492.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0493.bin b/files/poketool/trainer/trpoke/narc_0493.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0493.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0494.bin b/files/poketool/trainer/trpoke/narc_0494.bin
deleted file mode 100644
index 92bdd753..00000000
--- a/files/poketool/trainer/trpoke/narc_0494.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0495.bin b/files/poketool/trainer/trpoke/narc_0495.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0495.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0496.bin b/files/poketool/trainer/trpoke/narc_0496.bin
deleted file mode 100644
index 945f637b..00000000
--- a/files/poketool/trainer/trpoke/narc_0496.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0497.bin b/files/poketool/trainer/trpoke/narc_0497.bin
deleted file mode 100644
index 90aaebd9..00000000
--- a/files/poketool/trainer/trpoke/narc_0497.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0498.bin b/files/poketool/trainer/trpoke/narc_0498.bin
deleted file mode 100644
index 47a8cb31..00000000
--- a/files/poketool/trainer/trpoke/narc_0498.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0499.bin b/files/poketool/trainer/trpoke/narc_0499.bin
deleted file mode 100644
index 4d7b647f..00000000
--- a/files/poketool/trainer/trpoke/narc_0499.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0500.bin b/files/poketool/trainer/trpoke/narc_0500.bin
deleted file mode 100644
index da30a037..00000000
--- a/files/poketool/trainer/trpoke/narc_0500.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0501.bin b/files/poketool/trainer/trpoke/narc_0501.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0501.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0502.bin b/files/poketool/trainer/trpoke/narc_0502.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0502.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0503.bin b/files/poketool/trainer/trpoke/narc_0503.bin
deleted file mode 100644
index 1c941898..00000000
--- a/files/poketool/trainer/trpoke/narc_0503.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0504.bin b/files/poketool/trainer/trpoke/narc_0504.bin
deleted file mode 100644
index 92acb8d5..00000000
--- a/files/poketool/trainer/trpoke/narc_0504.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0505.bin b/files/poketool/trainer/trpoke/narc_0505.bin
deleted file mode 100644
index 621ae8b3..00000000
--- a/files/poketool/trainer/trpoke/narc_0505.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0506.bin b/files/poketool/trainer/trpoke/narc_0506.bin
deleted file mode 100644
index 84f2c9ac..00000000
--- a/files/poketool/trainer/trpoke/narc_0506.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0507.bin b/files/poketool/trainer/trpoke/narc_0507.bin
deleted file mode 100644
index 1260c564..00000000
--- a/files/poketool/trainer/trpoke/narc_0507.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0508.bin b/files/poketool/trainer/trpoke/narc_0508.bin
deleted file mode 100644
index f2148013..00000000
--- a/files/poketool/trainer/trpoke/narc_0508.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0509.bin b/files/poketool/trainer/trpoke/narc_0509.bin
deleted file mode 100644
index 7482b5e2..00000000
--- a/files/poketool/trainer/trpoke/narc_0509.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0510.bin b/files/poketool/trainer/trpoke/narc_0510.bin
deleted file mode 100644
index 8af3d6e8..00000000
--- a/files/poketool/trainer/trpoke/narc_0510.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0511.bin b/files/poketool/trainer/trpoke/narc_0511.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0511.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0512.bin b/files/poketool/trainer/trpoke/narc_0512.bin
deleted file mode 100644
index 224c13bb..00000000
--- a/files/poketool/trainer/trpoke/narc_0512.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0513.bin b/files/poketool/trainer/trpoke/narc_0513.bin
deleted file mode 100644
index e1c24d0e..00000000
--- a/files/poketool/trainer/trpoke/narc_0513.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0514.bin b/files/poketool/trainer/trpoke/narc_0514.bin
deleted file mode 100644
index d171d8bb..00000000
--- a/files/poketool/trainer/trpoke/narc_0514.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0515.bin b/files/poketool/trainer/trpoke/narc_0515.bin
deleted file mode 100644
index 11f3dd27..00000000
--- a/files/poketool/trainer/trpoke/narc_0515.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0516.bin b/files/poketool/trainer/trpoke/narc_0516.bin
deleted file mode 100644
index 02269a8c..00000000
--- a/files/poketool/trainer/trpoke/narc_0516.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0517.bin b/files/poketool/trainer/trpoke/narc_0517.bin
deleted file mode 100644
index 156b4d0d..00000000
--- a/files/poketool/trainer/trpoke/narc_0517.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0518.bin b/files/poketool/trainer/trpoke/narc_0518.bin
deleted file mode 100644
index 18c970b9..00000000
--- a/files/poketool/trainer/trpoke/narc_0518.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0519.bin b/files/poketool/trainer/trpoke/narc_0519.bin
deleted file mode 100644
index cf384c83..00000000
--- a/files/poketool/trainer/trpoke/narc_0519.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0520.bin b/files/poketool/trainer/trpoke/narc_0520.bin
deleted file mode 100644
index c2020c08..00000000
--- a/files/poketool/trainer/trpoke/narc_0520.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0521.bin b/files/poketool/trainer/trpoke/narc_0521.bin
deleted file mode 100644
index 2112a712..00000000
--- a/files/poketool/trainer/trpoke/narc_0521.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0522.bin b/files/poketool/trainer/trpoke/narc_0522.bin
deleted file mode 100644
index b56d314b..00000000
--- a/files/poketool/trainer/trpoke/narc_0522.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0523.bin b/files/poketool/trainer/trpoke/narc_0523.bin
deleted file mode 100644
index 503d5943..00000000
--- a/files/poketool/trainer/trpoke/narc_0523.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0524.bin b/files/poketool/trainer/trpoke/narc_0524.bin
deleted file mode 100644
index 12c96fd4..00000000
--- a/files/poketool/trainer/trpoke/narc_0524.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0525.bin b/files/poketool/trainer/trpoke/narc_0525.bin
deleted file mode 100644
index fe70c959..00000000
--- a/files/poketool/trainer/trpoke/narc_0525.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0526.bin b/files/poketool/trainer/trpoke/narc_0526.bin
deleted file mode 100644
index 1bb0ee60..00000000
--- a/files/poketool/trainer/trpoke/narc_0526.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0527.bin b/files/poketool/trainer/trpoke/narc_0527.bin
deleted file mode 100644
index a6dcdedb..00000000
--- a/files/poketool/trainer/trpoke/narc_0527.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0528.bin b/files/poketool/trainer/trpoke/narc_0528.bin
deleted file mode 100644
index cc5ef778..00000000
--- a/files/poketool/trainer/trpoke/narc_0528.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0529.bin b/files/poketool/trainer/trpoke/narc_0529.bin
deleted file mode 100644
index 8dff3fbf..00000000
--- a/files/poketool/trainer/trpoke/narc_0529.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0530.bin b/files/poketool/trainer/trpoke/narc_0530.bin
deleted file mode 100644
index 8c67516b..00000000
--- a/files/poketool/trainer/trpoke/narc_0530.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0531.bin b/files/poketool/trainer/trpoke/narc_0531.bin
deleted file mode 100644
index 6388a6f5..00000000
--- a/files/poketool/trainer/trpoke/narc_0531.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0532.bin b/files/poketool/trainer/trpoke/narc_0532.bin
deleted file mode 100644
index 16cfa607..00000000
--- a/files/poketool/trainer/trpoke/narc_0532.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0533.bin b/files/poketool/trainer/trpoke/narc_0533.bin
deleted file mode 100644
index bed372d5..00000000
--- a/files/poketool/trainer/trpoke/narc_0533.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0534.bin b/files/poketool/trainer/trpoke/narc_0534.bin
deleted file mode 100644
index 3567a45f..00000000
--- a/files/poketool/trainer/trpoke/narc_0534.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0535.bin b/files/poketool/trainer/trpoke/narc_0535.bin
deleted file mode 100644
index 9057c00a..00000000
--- a/files/poketool/trainer/trpoke/narc_0535.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0536.bin b/files/poketool/trainer/trpoke/narc_0536.bin
deleted file mode 100644
index 8dd7bc96..00000000
--- a/files/poketool/trainer/trpoke/narc_0536.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0537.bin b/files/poketool/trainer/trpoke/narc_0537.bin
deleted file mode 100644
index 353e589e..00000000
--- a/files/poketool/trainer/trpoke/narc_0537.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0538.bin b/files/poketool/trainer/trpoke/narc_0538.bin
deleted file mode 100644
index 6de3f8ca..00000000
--- a/files/poketool/trainer/trpoke/narc_0538.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0539.bin b/files/poketool/trainer/trpoke/narc_0539.bin
deleted file mode 100644
index 6f21ee7b..00000000
--- a/files/poketool/trainer/trpoke/narc_0539.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0540.bin b/files/poketool/trainer/trpoke/narc_0540.bin
deleted file mode 100644
index 3345b318..00000000
--- a/files/poketool/trainer/trpoke/narc_0540.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0541.bin b/files/poketool/trainer/trpoke/narc_0541.bin
deleted file mode 100644
index 0f7eceb7..00000000
--- a/files/poketool/trainer/trpoke/narc_0541.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0542.bin b/files/poketool/trainer/trpoke/narc_0542.bin
deleted file mode 100644
index 1234d75f..00000000
--- a/files/poketool/trainer/trpoke/narc_0542.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0543.bin b/files/poketool/trainer/trpoke/narc_0543.bin
deleted file mode 100644
index 87577a77..00000000
--- a/files/poketool/trainer/trpoke/narc_0543.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0544.bin b/files/poketool/trainer/trpoke/narc_0544.bin
deleted file mode 100644
index c3f25db1..00000000
--- a/files/poketool/trainer/trpoke/narc_0544.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0545.bin b/files/poketool/trainer/trpoke/narc_0545.bin
deleted file mode 100644
index 4c188c1b..00000000
--- a/files/poketool/trainer/trpoke/narc_0545.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0546.bin b/files/poketool/trainer/trpoke/narc_0546.bin
deleted file mode 100644
index 614083b5..00000000
--- a/files/poketool/trainer/trpoke/narc_0546.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0547.bin b/files/poketool/trainer/trpoke/narc_0547.bin
deleted file mode 100644
index f359beb4..00000000
--- a/files/poketool/trainer/trpoke/narc_0547.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0548.bin b/files/poketool/trainer/trpoke/narc_0548.bin
deleted file mode 100644
index 5eec2139..00000000
--- a/files/poketool/trainer/trpoke/narc_0548.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0549.bin b/files/poketool/trainer/trpoke/narc_0549.bin
deleted file mode 100644
index f98aaf3a..00000000
--- a/files/poketool/trainer/trpoke/narc_0549.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0550.bin b/files/poketool/trainer/trpoke/narc_0550.bin
deleted file mode 100644
index dd1ca4e0..00000000
--- a/files/poketool/trainer/trpoke/narc_0550.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0551.bin b/files/poketool/trainer/trpoke/narc_0551.bin
deleted file mode 100644
index c6613f1d..00000000
--- a/files/poketool/trainer/trpoke/narc_0551.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0552.bin b/files/poketool/trainer/trpoke/narc_0552.bin
deleted file mode 100644
index faeb3988..00000000
--- a/files/poketool/trainer/trpoke/narc_0552.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0553.bin b/files/poketool/trainer/trpoke/narc_0553.bin
deleted file mode 100644
index efc8d073..00000000
--- a/files/poketool/trainer/trpoke/narc_0553.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0554.bin b/files/poketool/trainer/trpoke/narc_0554.bin
deleted file mode 100644
index 7d4c10e8..00000000
--- a/files/poketool/trainer/trpoke/narc_0554.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0555.bin b/files/poketool/trainer/trpoke/narc_0555.bin
deleted file mode 100644
index 786a5c6e..00000000
--- a/files/poketool/trainer/trpoke/narc_0555.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0556.bin b/files/poketool/trainer/trpoke/narc_0556.bin
deleted file mode 100644
index 4aba3d76..00000000
--- a/files/poketool/trainer/trpoke/narc_0556.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0557.bin b/files/poketool/trainer/trpoke/narc_0557.bin
deleted file mode 100644
index 8e83ab09..00000000
--- a/files/poketool/trainer/trpoke/narc_0557.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0558.bin b/files/poketool/trainer/trpoke/narc_0558.bin
deleted file mode 100644
index 6b47098d..00000000
--- a/files/poketool/trainer/trpoke/narc_0558.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0559.bin b/files/poketool/trainer/trpoke/narc_0559.bin
deleted file mode 100644
index a2b20fa1..00000000
--- a/files/poketool/trainer/trpoke/narc_0559.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0560.bin b/files/poketool/trainer/trpoke/narc_0560.bin
deleted file mode 100644
index 5e43350c..00000000
--- a/files/poketool/trainer/trpoke/narc_0560.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0561.bin b/files/poketool/trainer/trpoke/narc_0561.bin
deleted file mode 100644
index f38b05d9..00000000
--- a/files/poketool/trainer/trpoke/narc_0561.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0562.bin b/files/poketool/trainer/trpoke/narc_0562.bin
deleted file mode 100644
index 8e4b8cc8..00000000
--- a/files/poketool/trainer/trpoke/narc_0562.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0563.bin b/files/poketool/trainer/trpoke/narc_0563.bin
deleted file mode 100644
index e1d99c3a..00000000
--- a/files/poketool/trainer/trpoke/narc_0563.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0564.bin b/files/poketool/trainer/trpoke/narc_0564.bin
deleted file mode 100644
index ea2477a9..00000000
--- a/files/poketool/trainer/trpoke/narc_0564.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0565.bin b/files/poketool/trainer/trpoke/narc_0565.bin
deleted file mode 100644
index 18d46720..00000000
--- a/files/poketool/trainer/trpoke/narc_0565.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0566.bin b/files/poketool/trainer/trpoke/narc_0566.bin
deleted file mode 100644
index 55a3aac0..00000000
--- a/files/poketool/trainer/trpoke/narc_0566.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0567.bin b/files/poketool/trainer/trpoke/narc_0567.bin
deleted file mode 100644
index c5b0cb43..00000000
--- a/files/poketool/trainer/trpoke/narc_0567.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0568.bin b/files/poketool/trainer/trpoke/narc_0568.bin
deleted file mode 100644
index 680f98ae..00000000
--- a/files/poketool/trainer/trpoke/narc_0568.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0569.bin b/files/poketool/trainer/trpoke/narc_0569.bin
deleted file mode 100644
index fbd94893..00000000
--- a/files/poketool/trainer/trpoke/narc_0569.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0570.bin b/files/poketool/trainer/trpoke/narc_0570.bin
deleted file mode 100644
index e087a3c9..00000000
--- a/files/poketool/trainer/trpoke/narc_0570.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0571.bin b/files/poketool/trainer/trpoke/narc_0571.bin
deleted file mode 100644
index 6ef12e09..00000000
--- a/files/poketool/trainer/trpoke/narc_0571.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0572.bin b/files/poketool/trainer/trpoke/narc_0572.bin
deleted file mode 100644
index f49a38e0..00000000
--- a/files/poketool/trainer/trpoke/narc_0572.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0573.bin b/files/poketool/trainer/trpoke/narc_0573.bin
deleted file mode 100644
index 6d0415c0..00000000
--- a/files/poketool/trainer/trpoke/narc_0573.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0574.bin b/files/poketool/trainer/trpoke/narc_0574.bin
deleted file mode 100644
index 421f0f02..00000000
--- a/files/poketool/trainer/trpoke/narc_0574.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0575.bin b/files/poketool/trainer/trpoke/narc_0575.bin
deleted file mode 100644
index ece394a0..00000000
--- a/files/poketool/trainer/trpoke/narc_0575.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0576.bin b/files/poketool/trainer/trpoke/narc_0576.bin
deleted file mode 100644
index d6b98c2a..00000000
--- a/files/poketool/trainer/trpoke/narc_0576.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0577.bin b/files/poketool/trainer/trpoke/narc_0577.bin
deleted file mode 100644
index 0afe6f5c..00000000
--- a/files/poketool/trainer/trpoke/narc_0577.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0578.bin b/files/poketool/trainer/trpoke/narc_0578.bin
deleted file mode 100644
index 615b6ca6..00000000
--- a/files/poketool/trainer/trpoke/narc_0578.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0579.bin b/files/poketool/trainer/trpoke/narc_0579.bin
deleted file mode 100644
index d4fabe74..00000000
--- a/files/poketool/trainer/trpoke/narc_0579.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0580.bin b/files/poketool/trainer/trpoke/narc_0580.bin
deleted file mode 100644
index 27ecf031..00000000
--- a/files/poketool/trainer/trpoke/narc_0580.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0581.bin b/files/poketool/trainer/trpoke/narc_0581.bin
deleted file mode 100644
index f3d24ec0..00000000
--- a/files/poketool/trainer/trpoke/narc_0581.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0582.bin b/files/poketool/trainer/trpoke/narc_0582.bin
deleted file mode 100644
index 888cc078..00000000
--- a/files/poketool/trainer/trpoke/narc_0582.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0583.bin b/files/poketool/trainer/trpoke/narc_0583.bin
deleted file mode 100644
index cae75003..00000000
--- a/files/poketool/trainer/trpoke/narc_0583.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0584.bin b/files/poketool/trainer/trpoke/narc_0584.bin
deleted file mode 100644
index 9dbe752d..00000000
--- a/files/poketool/trainer/trpoke/narc_0584.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0585.bin b/files/poketool/trainer/trpoke/narc_0585.bin
deleted file mode 100644
index 6c390090..00000000
--- a/files/poketool/trainer/trpoke/narc_0585.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0586.bin b/files/poketool/trainer/trpoke/narc_0586.bin
deleted file mode 100644
index 6914d8b9..00000000
--- a/files/poketool/trainer/trpoke/narc_0586.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0587.bin b/files/poketool/trainer/trpoke/narc_0587.bin
deleted file mode 100644
index bf755385..00000000
--- a/files/poketool/trainer/trpoke/narc_0587.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0588.bin b/files/poketool/trainer/trpoke/narc_0588.bin
deleted file mode 100644
index 0a27f160..00000000
--- a/files/poketool/trainer/trpoke/narc_0588.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0589.bin b/files/poketool/trainer/trpoke/narc_0589.bin
deleted file mode 100644
index 319437cb..00000000
--- a/files/poketool/trainer/trpoke/narc_0589.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0590.bin b/files/poketool/trainer/trpoke/narc_0590.bin
deleted file mode 100644
index 0de57f12..00000000
--- a/files/poketool/trainer/trpoke/narc_0590.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0591.bin b/files/poketool/trainer/trpoke/narc_0591.bin
deleted file mode 100644
index 4b729163..00000000
--- a/files/poketool/trainer/trpoke/narc_0591.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0592.bin b/files/poketool/trainer/trpoke/narc_0592.bin
deleted file mode 100644
index f5385fc7..00000000
--- a/files/poketool/trainer/trpoke/narc_0592.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0593.bin b/files/poketool/trainer/trpoke/narc_0593.bin
deleted file mode 100644
index 545ec9ed..00000000
--- a/files/poketool/trainer/trpoke/narc_0593.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0594.bin b/files/poketool/trainer/trpoke/narc_0594.bin
deleted file mode 100644
index 2827db79..00000000
--- a/files/poketool/trainer/trpoke/narc_0594.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0595.bin b/files/poketool/trainer/trpoke/narc_0595.bin
deleted file mode 100644
index cae16396..00000000
--- a/files/poketool/trainer/trpoke/narc_0595.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0596.bin b/files/poketool/trainer/trpoke/narc_0596.bin
deleted file mode 100644
index 185a297c..00000000
--- a/files/poketool/trainer/trpoke/narc_0596.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0597.bin b/files/poketool/trainer/trpoke/narc_0597.bin
deleted file mode 100644
index 870ef5ed..00000000
--- a/files/poketool/trainer/trpoke/narc_0597.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0598.bin b/files/poketool/trainer/trpoke/narc_0598.bin
deleted file mode 100644
index 46414949..00000000
--- a/files/poketool/trainer/trpoke/narc_0598.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0599.bin b/files/poketool/trainer/trpoke/narc_0599.bin
deleted file mode 100644
index 617da377..00000000
--- a/files/poketool/trainer/trpoke/narc_0599.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0600.bin b/files/poketool/trainer/trpoke/narc_0600.bin
deleted file mode 100644
index 40900697..00000000
--- a/files/poketool/trainer/trpoke/narc_0600.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0601.bin b/files/poketool/trainer/trpoke/narc_0601.bin
deleted file mode 100644
index 377228fd..00000000
--- a/files/poketool/trainer/trpoke/narc_0601.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0602.bin b/files/poketool/trainer/trpoke/narc_0602.bin
deleted file mode 100644
index 2dadb03e..00000000
--- a/files/poketool/trainer/trpoke/narc_0602.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0603.bin b/files/poketool/trainer/trpoke/narc_0603.bin
deleted file mode 100644
index 4b2e7588..00000000
--- a/files/poketool/trainer/trpoke/narc_0603.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0604.bin b/files/poketool/trainer/trpoke/narc_0604.bin
deleted file mode 100644
index cb4a445c..00000000
--- a/files/poketool/trainer/trpoke/narc_0604.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0605.bin b/files/poketool/trainer/trpoke/narc_0605.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0605.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0606.bin b/files/poketool/trainer/trpoke/narc_0606.bin
deleted file mode 100644
index 00ab7bbf..00000000
--- a/files/poketool/trainer/trpoke/narc_0606.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0607.bin b/files/poketool/trainer/trpoke/narc_0607.bin
deleted file mode 100644
index 46e8c619..00000000
--- a/files/poketool/trainer/trpoke/narc_0607.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0608.bin b/files/poketool/trainer/trpoke/narc_0608.bin
deleted file mode 100644
index 13c451e1..00000000
--- a/files/poketool/trainer/trpoke/narc_0608.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0609.bin b/files/poketool/trainer/trpoke/narc_0609.bin
deleted file mode 100644
index 4476505a..00000000
--- a/files/poketool/trainer/trpoke/narc_0609.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0610.bin b/files/poketool/trainer/trpoke/narc_0610.bin
deleted file mode 100644
index 6c423e78..00000000
--- a/files/poketool/trainer/trpoke/narc_0610.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0611.bin b/files/poketool/trainer/trpoke/narc_0611.bin
deleted file mode 100644
index f93dff09..00000000
--- a/files/poketool/trainer/trpoke/narc_0611.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0612.bin b/files/poketool/trainer/trpoke/narc_0612.bin
deleted file mode 100644
index f745362c..00000000
--- a/files/poketool/trainer/trpoke/narc_0612.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0613.bin b/files/poketool/trainer/trpoke/narc_0613.bin
deleted file mode 100644
index 71655ed6..00000000
--- a/files/poketool/trainer/trpoke/narc_0613.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0614.bin b/files/poketool/trainer/trpoke/narc_0614.bin
deleted file mode 100644
index 2be0d425..00000000
--- a/files/poketool/trainer/trpoke/narc_0614.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0615.bin b/files/poketool/trainer/trpoke/narc_0615.bin
deleted file mode 100644
index dcd10d8f..00000000
--- a/files/poketool/trainer/trpoke/narc_0615.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0616.bin b/files/poketool/trainer/trpoke/narc_0616.bin
deleted file mode 100644
index 71655ed6..00000000
--- a/files/poketool/trainer/trpoke/narc_0616.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0617.bin b/files/poketool/trainer/trpoke/narc_0617.bin
deleted file mode 100644
index 2be0d425..00000000
--- a/files/poketool/trainer/trpoke/narc_0617.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0618.bin b/files/poketool/trainer/trpoke/narc_0618.bin
deleted file mode 100644
index dcd10d8f..00000000
--- a/files/poketool/trainer/trpoke/narc_0618.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0619.bin b/files/poketool/trainer/trpoke/narc_0619.bin
deleted file mode 100644
index 2872ebf4..00000000
--- a/files/poketool/trainer/trpoke/narc_0619.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0620.bin b/files/poketool/trainer/trpoke/narc_0620.bin
deleted file mode 100644
index d1b5eef4..00000000
--- a/files/poketool/trainer/trpoke/narc_0620.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0621.bin b/files/poketool/trainer/trpoke/narc_0621.bin
deleted file mode 100644
index e7c74396..00000000
--- a/files/poketool/trainer/trpoke/narc_0621.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0622.bin b/files/poketool/trainer/trpoke/narc_0622.bin
deleted file mode 100644
index 1b483c62..00000000
--- a/files/poketool/trainer/trpoke/narc_0622.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0623.bin b/files/poketool/trainer/trpoke/narc_0623.bin
deleted file mode 100644
index 3e834a56..00000000
--- a/files/poketool/trainer/trpoke/narc_0623.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0624.bin b/files/poketool/trainer/trpoke/narc_0624.bin
deleted file mode 100644
index e7c74396..00000000
--- a/files/poketool/trainer/trpoke/narc_0624.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0625.bin b/files/poketool/trainer/trpoke/narc_0625.bin
deleted file mode 100644
index 1b483c62..00000000
--- a/files/poketool/trainer/trpoke/narc_0625.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0626.bin b/files/poketool/trainer/trpoke/narc_0626.bin
deleted file mode 100644
index 3e834a56..00000000
--- a/files/poketool/trainer/trpoke/narc_0626.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0627.bin b/files/poketool/trainer/trpoke/narc_0627.bin
deleted file mode 100644
index 9debb329..00000000
--- a/files/poketool/trainer/trpoke/narc_0627.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0628.bin b/files/poketool/trainer/trpoke/narc_0628.bin
deleted file mode 100644
index 5cc5edc4..00000000
--- a/files/poketool/trainer/trpoke/narc_0628.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0629.bin b/files/poketool/trainer/trpoke/narc_0629.bin
deleted file mode 100644
index c05e7e05..00000000
--- a/files/poketool/trainer/trpoke/narc_0629.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0630.bin b/files/poketool/trainer/trpoke/narc_0630.bin
deleted file mode 100644
index d910a785..00000000
--- a/files/poketool/trainer/trpoke/narc_0630.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0631.bin b/files/poketool/trainer/trpoke/narc_0631.bin
deleted file mode 100644
index fbb33350..00000000
--- a/files/poketool/trainer/trpoke/narc_0631.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0632.bin b/files/poketool/trainer/trpoke/narc_0632.bin
deleted file mode 100644
index 31b220ca..00000000
--- a/files/poketool/trainer/trpoke/narc_0632.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0633.bin b/files/poketool/trainer/trpoke/narc_0633.bin
deleted file mode 100644
index 1112b59c..00000000
--- a/files/poketool/trainer/trpoke/narc_0633.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0634.bin b/files/poketool/trainer/trpoke/narc_0634.bin
deleted file mode 100644
index d1770dc6..00000000
--- a/files/poketool/trainer/trpoke/narc_0634.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0635.bin b/files/poketool/trainer/trpoke/narc_0635.bin
deleted file mode 100644
index 576eea14..00000000
--- a/files/poketool/trainer/trpoke/narc_0635.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0636.bin b/files/poketool/trainer/trpoke/narc_0636.bin
deleted file mode 100644
index 5a21612a..00000000
--- a/files/poketool/trainer/trpoke/narc_0636.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0637.bin b/files/poketool/trainer/trpoke/narc_0637.bin
deleted file mode 100644
index 82ff359c..00000000
--- a/files/poketool/trainer/trpoke/narc_0637.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0638.bin b/files/poketool/trainer/trpoke/narc_0638.bin
deleted file mode 100644
index 75a63a28..00000000
--- a/files/poketool/trainer/trpoke/narc_0638.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0639.bin b/files/poketool/trainer/trpoke/narc_0639.bin
deleted file mode 100644
index 9098d9e6..00000000
--- a/files/poketool/trainer/trpoke/narc_0639.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0640.bin b/files/poketool/trainer/trpoke/narc_0640.bin
deleted file mode 100644
index ddc22def..00000000
--- a/files/poketool/trainer/trpoke/narc_0640.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0641.bin b/files/poketool/trainer/trpoke/narc_0641.bin
deleted file mode 100644
index 7416cf3f..00000000
--- a/files/poketool/trainer/trpoke/narc_0641.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0642.bin b/files/poketool/trainer/trpoke/narc_0642.bin
deleted file mode 100644
index b50a338c..00000000
--- a/files/poketool/trainer/trpoke/narc_0642.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0643.bin b/files/poketool/trainer/trpoke/narc_0643.bin
deleted file mode 100644
index 06de1111..00000000
--- a/files/poketool/trainer/trpoke/narc_0643.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0644.bin b/files/poketool/trainer/trpoke/narc_0644.bin
deleted file mode 100644
index d49b7b7b..00000000
--- a/files/poketool/trainer/trpoke/narc_0644.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0645.bin b/files/poketool/trainer/trpoke/narc_0645.bin
deleted file mode 100644
index a75d12bb..00000000
--- a/files/poketool/trainer/trpoke/narc_0645.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0646.bin b/files/poketool/trainer/trpoke/narc_0646.bin
deleted file mode 100644
index 4ebe6411..00000000
--- a/files/poketool/trainer/trpoke/narc_0646.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0647.bin b/files/poketool/trainer/trpoke/narc_0647.bin
deleted file mode 100644
index 81721beb..00000000
--- a/files/poketool/trainer/trpoke/narc_0647.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0648.bin b/files/poketool/trainer/trpoke/narc_0648.bin
deleted file mode 100644
index f26c5f03..00000000
--- a/files/poketool/trainer/trpoke/narc_0648.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0649.bin b/files/poketool/trainer/trpoke/narc_0649.bin
deleted file mode 100644
index 99273f35..00000000
--- a/files/poketool/trainer/trpoke/narc_0649.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0650.bin b/files/poketool/trainer/trpoke/narc_0650.bin
deleted file mode 100644
index 3960cfbe..00000000
--- a/files/poketool/trainer/trpoke/narc_0650.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0651.bin b/files/poketool/trainer/trpoke/narc_0651.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0651.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0652.bin b/files/poketool/trainer/trpoke/narc_0652.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0652.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0653.bin b/files/poketool/trainer/trpoke/narc_0653.bin
deleted file mode 100644
index a9ff1761..00000000
--- a/files/poketool/trainer/trpoke/narc_0653.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0654.bin b/files/poketool/trainer/trpoke/narc_0654.bin
deleted file mode 100644
index 7a7c81cb..00000000
--- a/files/poketool/trainer/trpoke/narc_0654.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0655.bin b/files/poketool/trainer/trpoke/narc_0655.bin
deleted file mode 100644
index d1995979..00000000
--- a/files/poketool/trainer/trpoke/narc_0655.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0656.bin b/files/poketool/trainer/trpoke/narc_0656.bin
deleted file mode 100644
index 554b55ae..00000000
--- a/files/poketool/trainer/trpoke/narc_0656.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0657.bin b/files/poketool/trainer/trpoke/narc_0657.bin
deleted file mode 100644
index ccc02933..00000000
--- a/files/poketool/trainer/trpoke/narc_0657.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0658.bin b/files/poketool/trainer/trpoke/narc_0658.bin
deleted file mode 100644
index 3a5828fc..00000000
--- a/files/poketool/trainer/trpoke/narc_0658.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0659.bin b/files/poketool/trainer/trpoke/narc_0659.bin
deleted file mode 100644
index 93977e17..00000000
--- a/files/poketool/trainer/trpoke/narc_0659.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0660.bin b/files/poketool/trainer/trpoke/narc_0660.bin
deleted file mode 100644
index c452f234..00000000
--- a/files/poketool/trainer/trpoke/narc_0660.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0661.bin b/files/poketool/trainer/trpoke/narc_0661.bin
deleted file mode 100644
index 25018de6..00000000
--- a/files/poketool/trainer/trpoke/narc_0661.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0662.bin b/files/poketool/trainer/trpoke/narc_0662.bin
deleted file mode 100644
index 6ef8a6b7..00000000
--- a/files/poketool/trainer/trpoke/narc_0662.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0663.bin b/files/poketool/trainer/trpoke/narc_0663.bin
deleted file mode 100644
index c5400cab..00000000
--- a/files/poketool/trainer/trpoke/narc_0663.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0664.bin b/files/poketool/trainer/trpoke/narc_0664.bin
deleted file mode 100644
index e37afe6f..00000000
--- a/files/poketool/trainer/trpoke/narc_0664.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0665.bin b/files/poketool/trainer/trpoke/narc_0665.bin
deleted file mode 100644
index 60299e22..00000000
--- a/files/poketool/trainer/trpoke/narc_0665.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0666.bin b/files/poketool/trainer/trpoke/narc_0666.bin
deleted file mode 100644
index a3fc9cc8..00000000
--- a/files/poketool/trainer/trpoke/narc_0666.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0667.bin b/files/poketool/trainer/trpoke/narc_0667.bin
deleted file mode 100644
index 253f79f1..00000000
--- a/files/poketool/trainer/trpoke/narc_0667.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0668.bin b/files/poketool/trainer/trpoke/narc_0668.bin
deleted file mode 100644
index 0b84097b..00000000
--- a/files/poketool/trainer/trpoke/narc_0668.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0669.bin b/files/poketool/trainer/trpoke/narc_0669.bin
deleted file mode 100644
index 0dd968c4..00000000
--- a/files/poketool/trainer/trpoke/narc_0669.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0670.bin b/files/poketool/trainer/trpoke/narc_0670.bin
deleted file mode 100644
index 3161fc1c..00000000
--- a/files/poketool/trainer/trpoke/narc_0670.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0671.bin b/files/poketool/trainer/trpoke/narc_0671.bin
deleted file mode 100644
index e8b40197..00000000
--- a/files/poketool/trainer/trpoke/narc_0671.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0672.bin b/files/poketool/trainer/trpoke/narc_0672.bin
deleted file mode 100644
index 5f537278..00000000
--- a/files/poketool/trainer/trpoke/narc_0672.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0673.bin b/files/poketool/trainer/trpoke/narc_0673.bin
deleted file mode 100644
index 2c90a503..00000000
--- a/files/poketool/trainer/trpoke/narc_0673.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0674.bin b/files/poketool/trainer/trpoke/narc_0674.bin
deleted file mode 100644
index 64231443..00000000
--- a/files/poketool/trainer/trpoke/narc_0674.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0675.bin b/files/poketool/trainer/trpoke/narc_0675.bin
deleted file mode 100644
index f246eb6c..00000000
--- a/files/poketool/trainer/trpoke/narc_0675.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0676.bin b/files/poketool/trainer/trpoke/narc_0676.bin
deleted file mode 100644
index f39acaf1..00000000
--- a/files/poketool/trainer/trpoke/narc_0676.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0677.bin b/files/poketool/trainer/trpoke/narc_0677.bin
deleted file mode 100644
index d8aba36a..00000000
--- a/files/poketool/trainer/trpoke/narc_0677.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0678.bin b/files/poketool/trainer/trpoke/narc_0678.bin
deleted file mode 100644
index 56fb0e1c..00000000
--- a/files/poketool/trainer/trpoke/narc_0678.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0679.bin b/files/poketool/trainer/trpoke/narc_0679.bin
deleted file mode 100644
index 70ffdec6..00000000
--- a/files/poketool/trainer/trpoke/narc_0679.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0680.bin b/files/poketool/trainer/trpoke/narc_0680.bin
deleted file mode 100644
index 6e476238..00000000
--- a/files/poketool/trainer/trpoke/narc_0680.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0681.bin b/files/poketool/trainer/trpoke/narc_0681.bin
deleted file mode 100644
index 7e12a46e..00000000
--- a/files/poketool/trainer/trpoke/narc_0681.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0682.bin b/files/poketool/trainer/trpoke/narc_0682.bin
deleted file mode 100644
index c2a1145c..00000000
--- a/files/poketool/trainer/trpoke/narc_0682.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0683.bin b/files/poketool/trainer/trpoke/narc_0683.bin
deleted file mode 100644
index 451db44e..00000000
--- a/files/poketool/trainer/trpoke/narc_0683.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0684.bin b/files/poketool/trainer/trpoke/narc_0684.bin
deleted file mode 100644
index e5a5925b..00000000
--- a/files/poketool/trainer/trpoke/narc_0684.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0685.bin b/files/poketool/trainer/trpoke/narc_0685.bin
deleted file mode 100644
index dae6ed63..00000000
--- a/files/poketool/trainer/trpoke/narc_0685.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0686.bin b/files/poketool/trainer/trpoke/narc_0686.bin
deleted file mode 100644
index dae6ed63..00000000
--- a/files/poketool/trainer/trpoke/narc_0686.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0687.bin b/files/poketool/trainer/trpoke/narc_0687.bin
deleted file mode 100644
index a759b13c..00000000
--- a/files/poketool/trainer/trpoke/narc_0687.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0688.bin b/files/poketool/trainer/trpoke/narc_0688.bin
deleted file mode 100644
index bb27b1a3..00000000
--- a/files/poketool/trainer/trpoke/narc_0688.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0689.bin b/files/poketool/trainer/trpoke/narc_0689.bin
deleted file mode 100644
index df26cf1a..00000000
--- a/files/poketool/trainer/trpoke/narc_0689.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0690.bin b/files/poketool/trainer/trpoke/narc_0690.bin
deleted file mode 100644
index bbfd54df..00000000
--- a/files/poketool/trainer/trpoke/narc_0690.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0691.bin b/files/poketool/trainer/trpoke/narc_0691.bin
deleted file mode 100644
index 0e9ce9b7..00000000
--- a/files/poketool/trainer/trpoke/narc_0691.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0692.bin b/files/poketool/trainer/trpoke/narc_0692.bin
deleted file mode 100644
index 07a0999a..00000000
--- a/files/poketool/trainer/trpoke/narc_0692.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0693.bin b/files/poketool/trainer/trpoke/narc_0693.bin
deleted file mode 100644
index b7320eae..00000000
--- a/files/poketool/trainer/trpoke/narc_0693.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0694.bin b/files/poketool/trainer/trpoke/narc_0694.bin
deleted file mode 100644
index 019eb1c9..00000000
--- a/files/poketool/trainer/trpoke/narc_0694.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0695.bin b/files/poketool/trainer/trpoke/narc_0695.bin
deleted file mode 100644
index bb6d6462..00000000
--- a/files/poketool/trainer/trpoke/narc_0695.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0696.bin b/files/poketool/trainer/trpoke/narc_0696.bin
deleted file mode 100644
index 685a16f4..00000000
--- a/files/poketool/trainer/trpoke/narc_0696.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0697.bin b/files/poketool/trainer/trpoke/narc_0697.bin
deleted file mode 100644
index b503e7ab..00000000
--- a/files/poketool/trainer/trpoke/narc_0697.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0698.bin b/files/poketool/trainer/trpoke/narc_0698.bin
deleted file mode 100644
index 24d7b326..00000000
--- a/files/poketool/trainer/trpoke/narc_0698.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0699.bin b/files/poketool/trainer/trpoke/narc_0699.bin
deleted file mode 100644
index 7e06c12b..00000000
--- a/files/poketool/trainer/trpoke/narc_0699.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0700.bin b/files/poketool/trainer/trpoke/narc_0700.bin
deleted file mode 100644
index cc91db11..00000000
--- a/files/poketool/trainer/trpoke/narc_0700.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0701.bin b/files/poketool/trainer/trpoke/narc_0701.bin
deleted file mode 100644
index 00ffe4be..00000000
--- a/files/poketool/trainer/trpoke/narc_0701.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0702.bin b/files/poketool/trainer/trpoke/narc_0702.bin
deleted file mode 100644
index 7a6d34dc..00000000
--- a/files/poketool/trainer/trpoke/narc_0702.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0703.bin b/files/poketool/trainer/trpoke/narc_0703.bin
deleted file mode 100644
index 9debb329..00000000
--- a/files/poketool/trainer/trpoke/narc_0703.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0704.bin b/files/poketool/trainer/trpoke/narc_0704.bin
deleted file mode 100644
index 5cc5edc4..00000000
--- a/files/poketool/trainer/trpoke/narc_0704.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0705.bin b/files/poketool/trainer/trpoke/narc_0705.bin
deleted file mode 100644
index c05e7e05..00000000
--- a/files/poketool/trainer/trpoke/narc_0705.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0706.bin b/files/poketool/trainer/trpoke/narc_0706.bin
deleted file mode 100644
index ec0c811d..00000000
--- a/files/poketool/trainer/trpoke/narc_0706.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0707.bin b/files/poketool/trainer/trpoke/narc_0707.bin
deleted file mode 100644
index b7659e4f..00000000
--- a/files/poketool/trainer/trpoke/narc_0707.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0708.bin b/files/poketool/trainer/trpoke/narc_0708.bin
deleted file mode 100644
index 2d6764f2..00000000
--- a/files/poketool/trainer/trpoke/narc_0708.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0709.bin b/files/poketool/trainer/trpoke/narc_0709.bin
deleted file mode 100644
index 2b55d875..00000000
--- a/files/poketool/trainer/trpoke/narc_0709.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0710.bin b/files/poketool/trainer/trpoke/narc_0710.bin
deleted file mode 100644
index fb2c9b68..00000000
--- a/files/poketool/trainer/trpoke/narc_0710.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0711.bin b/files/poketool/trainer/trpoke/narc_0711.bin
deleted file mode 100644
index b43b42af..00000000
--- a/files/poketool/trainer/trpoke/narc_0711.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0712.bin b/files/poketool/trainer/trpoke/narc_0712.bin
deleted file mode 100644
index 96fb869b..00000000
--- a/files/poketool/trainer/trpoke/narc_0712.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0713.bin b/files/poketool/trainer/trpoke/narc_0713.bin
deleted file mode 100644
index 3681e67a..00000000
--- a/files/poketool/trainer/trpoke/narc_0713.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0714.bin b/files/poketool/trainer/trpoke/narc_0714.bin
deleted file mode 100644
index 123b4132..00000000
--- a/files/poketool/trainer/trpoke/narc_0714.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0715.bin b/files/poketool/trainer/trpoke/narc_0715.bin
deleted file mode 100644
index d7f630ee..00000000
--- a/files/poketool/trainer/trpoke/narc_0715.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0716.bin b/files/poketool/trainer/trpoke/narc_0716.bin
deleted file mode 100644
index 939a6945..00000000
--- a/files/poketool/trainer/trpoke/narc_0716.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0717.bin b/files/poketool/trainer/trpoke/narc_0717.bin
deleted file mode 100644
index 72cccf05..00000000
--- a/files/poketool/trainer/trpoke/narc_0717.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0718.bin b/files/poketool/trainer/trpoke/narc_0718.bin
deleted file mode 100644
index 67942159..00000000
--- a/files/poketool/trainer/trpoke/narc_0718.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0719.bin b/files/poketool/trainer/trpoke/narc_0719.bin
deleted file mode 100644
index 966becdd..00000000
--- a/files/poketool/trainer/trpoke/narc_0719.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0720.bin b/files/poketool/trainer/trpoke/narc_0720.bin
deleted file mode 100644
index 5f347443..00000000
--- a/files/poketool/trainer/trpoke/narc_0720.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0721.bin b/files/poketool/trainer/trpoke/narc_0721.bin
deleted file mode 100644
index 554b55ae..00000000
--- a/files/poketool/trainer/trpoke/narc_0721.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0722.bin b/files/poketool/trainer/trpoke/narc_0722.bin
deleted file mode 100644
index ccc02933..00000000
--- a/files/poketool/trainer/trpoke/narc_0722.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0723.bin b/files/poketool/trainer/trpoke/narc_0723.bin
deleted file mode 100644
index ff385a42..00000000
--- a/files/poketool/trainer/trpoke/narc_0723.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0724.bin b/files/poketool/trainer/trpoke/narc_0724.bin
deleted file mode 100644
index 54ec4466..00000000
--- a/files/poketool/trainer/trpoke/narc_0724.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0725.bin b/files/poketool/trainer/trpoke/narc_0725.bin
deleted file mode 100644
index 3bf3024b..00000000
--- a/files/poketool/trainer/trpoke/narc_0725.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0726.bin b/files/poketool/trainer/trpoke/narc_0726.bin
deleted file mode 100644
index ab645a7f..00000000
--- a/files/poketool/trainer/trpoke/narc_0726.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0727.bin b/files/poketool/trainer/trpoke/narc_0727.bin
deleted file mode 100644
index 019eb1c9..00000000
--- a/files/poketool/trainer/trpoke/narc_0727.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0728.bin b/files/poketool/trainer/trpoke/narc_0728.bin
deleted file mode 100644
index c1beab5f..00000000
--- a/files/poketool/trainer/trpoke/narc_0728.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0729.bin b/files/poketool/trainer/trpoke/narc_0729.bin
deleted file mode 100644
index f7ad4896..00000000
--- a/files/poketool/trainer/trpoke/narc_0729.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0730.bin b/files/poketool/trainer/trpoke/narc_0730.bin
deleted file mode 100644
index b8bb37b4..00000000
--- a/files/poketool/trainer/trpoke/narc_0730.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0731.bin b/files/poketool/trainer/trpoke/narc_0731.bin
deleted file mode 100644
index 61e80429..00000000
--- a/files/poketool/trainer/trpoke/narc_0731.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0732.bin b/files/poketool/trainer/trpoke/narc_0732.bin
deleted file mode 100644
index d72097aa..00000000
--- a/files/poketool/trainer/trpoke/narc_0732.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0733.bin b/files/poketool/trainer/trpoke/narc_0733.bin
deleted file mode 100644
index 6c3f1a2b..00000000
--- a/files/poketool/trainer/trpoke/narc_0733.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0734.bin b/files/poketool/trainer/trpoke/narc_0734.bin
deleted file mode 100644
index ba42f08c..00000000
--- a/files/poketool/trainer/trpoke/narc_0734.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0735.bin b/files/poketool/trainer/trpoke/narc_0735.bin
deleted file mode 100644
index 04c1d5e6..00000000
--- a/files/poketool/trainer/trpoke/narc_0735.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0736.bin b/files/poketool/trainer/trpoke/narc_0736.bin
deleted file mode 100644
index 8e75221a..00000000
--- a/files/poketool/trainer/trpoke/narc_0736.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0737.bin b/files/poketool/trainer/trpoke/narc_0737.bin
deleted file mode 100644
index 3eb5fcac..00000000
--- a/files/poketool/trainer/trpoke/narc_0737.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0738.bin b/files/poketool/trainer/trpoke/narc_0738.bin
deleted file mode 100644
index b46857f9..00000000
--- a/files/poketool/trainer/trpoke/narc_0738.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0739.bin b/files/poketool/trainer/trpoke/narc_0739.bin
deleted file mode 100644
index a1a12edc..00000000
--- a/files/poketool/trainer/trpoke/narc_0739.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0740.bin b/files/poketool/trainer/trpoke/narc_0740.bin
deleted file mode 100644
index fe2217f5..00000000
--- a/files/poketool/trainer/trpoke/narc_0740.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0741.bin b/files/poketool/trainer/trpoke/narc_0741.bin
deleted file mode 100644
index c1c103a9..00000000
--- a/files/poketool/trainer/trpoke/narc_0741.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0742.bin b/files/poketool/trainer/trpoke/narc_0742.bin
deleted file mode 100644
index 572fb6b1..00000000
--- a/files/poketool/trainer/trpoke/narc_0742.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0743.bin b/files/poketool/trainer/trpoke/narc_0743.bin
deleted file mode 100644
index 4b0ba68a..00000000
--- a/files/poketool/trainer/trpoke/narc_0743.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0744.bin b/files/poketool/trainer/trpoke/narc_0744.bin
deleted file mode 100644
index cecb5234..00000000
--- a/files/poketool/trainer/trpoke/narc_0744.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0745.bin b/files/poketool/trainer/trpoke/narc_0745.bin
deleted file mode 100644
index fd450311..00000000
--- a/files/poketool/trainer/trpoke/narc_0745.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0746.bin b/files/poketool/trainer/trpoke/narc_0746.bin
deleted file mode 100644
index 1fb351ee..00000000
--- a/files/poketool/trainer/trpoke/narc_0746.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0747.bin b/files/poketool/trainer/trpoke/narc_0747.bin
deleted file mode 100644
index c8ef8f0e..00000000
--- a/files/poketool/trainer/trpoke/narc_0747.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0748.bin b/files/poketool/trainer/trpoke/narc_0748.bin
deleted file mode 100644
index a1adbca8..00000000
--- a/files/poketool/trainer/trpoke/narc_0748.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0749.bin b/files/poketool/trainer/trpoke/narc_0749.bin
deleted file mode 100644
index ddc55889..00000000
--- a/files/poketool/trainer/trpoke/narc_0749.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0750.bin b/files/poketool/trainer/trpoke/narc_0750.bin
deleted file mode 100644
index 2ef0e853..00000000
--- a/files/poketool/trainer/trpoke/narc_0750.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0751.bin b/files/poketool/trainer/trpoke/narc_0751.bin
deleted file mode 100644
index 248a35c3..00000000
--- a/files/poketool/trainer/trpoke/narc_0751.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0752.bin b/files/poketool/trainer/trpoke/narc_0752.bin
deleted file mode 100644
index 5dd4de6b..00000000
--- a/files/poketool/trainer/trpoke/narc_0752.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0753.bin b/files/poketool/trainer/trpoke/narc_0753.bin
deleted file mode 100644
index fc72c18d..00000000
--- a/files/poketool/trainer/trpoke/narc_0753.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0754.bin b/files/poketool/trainer/trpoke/narc_0754.bin
deleted file mode 100644
index 9f4be4db..00000000
--- a/files/poketool/trainer/trpoke/narc_0754.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0755.bin b/files/poketool/trainer/trpoke/narc_0755.bin
deleted file mode 100644
index 8d29b762..00000000
--- a/files/poketool/trainer/trpoke/narc_0755.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0756.bin b/files/poketool/trainer/trpoke/narc_0756.bin
deleted file mode 100644
index ec082d01..00000000
--- a/files/poketool/trainer/trpoke/narc_0756.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0757.bin b/files/poketool/trainer/trpoke/narc_0757.bin
deleted file mode 100644
index f56e6f49..00000000
--- a/files/poketool/trainer/trpoke/narc_0757.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0758.bin b/files/poketool/trainer/trpoke/narc_0758.bin
deleted file mode 100644
index c202f19f..00000000
--- a/files/poketool/trainer/trpoke/narc_0758.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0759.bin b/files/poketool/trainer/trpoke/narc_0759.bin
deleted file mode 100644
index a6fbac5c..00000000
--- a/files/poketool/trainer/trpoke/narc_0759.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0760.bin b/files/poketool/trainer/trpoke/narc_0760.bin
deleted file mode 100644
index 2878655e..00000000
--- a/files/poketool/trainer/trpoke/narc_0760.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0761.bin b/files/poketool/trainer/trpoke/narc_0761.bin
deleted file mode 100644
index 462ec392..00000000
--- a/files/poketool/trainer/trpoke/narc_0761.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0762.bin b/files/poketool/trainer/trpoke/narc_0762.bin
deleted file mode 100644
index 9d8b3a17..00000000
--- a/files/poketool/trainer/trpoke/narc_0762.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0763.bin b/files/poketool/trainer/trpoke/narc_0763.bin
deleted file mode 100644
index 297362cc..00000000
--- a/files/poketool/trainer/trpoke/narc_0763.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0764.bin b/files/poketool/trainer/trpoke/narc_0764.bin
deleted file mode 100644
index 8a723635..00000000
--- a/files/poketool/trainer/trpoke/narc_0764.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0765.bin b/files/poketool/trainer/trpoke/narc_0765.bin
deleted file mode 100644
index 2fb434c9..00000000
--- a/files/poketool/trainer/trpoke/narc_0765.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0766.bin b/files/poketool/trainer/trpoke/narc_0766.bin
deleted file mode 100644
index 6db62392..00000000
--- a/files/poketool/trainer/trpoke/narc_0766.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0767.bin b/files/poketool/trainer/trpoke/narc_0767.bin
deleted file mode 100644
index 8d29b762..00000000
--- a/files/poketool/trainer/trpoke/narc_0767.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0768.bin b/files/poketool/trainer/trpoke/narc_0768.bin
deleted file mode 100644
index 99646dc4..00000000
--- a/files/poketool/trainer/trpoke/narc_0768.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0769.bin b/files/poketool/trainer/trpoke/narc_0769.bin
deleted file mode 100644
index cdb5b644..00000000
--- a/files/poketool/trainer/trpoke/narc_0769.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0770.bin b/files/poketool/trainer/trpoke/narc_0770.bin
deleted file mode 100644
index 56d53027..00000000
--- a/files/poketool/trainer/trpoke/narc_0770.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0771.bin b/files/poketool/trainer/trpoke/narc_0771.bin
deleted file mode 100644
index f93cfcae..00000000
--- a/files/poketool/trainer/trpoke/narc_0771.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0772.bin b/files/poketool/trainer/trpoke/narc_0772.bin
deleted file mode 100644
index 5f8048a0..00000000
--- a/files/poketool/trainer/trpoke/narc_0772.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0773.bin b/files/poketool/trainer/trpoke/narc_0773.bin
deleted file mode 100644
index 3752add3..00000000
--- a/files/poketool/trainer/trpoke/narc_0773.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0774.bin b/files/poketool/trainer/trpoke/narc_0774.bin
deleted file mode 100644
index cb0befef..00000000
--- a/files/poketool/trainer/trpoke/narc_0774.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0775.bin b/files/poketool/trainer/trpoke/narc_0775.bin
deleted file mode 100644
index ed71a62e..00000000
--- a/files/poketool/trainer/trpoke/narc_0775.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0776.bin b/files/poketool/trainer/trpoke/narc_0776.bin
deleted file mode 100644
index 43a1fadc..00000000
--- a/files/poketool/trainer/trpoke/narc_0776.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0777.bin b/files/poketool/trainer/trpoke/narc_0777.bin
deleted file mode 100644
index 13ed5295..00000000
--- a/files/poketool/trainer/trpoke/narc_0777.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0778.bin b/files/poketool/trainer/trpoke/narc_0778.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0778.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0779.bin b/files/poketool/trainer/trpoke/narc_0779.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0779.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0780.bin b/files/poketool/trainer/trpoke/narc_0780.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0780.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0781.bin b/files/poketool/trainer/trpoke/narc_0781.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0781.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0782.bin b/files/poketool/trainer/trpoke/narc_0782.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0782.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0783.bin b/files/poketool/trainer/trpoke/narc_0783.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0783.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0784.bin b/files/poketool/trainer/trpoke/narc_0784.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0784.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0785.bin b/files/poketool/trainer/trpoke/narc_0785.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0785.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0786.bin b/files/poketool/trainer/trpoke/narc_0786.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0786.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0787.bin b/files/poketool/trainer/trpoke/narc_0787.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0787.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0788.bin b/files/poketool/trainer/trpoke/narc_0788.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0788.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0789.bin b/files/poketool/trainer/trpoke/narc_0789.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0789.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0790.bin b/files/poketool/trainer/trpoke/narc_0790.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0790.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0791.bin b/files/poketool/trainer/trpoke/narc_0791.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0791.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0792.bin b/files/poketool/trainer/trpoke/narc_0792.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0792.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0793.bin b/files/poketool/trainer/trpoke/narc_0793.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0793.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0794.bin b/files/poketool/trainer/trpoke/narc_0794.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0794.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0795.bin b/files/poketool/trainer/trpoke/narc_0795.bin
deleted file mode 100644
index 1f22752b..00000000
--- a/files/poketool/trainer/trpoke/narc_0795.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0796.bin b/files/poketool/trainer/trpoke/narc_0796.bin
deleted file mode 100644
index 1f22752b..00000000
--- a/files/poketool/trainer/trpoke/narc_0796.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0797.bin b/files/poketool/trainer/trpoke/narc_0797.bin
deleted file mode 100644
index 1f22752b..00000000
--- a/files/poketool/trainer/trpoke/narc_0797.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0798.bin b/files/poketool/trainer/trpoke/narc_0798.bin
deleted file mode 100644
index 1f22752b..00000000
--- a/files/poketool/trainer/trpoke/narc_0798.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0799.bin b/files/poketool/trainer/trpoke/narc_0799.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0799.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0800.bin b/files/poketool/trainer/trpoke/narc_0800.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0800.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0801.bin b/files/poketool/trainer/trpoke/narc_0801.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0801.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0802.bin b/files/poketool/trainer/trpoke/narc_0802.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0802.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0803.bin b/files/poketool/trainer/trpoke/narc_0803.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0803.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0804.bin b/files/poketool/trainer/trpoke/narc_0804.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0804.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0805.bin b/files/poketool/trainer/trpoke/narc_0805.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0805.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0806.bin b/files/poketool/trainer/trpoke/narc_0806.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0806.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0807.bin b/files/poketool/trainer/trpoke/narc_0807.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0807.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0808.bin b/files/poketool/trainer/trpoke/narc_0808.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0808.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0809.bin b/files/poketool/trainer/trpoke/narc_0809.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0809.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0810.bin b/files/poketool/trainer/trpoke/narc_0810.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0810.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0811.bin b/files/poketool/trainer/trpoke/narc_0811.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0811.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0812.bin b/files/poketool/trainer/trpoke/narc_0812.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0812.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0813.bin b/files/poketool/trainer/trpoke/narc_0813.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0813.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0814.bin b/files/poketool/trainer/trpoke/narc_0814.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0814.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0815.bin b/files/poketool/trainer/trpoke/narc_0815.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0815.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0816.bin b/files/poketool/trainer/trpoke/narc_0816.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0816.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0817.bin b/files/poketool/trainer/trpoke/narc_0817.bin
deleted file mode 100644
index 96b135e7..00000000
--- a/files/poketool/trainer/trpoke/narc_0817.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0818.bin b/files/poketool/trainer/trpoke/narc_0818.bin
deleted file mode 100644
index 5cbe82cf..00000000
--- a/files/poketool/trainer/trpoke/narc_0818.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0819.bin b/files/poketool/trainer/trpoke/narc_0819.bin
deleted file mode 100644
index 88a0b472..00000000
--- a/files/poketool/trainer/trpoke/narc_0819.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0820.bin b/files/poketool/trainer/trpoke/narc_0820.bin
deleted file mode 100644
index 7c01546e..00000000
--- a/files/poketool/trainer/trpoke/narc_0820.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0821.bin b/files/poketool/trainer/trpoke/narc_0821.bin
deleted file mode 100644
index cc5826cb..00000000
--- a/files/poketool/trainer/trpoke/narc_0821.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0822.bin b/files/poketool/trainer/trpoke/narc_0822.bin
deleted file mode 100644
index 34426ae6..00000000
--- a/files/poketool/trainer/trpoke/narc_0822.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0823.bin b/files/poketool/trainer/trpoke/narc_0823.bin
deleted file mode 100644
index 0ae501c4..00000000
--- a/files/poketool/trainer/trpoke/narc_0823.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0824.bin b/files/poketool/trainer/trpoke/narc_0824.bin
deleted file mode 100644
index b019b0ef..00000000
--- a/files/poketool/trainer/trpoke/narc_0824.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0825.bin b/files/poketool/trainer/trpoke/narc_0825.bin
deleted file mode 100644
index 3510d52c..00000000
--- a/files/poketool/trainer/trpoke/narc_0825.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0826.bin b/files/poketool/trainer/trpoke/narc_0826.bin
deleted file mode 100644
index 67a45289..00000000
--- a/files/poketool/trainer/trpoke/narc_0826.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0827.bin b/files/poketool/trainer/trpoke/narc_0827.bin
deleted file mode 100644
index b9966e3c..00000000
--- a/files/poketool/trainer/trpoke/narc_0827.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0828.bin b/files/poketool/trainer/trpoke/narc_0828.bin
deleted file mode 100644
index d053e146..00000000
--- a/files/poketool/trainer/trpoke/narc_0828.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0829.bin b/files/poketool/trainer/trpoke/narc_0829.bin
deleted file mode 100644
index 9324fef5..00000000
--- a/files/poketool/trainer/trpoke/narc_0829.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0830.bin b/files/poketool/trainer/trpoke/narc_0830.bin
deleted file mode 100644
index 4a7827a2..00000000
--- a/files/poketool/trainer/trpoke/narc_0830.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0831.bin b/files/poketool/trainer/trpoke/narc_0831.bin
deleted file mode 100644
index 912ef1cd..00000000
--- a/files/poketool/trainer/trpoke/narc_0831.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0832.bin b/files/poketool/trainer/trpoke/narc_0832.bin
deleted file mode 100644
index 2f41a84f..00000000
--- a/files/poketool/trainer/trpoke/narc_0832.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0833.bin b/files/poketool/trainer/trpoke/narc_0833.bin
deleted file mode 100644
index 4c7e61f9..00000000
--- a/files/poketool/trainer/trpoke/narc_0833.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0834.bin b/files/poketool/trainer/trpoke/narc_0834.bin
deleted file mode 100644
index 6285c622..00000000
--- a/files/poketool/trainer/trpoke/narc_0834.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0835.bin b/files/poketool/trainer/trpoke/narc_0835.bin
deleted file mode 100644
index 07b67525..00000000
--- a/files/poketool/trainer/trpoke/narc_0835.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0836.bin b/files/poketool/trainer/trpoke/narc_0836.bin
deleted file mode 100644
index fd6d3b87..00000000
--- a/files/poketool/trainer/trpoke/narc_0836.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0837.bin b/files/poketool/trainer/trpoke/narc_0837.bin
deleted file mode 100644
index 84cfd713..00000000
--- a/files/poketool/trainer/trpoke/narc_0837.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0838.bin b/files/poketool/trainer/trpoke/narc_0838.bin
deleted file mode 100644
index f679f39d..00000000
--- a/files/poketool/trainer/trpoke/narc_0838.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0839.bin b/files/poketool/trainer/trpoke/narc_0839.bin
deleted file mode 100644
index 6cef6043..00000000
--- a/files/poketool/trainer/trpoke/narc_0839.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0840.bin b/files/poketool/trainer/trpoke/narc_0840.bin
deleted file mode 100644
index 11a084ae..00000000
--- a/files/poketool/trainer/trpoke/narc_0840.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0841.bin b/files/poketool/trainer/trpoke/narc_0841.bin
deleted file mode 100644
index 0a10ae87..00000000
--- a/files/poketool/trainer/trpoke/narc_0841.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0842.bin b/files/poketool/trainer/trpoke/narc_0842.bin
deleted file mode 100644
index c5ce5078..00000000
--- a/files/poketool/trainer/trpoke/narc_0842.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0843.bin b/files/poketool/trainer/trpoke/narc_0843.bin
deleted file mode 100644
index fc2e717a..00000000
--- a/files/poketool/trainer/trpoke/narc_0843.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0844.bin b/files/poketool/trainer/trpoke/narc_0844.bin
deleted file mode 100644
index 17ac8a10..00000000
--- a/files/poketool/trainer/trpoke/narc_0844.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0845.bin b/files/poketool/trainer/trpoke/narc_0845.bin
deleted file mode 100644
index 3b3e6f81..00000000
--- a/files/poketool/trainer/trpoke/narc_0845.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0846.bin b/files/poketool/trainer/trpoke/narc_0846.bin
deleted file mode 100644
index 65079747..00000000
--- a/files/poketool/trainer/trpoke/narc_0846.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0847.bin b/files/poketool/trainer/trpoke/narc_0847.bin
deleted file mode 100644
index 85c80779..00000000
--- a/files/poketool/trainer/trpoke/narc_0847.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0848.bin b/files/poketool/trainer/trpoke/narc_0848.bin
deleted file mode 100644
index b63dd523..00000000
--- a/files/poketool/trainer/trpoke/narc_0848.bin
+++ /dev/null
Binary files differ
diff --git a/files/poketool/trainer/trpoke/narc_0849.bin b/files/poketool/trainer/trpoke/narc_0849.bin
deleted file mode 100644
index c7e1ac95..00000000
--- a/files/poketool/trainer/trpoke/narc_0849.bin
+++ /dev/null
Binary files differ
diff --git a/filesystem.mk b/filesystem.mk
index 7471d644..33d82c23 100644
--- a/filesystem.mk
+++ b/filesystem.mk
@@ -290,16 +290,27 @@ O2NARC_TARGETS := \
files/poketool/waza/waza_tbl.narc \
files/itemtool/itemdata/item_data.narc \
files/itemtool/itemdata/nuts_data.narc \
+ files/poketool/trainer/trdata.narc \
+
+ALL_O2NARC_TARGETS := $(O2NARC_TARGETS) \
+ files/poketool/trainer/trpoke.narc
files/poketool/personal/pms.narc: O2NARCFLAGS = -f
files/itemtool/itemdata/item_data.narc: O2NARCFLAGS = -p 0xFF
ifeq (,$(NODEP))
-$(O2NARC_TARGETS): dep = $(shell $(SCANINC) -I include -I include-mw -I arm9/lib/include $(patsubst %.narc,%.json.txt,$@))
+$(ALL_O2NARC_TARGETS): dep = $(shell $(SCANINC) -I include -I include-mw -I arm9/lib/include $(patsubst %.narc,%.json.txt,$@))
else
-$(O2NARC_TARGETS): dep :=
+$(ALL_O2NARC_TARGETS): dep :=
endif
+## This specific target shares its source JSON with trdata.narc
+files/poketool/trainer/trpoke.narc: %/trpoke.narc: %/trdata.json %/trpoke.json.txt $$(dep)
+ $(JSONPROC) $< $(word 2,$^) $*/trpoke.c
+ $(CC) $(CFLAGS) -c -o $*/trpoke.o $*/trpoke.c
+ $(O2NARC) $(O2NARCFLAGS) $*/trpoke.o $@
+ @$(RM) $*/trpoke.o $*/trpoke.c
+
$(O2NARC_TARGETS): %.narc: %.json %.json.txt $$(dep)
$(JSONPROC) $*.json $*.json.txt $*.c
$(CC) $(CFLAGS) -c -o $*.o $*.c
diff --git a/include/trainer_data.h b/include/trainer_data.h
new file mode 100644
index 00000000..3abf9a9f
--- /dev/null
+++ b/include/trainer_data.h
@@ -0,0 +1,70 @@
+#ifndef POKEDIAMOND_TRAINER_DATA_H
+#define POKEDIAMOND_TRAINER_DATA_H
+
+#include "global.h"
+#include "constants/pokemon.h"
+
+struct TrainerMonSpecies
+{
+ u16 difficulty;
+ u16 level;
+ u16 species;
+};
+
+struct TrainerMonSpeciesMoves
+{
+ u16 difficulty;
+ u16 level;
+ u16 moves[MON_MOVES];
+};
+
+struct TrainerMonSpeciesItem
+{
+ u16 difficulty;
+ u16 level;
+ u16 species;
+ u16 item;
+};
+
+struct TrainerMonSpeciesItemMoves
+{
+ u16 difficulty;
+ u16 level;
+ u16 item;
+ u16 moves[MON_MOVES];
+};
+
+union TrainerMon
+{
+ struct TrainerMonSpecies species;
+ struct TrainerMonSpeciesMoves species_moves;
+ struct TrainerMonSpeciesItem species_item;
+ struct TrainerMonSpeciesItemMoves species_item_moves;
+};
+
+#define TRTYPE_MON 0
+#define TRTYPE_MON_MOVES 1
+#define TRTYPE_MON_ITEM 2
+#define TRTYPE_MON_ITEM_MOVES 3
+
+struct TrainerData
+{
+ u8 trainerType;
+ u8 trainerClass;
+ u8 unk_2;
+ u8 npoke;
+ u16 items[4];
+ u32 unk_C;
+ u32 unk_10;
+};
+
+struct EnemyTrainerSet
+{
+ u32 flags;
+ struct PlayerParty * parties[4];
+ u16 field_14[4];
+ u32 trainer_idxs[4];
+ struct TrainerData datas[4];
+};
+
+#endif //POKEDIAMOND_TRAINER_DATA_H
diff --git a/tools/jsonproc/inja.hpp b/tools/jsonproc/inja.hpp
index d5bf5bcb..26a63737 100644
--- a/tools/jsonproc/inja.hpp
+++ b/tools/jsonproc/inja.hpp
@@ -1,81 +1,29 @@
-// MIT License
-
-// Copyright (c) 2018 lbersch
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-
-// ---
-
-
-// Copyright (c) 2009-2018 FIRST
-// All rights reserved.
-
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are met:
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright
-// notice, this list of conditions and the following disclaimer in the
-// documentation and/or other materials provided with the distribution.
-// * Neither the name of the FIRST nor the
-// names of its contributors may be used to endorse or promote products
-// derived from this software without specific prior written permission.
-
-// THIS SOFTWARE IS PROVIDED BY FIRST AND CONTRIBUTORS``AS IS'' AND ANY
-// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-// WARRANTIES OF MERCHANTABILITY NONINFRINGEMENT AND FITNESS FOR A PARTICULAR
-// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL FIRST OR CONTRIBUTORS BE LIABLE FOR
-// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef PANTOR_INJA_HPP
-#define PANTOR_INJA_HPP
+// Copyright (c) 2020 Pantor. All rights reserved.
-#include <functional>
-#include <iostream>
-#include <map>
-#include <memory>
-#include <sstream>
-#include <string>
-#include <vector>
+#ifndef INCLUDE_INJA_INJA_HPP_
+#define INCLUDE_INJA_INJA_HPP_
#include <nlohmann/json.hpp>
// #include "environment.hpp"
-#ifndef PANTOR_INJA_ENVIRONMENT_HPP
-#define PANTOR_INJA_ENVIRONMENT_HPP
+// Copyright (c) 2019 Pantor. All rights reserved.
+
+#ifndef INCLUDE_INJA_ENVIRONMENT_HPP_
+#define INCLUDE_INJA_ENVIRONMENT_HPP_
-#include <memory>
#include <fstream>
+#include <iostream>
+#include <memory>
#include <sstream>
#include <string>
#include <nlohmann/json.hpp>
// #include "config.hpp"
-#ifndef PANTOR_INJA_CONFIG_HPP
-#define PANTOR_INJA_CONFIG_HPP
+// Copyright (c) 2019 Pantor. All rights reserved.
+
+#ifndef INCLUDE_INJA_CONFIG_HPP_
+#define INCLUDE_INJA_CONFIG_HPP_
#include <functional>
#include <string>
@@ -94,94 +42,98 @@
#ifndef NONSTD_SV_LITE_H_INCLUDED
#define NONSTD_SV_LITE_H_INCLUDED
-#define string_view_lite_MAJOR 1
-#define string_view_lite_MINOR 1
-#define string_view_lite_PATCH 0
+#define string_view_lite_MAJOR 1
+#define string_view_lite_MINOR 4
+#define string_view_lite_PATCH 0
-#define string_view_lite_VERSION nssv_STRINGIFY(string_view_lite_MAJOR) "." nssv_STRINGIFY(string_view_lite_MINOR) "." nssv_STRINGIFY(string_view_lite_PATCH)
+#define string_view_lite_VERSION \
+ nssv_STRINGIFY(string_view_lite_MAJOR) "." nssv_STRINGIFY(string_view_lite_MINOR) "." nssv_STRINGIFY( \
+ string_view_lite_PATCH)
-#define nssv_STRINGIFY( x ) nssv_STRINGIFY_( x )
-#define nssv_STRINGIFY_( x ) #x
+#define nssv_STRINGIFY(x) nssv_STRINGIFY_(x)
+#define nssv_STRINGIFY_(x) #x
// string-view lite configuration:
-#define nssv_STRING_VIEW_DEFAULT 0
-#define nssv_STRING_VIEW_NONSTD 1
-#define nssv_STRING_VIEW_STD 2
+#define nssv_STRING_VIEW_DEFAULT 0
+#define nssv_STRING_VIEW_NONSTD 1
+#define nssv_STRING_VIEW_STD 2
-#if !defined( nssv_CONFIG_SELECT_STRING_VIEW )
-# define nssv_CONFIG_SELECT_STRING_VIEW ( nssv_HAVE_STD_STRING_VIEW ? nssv_STRING_VIEW_STD : nssv_STRING_VIEW_NONSTD )
+#if !defined(nssv_CONFIG_SELECT_STRING_VIEW)
+#define nssv_CONFIG_SELECT_STRING_VIEW (nssv_HAVE_STD_STRING_VIEW ? nssv_STRING_VIEW_STD : nssv_STRING_VIEW_NONSTD)
#endif
-#if defined( nssv_CONFIG_SELECT_STD_STRING_VIEW ) || defined( nssv_CONFIG_SELECT_NONSTD_STRING_VIEW )
-# error nssv_CONFIG_SELECT_STD_STRING_VIEW and nssv_CONFIG_SELECT_NONSTD_STRING_VIEW are deprecated and removed, please use nssv_CONFIG_SELECT_STRING_VIEW=nssv_STRING_VIEW_...
+#if defined(nssv_CONFIG_SELECT_STD_STRING_VIEW) || defined(nssv_CONFIG_SELECT_NONSTD_STRING_VIEW)
+#error nssv_CONFIG_SELECT_STD_STRING_VIEW and nssv_CONFIG_SELECT_NONSTD_STRING_VIEW are deprecated and removed, please use nssv_CONFIG_SELECT_STRING_VIEW=nssv_STRING_VIEW_...
#endif
-#ifndef nssv_CONFIG_STD_SV_OPERATOR
-# define nssv_CONFIG_STD_SV_OPERATOR 0
+#ifndef nssv_CONFIG_STD_SV_OPERATOR
+#define nssv_CONFIG_STD_SV_OPERATOR 0
#endif
-#ifndef nssv_CONFIG_USR_SV_OPERATOR
-# define nssv_CONFIG_USR_SV_OPERATOR 1
+#ifndef nssv_CONFIG_USR_SV_OPERATOR
+#define nssv_CONFIG_USR_SV_OPERATOR 1
#endif
-#ifdef nssv_CONFIG_CONVERSION_STD_STRING
-# define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS nssv_CONFIG_CONVERSION_STD_STRING
-# define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS nssv_CONFIG_CONVERSION_STD_STRING
+#ifdef nssv_CONFIG_CONVERSION_STD_STRING
+#define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS nssv_CONFIG_CONVERSION_STD_STRING
+#define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS nssv_CONFIG_CONVERSION_STD_STRING
#endif
-#ifndef nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS
-# define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS 1
+#ifndef nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS
+#define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS 1
#endif
-#ifndef nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
-# define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS 1
+#ifndef nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
+#define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS 1
#endif
// Control presence of exception handling (try and auto discover):
#ifndef nssv_CONFIG_NO_EXCEPTIONS
-# if defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)
-# define nssv_CONFIG_NO_EXCEPTIONS 0
-# else
-# define nssv_CONFIG_NO_EXCEPTIONS 1
-# endif
+#if defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)
+#define nssv_CONFIG_NO_EXCEPTIONS 0
+#else
+#define nssv_CONFIG_NO_EXCEPTIONS 1
+#endif
#endif
// C++ language version detection (C++20 is speculative):
// Note: VC14.0/1900 (VS2015) lacks too much from C++14.
-#ifndef nssv_CPLUSPLUS
-# if defined(_MSVC_LANG ) && !defined(__clang__)
-# define nssv_CPLUSPLUS (_MSC_VER == 1900 ? 201103L : _MSVC_LANG )
-# else
-# define nssv_CPLUSPLUS __cplusplus
-# endif
+#ifndef nssv_CPLUSPLUS
+#if defined(_MSVC_LANG) && !defined(__clang__)
+#define nssv_CPLUSPLUS (_MSC_VER == 1900 ? 201103L : _MSVC_LANG)
+#else
+#define nssv_CPLUSPLUS __cplusplus
+#endif
#endif
-#define nssv_CPP98_OR_GREATER ( nssv_CPLUSPLUS >= 199711L )
-#define nssv_CPP11_OR_GREATER ( nssv_CPLUSPLUS >= 201103L )
-#define nssv_CPP11_OR_GREATER_ ( nssv_CPLUSPLUS >= 201103L )
-#define nssv_CPP14_OR_GREATER ( nssv_CPLUSPLUS >= 201402L )
-#define nssv_CPP17_OR_GREATER ( nssv_CPLUSPLUS >= 201703L )
-#define nssv_CPP20_OR_GREATER ( nssv_CPLUSPLUS >= 202000L )
+#define nssv_CPP98_OR_GREATER (nssv_CPLUSPLUS >= 199711L)
+#define nssv_CPP11_OR_GREATER (nssv_CPLUSPLUS >= 201103L)
+#define nssv_CPP11_OR_GREATER_ (nssv_CPLUSPLUS >= 201103L)
+#define nssv_CPP14_OR_GREATER (nssv_CPLUSPLUS >= 201402L)
+#define nssv_CPP17_OR_GREATER (nssv_CPLUSPLUS >= 201703L)
+#define nssv_CPP20_OR_GREATER (nssv_CPLUSPLUS >= 202000L)
// use C++17 std::string_view if available and requested:
-#if nssv_CPP17_OR_GREATER && defined(__has_include )
-# if __has_include( <string_view> )
-# define nssv_HAVE_STD_STRING_VIEW 1
-# else
-# define nssv_HAVE_STD_STRING_VIEW 0
-# endif
+#if nssv_CPP17_OR_GREATER && defined(__has_include)
+#if __has_include(<string_view> )
+#define nssv_HAVE_STD_STRING_VIEW 1
#else
-# define nssv_HAVE_STD_STRING_VIEW 0
+#define nssv_HAVE_STD_STRING_VIEW 0
+#endif
+#else
+#define nssv_HAVE_STD_STRING_VIEW 0
#endif
-#define nssv_USES_STD_STRING_VIEW ( (nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_STD) || ((nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_DEFAULT) && nssv_HAVE_STD_STRING_VIEW) )
+#define nssv_USES_STD_STRING_VIEW \
+ ((nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_STD) || \
+ ((nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_DEFAULT) && nssv_HAVE_STD_STRING_VIEW))
-#define nssv_HAVE_STARTS_WITH ( nssv_CPP20_OR_GREATER || !nssv_USES_STD_STRING_VIEW )
-#define nssv_HAVE_ENDS_WITH nssv_HAVE_STARTS_WITH
+#define nssv_HAVE_STARTS_WITH (nssv_CPP20_OR_GREATER || !nssv_USES_STD_STRING_VIEW)
+#define nssv_HAVE_ENDS_WITH nssv_HAVE_STARTS_WITH
//
// Use C++17 std::string_view:
@@ -197,18 +149,15 @@
namespace nonstd {
-template< class CharT, class Traits, class Allocator = std::allocator<CharT> >
-std::basic_string<CharT, Traits, Allocator>
-to_string( std::basic_string_view<CharT, Traits> v, Allocator const & a = Allocator() )
-{
- return std::basic_string<CharT,Traits, Allocator>( v.begin(), v.end(), a );
+template <class CharT, class Traits, class Allocator = std::allocator<CharT>>
+std::basic_string<CharT, Traits, Allocator> to_string(std::basic_string_view<CharT, Traits> v,
+ Allocator const &a = Allocator()) {
+ return std::basic_string<CharT, Traits, Allocator>(v.begin(), v.end(), a);
}
-template< class CharT, class Traits, class Allocator >
-std::basic_string_view<CharT, Traits>
-to_string_view( std::basic_string<CharT, Traits, Allocator> const & s )
-{
- return std::basic_string_view<CharT, Traits>( s.data(), s.size() );
+template <class CharT, class Traits, class Allocator>
+std::basic_string_view<CharT, Traits> to_string_view(std::basic_string<CharT, Traits, Allocator> const &s) {
+ return std::basic_string_view<CharT, Traits>(s.data(), s.size());
}
// Literal operators sv and _sv:
@@ -224,28 +173,28 @@ using namespace std::literals::string_view_literals;
inline namespace literals {
inline namespace string_view_literals {
-
-constexpr std::string_view operator "" _sv( const char* str, size_t len ) noexcept // (1)
+constexpr std::string_view operator"" _sv(const char *str, size_t len) noexcept // (1)
{
- return std::string_view{ str, len };
+ return std::string_view {str, len};
}
-constexpr std::u16string_view operator "" _sv( const char16_t* str, size_t len ) noexcept // (2)
+constexpr std::u16string_view operator"" _sv(const char16_t *str, size_t len) noexcept // (2)
{
- return std::u16string_view{ str, len };
+ return std::u16string_view {str, len};
}
-constexpr std::u32string_view operator "" _sv( const char32_t* str, size_t len ) noexcept // (3)
+constexpr std::u32string_view operator"" _sv(const char32_t *str, size_t len) noexcept // (3)
{
- return std::u32string_view{ str, len };
+ return std::u32string_view {str, len};
}
-constexpr std::wstring_view operator "" _sv( const wchar_t* str, size_t len ) noexcept // (4)
+constexpr std::wstring_view operator"" _sv(const wchar_t *str, size_t len) noexcept // (4)
{
- return std::wstring_view{ str, len };
+ return std::wstring_view {str, len};
}
-}} // namespace literals::string_view_literals
+} // namespace string_view_literals
+} // namespace literals
#endif // nssv_CONFIG_USR_SV_OPERATOR
@@ -255,11 +204,11 @@ constexpr std::wstring_view operator "" _sv( const wchar_t* str, size_t len ) no
namespace nonstd {
+using std::basic_string_view;
using std::string_view;
-using std::wstring_view;
using std::u16string_view;
using std::u32string_view;
-using std::basic_string_view;
+using std::wstring_view;
// literal "sv" and "_sv", see above
@@ -293,115 +242,117 @@ using std::operator<<;
// MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)
// MSVC++ 14.1 _MSC_VER >= 1910 (Visual Studio 2017)
-#if defined(_MSC_VER ) && !defined(__clang__)
-# define nssv_COMPILER_MSVC_VER (_MSC_VER )
-# define nssv_COMPILER_MSVC_VERSION (_MSC_VER / 10 - 10 * ( 5 + (_MSC_VER < 1900 ) ) )
+#if defined(_MSC_VER) && !defined(__clang__)
+#define nssv_COMPILER_MSVC_VER (_MSC_VER)
+#define nssv_COMPILER_MSVC_VERSION (_MSC_VER / 10 - 10 * (5 + (_MSC_VER < 1900)))
#else
-# define nssv_COMPILER_MSVC_VER 0
-# define nssv_COMPILER_MSVC_VERSION 0
+#define nssv_COMPILER_MSVC_VER 0
+#define nssv_COMPILER_MSVC_VERSION 0
#endif
-#define nssv_COMPILER_VERSION( major, minor, patch ) (10 * ( 10 * major + minor) + patch)
+#define nssv_COMPILER_VERSION(major, minor, patch) (10 * (10 * (major) + (minor)) + (patch))
#if defined(__clang__)
-# define nssv_COMPILER_CLANG_VERSION nssv_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
+#define nssv_COMPILER_CLANG_VERSION nssv_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
#else
-# define nssv_COMPILER_CLANG_VERSION 0
+#define nssv_COMPILER_CLANG_VERSION 0
#endif
#if defined(__GNUC__) && !defined(__clang__)
-# define nssv_COMPILER_GNUC_VERSION nssv_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
+#define nssv_COMPILER_GNUC_VERSION nssv_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
#else
-# define nssv_COMPILER_GNUC_VERSION 0
+#define nssv_COMPILER_GNUC_VERSION 0
#endif
// half-open range [lo..hi):
-#define nssv_BETWEEN( v, lo, hi ) ( (lo) <= (v) && (v) < (hi) )
+#define nssv_BETWEEN(v, lo, hi) ((lo) <= (v) && (v) < (hi))
// Presence of language and library features:
#ifdef _HAS_CPP0X
-# define nssv_HAS_CPP0X _HAS_CPP0X
+#define nssv_HAS_CPP0X _HAS_CPP0X
#else
-# define nssv_HAS_CPP0X 0
+#define nssv_HAS_CPP0X 0
#endif
// Unless defined otherwise below, consider VC14 as C++11 for variant-lite:
#if nssv_COMPILER_MSVC_VER >= 1900
-# undef nssv_CPP11_OR_GREATER
-# define nssv_CPP11_OR_GREATER 1
+#undef nssv_CPP11_OR_GREATER
+#define nssv_CPP11_OR_GREATER 1
#endif
-#define nssv_CPP11_90 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1500)
-#define nssv_CPP11_100 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1600)
-#define nssv_CPP11_110 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1700)
-#define nssv_CPP11_120 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1800)
-#define nssv_CPP11_140 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1900)
-#define nssv_CPP11_141 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1910)
+#define nssv_CPP11_90 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1500)
+#define nssv_CPP11_100 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1600)
+#define nssv_CPP11_110 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1700)
+#define nssv_CPP11_120 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1800)
+#define nssv_CPP11_140 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1900)
+#define nssv_CPP11_141 (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1910)
-#define nssv_CPP14_000 (nssv_CPP14_OR_GREATER)
-#define nssv_CPP17_000 (nssv_CPP17_OR_GREATER)
+#define nssv_CPP14_000 (nssv_CPP14_OR_GREATER)
+#define nssv_CPP17_000 (nssv_CPP17_OR_GREATER)
// Presence of C++11 language features:
-#define nssv_HAVE_CONSTEXPR_11 nssv_CPP11_140
-#define nssv_HAVE_EXPLICIT_CONVERSION nssv_CPP11_140
-#define nssv_HAVE_INLINE_NAMESPACE nssv_CPP11_140
-#define nssv_HAVE_NOEXCEPT nssv_CPP11_140
-#define nssv_HAVE_NULLPTR nssv_CPP11_100
-#define nssv_HAVE_REF_QUALIFIER nssv_CPP11_140
-#define nssv_HAVE_UNICODE_LITERALS nssv_CPP11_140
+#define nssv_HAVE_CONSTEXPR_11 nssv_CPP11_140
+#define nssv_HAVE_EXPLICIT_CONVERSION nssv_CPP11_140
+#define nssv_HAVE_INLINE_NAMESPACE nssv_CPP11_140
+#define nssv_HAVE_NOEXCEPT nssv_CPP11_140
+#define nssv_HAVE_NULLPTR nssv_CPP11_100
+#define nssv_HAVE_REF_QUALIFIER nssv_CPP11_140
+#define nssv_HAVE_UNICODE_LITERALS nssv_CPP11_140
#define nssv_HAVE_USER_DEFINED_LITERALS nssv_CPP11_140
-#define nssv_HAVE_WCHAR16_T nssv_CPP11_100
-#define nssv_HAVE_WCHAR32_T nssv_CPP11_100
+#define nssv_HAVE_WCHAR16_T nssv_CPP11_100
+#define nssv_HAVE_WCHAR32_T nssv_CPP11_100
-#if ! ( ( nssv_CPP11 && nssv_COMPILER_CLANG_VERSION ) || nssv_BETWEEN( nssv_COMPILER_CLANG_VERSION, 300, 400 ) )
-# define nssv_HAVE_STD_DEFINED_LITERALS nssv_CPP11_140
+#if !((nssv_CPP11_OR_GREATER && nssv_COMPILER_CLANG_VERSION) || nssv_BETWEEN(nssv_COMPILER_CLANG_VERSION, 300, 400))
+#define nssv_HAVE_STD_DEFINED_LITERALS nssv_CPP11_140
+#else
+#define nssv_HAVE_STD_DEFINED_LITERALS 0
#endif
// Presence of C++14 language features:
-#define nssv_HAVE_CONSTEXPR_14 nssv_CPP14_000
+#define nssv_HAVE_CONSTEXPR_14 nssv_CPP14_000
// Presence of C++17 language features:
-#define nssv_HAVE_NODISCARD nssv_CPP17_000
+#define nssv_HAVE_NODISCARD nssv_CPP17_000
// Presence of C++ library features:
-#define nssv_HAVE_STD_HASH nssv_CPP11_120
+#define nssv_HAVE_STD_HASH nssv_CPP11_120
// C++ feature usage:
#if nssv_HAVE_CONSTEXPR_11
-# define nssv_constexpr constexpr
+#define nssv_constexpr constexpr
#else
-# define nssv_constexpr /*constexpr*/
+#define nssv_constexpr /*constexpr*/
#endif
-#if nssv_HAVE_CONSTEXPR_14
-# define nssv_constexpr14 constexpr
+#if nssv_HAVE_CONSTEXPR_14
+#define nssv_constexpr14 constexpr
#else
-# define nssv_constexpr14 /*constexpr*/
+#define nssv_constexpr14 /*constexpr*/
#endif
#if nssv_HAVE_EXPLICIT_CONVERSION
-# define nssv_explicit explicit
+#define nssv_explicit explicit
#else
-# define nssv_explicit /*explicit*/
+#define nssv_explicit /*explicit*/
#endif
#if nssv_HAVE_INLINE_NAMESPACE
-# define nssv_inline_ns inline
+#define nssv_inline_ns inline
#else
-# define nssv_inline_ns /*inline*/
+#define nssv_inline_ns /*inline*/
#endif
#if nssv_HAVE_NOEXCEPT
-# define nssv_noexcept noexcept
+#define nssv_noexcept noexcept
#else
-# define nssv_noexcept /*noexcept*/
+#define nssv_noexcept /*noexcept*/
#endif
//#if nssv_HAVE_REF_QUALIFIER
@@ -413,15 +364,15 @@ using std::operator<<;
//#endif
#if nssv_HAVE_NULLPTR
-# define nssv_nullptr nullptr
+#define nssv_nullptr nullptr
#else
-# define nssv_nullptr NULL
+#define nssv_nullptr NULL
#endif
#if nssv_HAVE_NODISCARD
-# define nssv_nodiscard [[nodiscard]]
+#define nssv_nodiscard [[nodiscard]]
#else
-# define nssv_nodiscard /*[[nodiscard]]*/
+#define nssv_nodiscard /*[[nodiscard]]*/
#endif
// Additional includes:
@@ -431,45 +382,45 @@ using std::operator<<;
#include <iterator>
#include <limits>
#include <ostream>
-#include <string> // std::char_traits<>
+#include <string> // std::char_traits<>
-#if ! nssv_CONFIG_NO_EXCEPTIONS
-# include <stdexcept>
+#if !nssv_CONFIG_NO_EXCEPTIONS
+#include <stdexcept>
#endif
#if nssv_CPP11_OR_GREATER
-# include <type_traits>
+#include <type_traits>
#endif
// Clang, GNUC, MSVC warning suppression macros:
#if defined(__clang__)
-# pragma clang diagnostic ignored "-Wreserved-user-defined-literal"
-# pragma clang diagnostic push
-# pragma clang diagnostic ignored "-Wuser-defined-literals"
+#pragma clang diagnostic ignored "-Wreserved-user-defined-literal"
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wuser-defined-literals"
#elif defined(__GNUC__)
-# pragma GCC diagnostic push
-# pragma GCC diagnostic ignored "-Wliteral-suffix"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wliteral-suffix"
#endif // __clang__
#if nssv_COMPILER_MSVC_VERSION >= 140
-# define nssv_SUPPRESS_MSGSL_WARNING(expr) [[gsl::suppress(expr)]]
-# define nssv_SUPPRESS_MSVC_WARNING(code, descr) __pragma(warning(suppress: code) )
-# define nssv_DISABLE_MSVC_WARNINGS(codes) __pragma(warning(push)) __pragma(warning(disable: codes))
+#define nssv_SUPPRESS_MSGSL_WARNING(expr) [[gsl::suppress(expr)]]
+#define nssv_SUPPRESS_MSVC_WARNING(code, descr) __pragma(warning(suppress : code))
+#define nssv_DISABLE_MSVC_WARNINGS(codes) __pragma(warning(push)) __pragma(warning(disable : codes))
#else
-# define nssv_SUPPRESS_MSGSL_WARNING(expr)
-# define nssv_SUPPRESS_MSVC_WARNING(code, descr)
-# define nssv_DISABLE_MSVC_WARNINGS(codes)
+#define nssv_SUPPRESS_MSGSL_WARNING(expr)
+#define nssv_SUPPRESS_MSVC_WARNING(code, descr)
+#define nssv_DISABLE_MSVC_WARNINGS(codes)
#endif
#if defined(__clang__)
-# define nssv_RESTORE_WARNINGS() _Pragma("clang diagnostic pop")
+#define nssv_RESTORE_WARNINGS() _Pragma("clang diagnostic pop")
#elif defined(__GNUC__)
-# define nssv_RESTORE_WARNINGS() _Pragma("GCC diagnostic pop")
+#define nssv_RESTORE_WARNINGS() _Pragma("GCC diagnostic pop")
#elif nssv_COMPILER_MSVC_VERSION >= 140
-# define nssv_RESTORE_WARNINGS() __pragma(warning(pop ))
+#define nssv_RESTORE_WARNINGS() __pragma(warning(pop))
#else
-# define nssv_RESTORE_WARNINGS()
+#define nssv_RESTORE_WARNINGS()
#endif
// Suppress the following MSVC (GSL) warnings:
@@ -479,418 +430,409 @@ using std::operator<<;
// use brace initialization, gsl::narrow_cast or gsl::narow
// - C26481: gsl::b.1 : don't use pointer arithmetic. Use span instead
-nssv_DISABLE_MSVC_WARNINGS( 4455 26481 26472 )
-//nssv_DISABLE_CLANG_WARNINGS( "-Wuser-defined-literals" )
-//nssv_DISABLE_GNUC_WARNINGS( -Wliteral-suffix )
+nssv_DISABLE_MSVC_WARNINGS(4455 26481 26472)
+ // nssv_DISABLE_CLANG_WARNINGS( "-Wuser-defined-literals" )
+ // nssv_DISABLE_GNUC_WARNINGS( -Wliteral-suffix )
-namespace nonstd { namespace sv_lite {
+ namespace nonstd {
+ namespace sv_lite {
-template
-<
- class CharT,
- class Traits = std::char_traits<CharT>
->
-class basic_string_view;
+#if nssv_CPP11_OR_GREATER
-//
-// basic_string_view:
-//
+ namespace detail {
-template
-<
- class CharT,
- class Traits /* = std::char_traits<CharT> */
->
-class basic_string_view
-{
-public:
+ // Expect tail call optimization to make length() non-recursive:
+
+ template <typename CharT> inline constexpr std::size_t length(CharT *s, std::size_t result = 0) {
+ return *s == '\0' ? result : length(s + 1, result + 1);
+ }
+
+ } // namespace detail
+
+#endif // nssv_CPP11_OR_GREATER
+
+ template <class CharT, class Traits = std::char_traits<CharT>> class basic_string_view;
+
+ //
+ // basic_string_view:
+ //
+
+ template <class CharT, class Traits /* = std::char_traits<CharT> */
+ >
+ class basic_string_view {
+ public:
// Member types:
typedef Traits traits_type;
- typedef CharT value_type;
+ typedef CharT value_type;
- typedef CharT * pointer;
- typedef CharT const * const_pointer;
- typedef CharT & reference;
- typedef CharT const & const_reference;
+ typedef CharT *pointer;
+ typedef CharT const *const_pointer;
+ typedef CharT &reference;
+ typedef CharT const &const_reference;
typedef const_pointer iterator;
typedef const_pointer const_iterator;
- typedef std::reverse_iterator< const_iterator > reverse_iterator;
- typedef std::reverse_iterator< const_iterator > const_reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> reverse_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- typedef std::size_t size_type;
- typedef std::ptrdiff_t difference_type;
+ typedef std::size_t size_type;
+ typedef std::ptrdiff_t difference_type;
// 24.4.2.1 Construction and assignment:
- nssv_constexpr basic_string_view() nssv_noexcept
- : data_( nssv_nullptr )
- , size_( 0 )
- {}
+ nssv_constexpr basic_string_view() nssv_noexcept : data_(nssv_nullptr), size_(0) {}
#if nssv_CPP11_OR_GREATER
- nssv_constexpr basic_string_view( basic_string_view const & other ) nssv_noexcept = default;
+ nssv_constexpr basic_string_view(basic_string_view const &other) nssv_noexcept = default;
#else
- nssv_constexpr basic_string_view( basic_string_view const & other ) nssv_noexcept
- : data_( other.data_)
- , size_( other.size_)
- {}
+ nssv_constexpr basic_string_view(basic_string_view const &other) nssv_noexcept : data_(other.data_),
+ size_(other.size_) {}
#endif
- nssv_constexpr basic_string_view( CharT const * s, size_type count )
- : data_( s )
- , size_( count )
- {}
+ nssv_constexpr basic_string_view(CharT const *s, size_type count) nssv_noexcept // non-standard noexcept
+ : data_(s),
+ size_(count) {}
- nssv_constexpr basic_string_view( CharT const * s)
- : data_( s )
- , size_( Traits::length(s) )
- {}
+ nssv_constexpr basic_string_view(CharT const *s) nssv_noexcept // non-standard noexcept
+ : data_(s)
+#if nssv_CPP17_OR_GREATER
+ ,
+ size_(Traits::length(s))
+#elif nssv_CPP11_OR_GREATER
+ ,
+ size_(detail::length(s))
+#else
+ ,
+ size_(Traits::length(s))
+#endif
+ {
+ }
// Assignment:
#if nssv_CPP11_OR_GREATER
- nssv_constexpr14 basic_string_view & operator=( basic_string_view const & other ) nssv_noexcept = default;
+ nssv_constexpr14 basic_string_view &operator=(basic_string_view const &other) nssv_noexcept = default;
#else
- nssv_constexpr14 basic_string_view & operator=( basic_string_view const & other ) nssv_noexcept
- {
- data_ = other.data_;
- size_ = other.size_;
- return *this;
+ nssv_constexpr14 basic_string_view &operator=(basic_string_view const &other) nssv_noexcept {
+ data_ = other.data_;
+ size_ = other.size_;
+ return *this;
}
#endif
// 24.4.2.2 Iterator support:
- nssv_constexpr const_iterator begin() const nssv_noexcept { return data_; }
- nssv_constexpr const_iterator end() const nssv_noexcept { return data_ + size_; }
+ nssv_constexpr const_iterator begin() const nssv_noexcept { return data_; }
+ nssv_constexpr const_iterator end() const nssv_noexcept { return data_ + size_; }
nssv_constexpr const_iterator cbegin() const nssv_noexcept { return begin(); }
- nssv_constexpr const_iterator cend() const nssv_noexcept { return end(); }
+ nssv_constexpr const_iterator cend() const nssv_noexcept { return end(); }
- nssv_constexpr const_reverse_iterator rbegin() const nssv_noexcept { return const_reverse_iterator( end() ); }
- nssv_constexpr const_reverse_iterator rend() const nssv_noexcept { return const_reverse_iterator( begin() ); }
+ nssv_constexpr const_reverse_iterator rbegin() const nssv_noexcept { return const_reverse_iterator(end()); }
+ nssv_constexpr const_reverse_iterator rend() const nssv_noexcept { return const_reverse_iterator(begin()); }
nssv_constexpr const_reverse_iterator crbegin() const nssv_noexcept { return rbegin(); }
- nssv_constexpr const_reverse_iterator crend() const nssv_noexcept { return rend(); }
+ nssv_constexpr const_reverse_iterator crend() const nssv_noexcept { return rend(); }
// 24.4.2.3 Capacity:
- nssv_constexpr size_type size() const nssv_noexcept { return size_; }
- nssv_constexpr size_type length() const nssv_noexcept { return size_; }
- nssv_constexpr size_type max_size() const nssv_noexcept { return (std::numeric_limits< size_type >::max)(); }
+ nssv_constexpr size_type size() const nssv_noexcept { return size_; }
+ nssv_constexpr size_type length() const nssv_noexcept { return size_; }
+ nssv_constexpr size_type max_size() const nssv_noexcept { return (std::numeric_limits<size_type>::max)(); }
// since C++20
- nssv_nodiscard nssv_constexpr bool empty() const nssv_noexcept
- {
- return 0 == size_;
- }
+ nssv_nodiscard nssv_constexpr bool empty() const nssv_noexcept { return 0 == size_; }
// 24.4.2.4 Element access:
- nssv_constexpr const_reference operator[]( size_type pos ) const
- {
- return data_at( pos );
- }
+ nssv_constexpr const_reference operator[](size_type pos) const { return data_at(pos); }
- nssv_constexpr14 const_reference at( size_type pos ) const
- {
+ nssv_constexpr14 const_reference at(size_type pos) const {
#if nssv_CONFIG_NO_EXCEPTIONS
- assert( pos < size() );
+ assert(pos < size());
#else
- if ( pos >= size() )
- {
- throw std::out_of_range("nonst::string_view::at()");
- }
+ if (pos >= size()) {
+ throw std::out_of_range("nonstd::string_view::at()");
+ }
#endif
- return data_at( pos );
+ return data_at(pos);
}
- nssv_constexpr const_reference front() const { return data_at( 0 ); }
- nssv_constexpr const_reference back() const { return data_at( size() - 1 ); }
+ nssv_constexpr const_reference front() const { return data_at(0); }
+ nssv_constexpr const_reference back() const { return data_at(size() - 1); }
- nssv_constexpr const_pointer data() const nssv_noexcept { return data_; }
+ nssv_constexpr const_pointer data() const nssv_noexcept { return data_; }
// 24.4.2.5 Modifiers:
- nssv_constexpr14 void remove_prefix( size_type n )
- {
- assert( n <= size() );
- data_ += n;
- size_ -= n;
+ nssv_constexpr14 void remove_prefix(size_type n) {
+ assert(n <= size());
+ data_ += n;
+ size_ -= n;
}
- nssv_constexpr14 void remove_suffix( size_type n )
- {
- assert( n <= size() );
- size_ -= n;
+ nssv_constexpr14 void remove_suffix(size_type n) {
+ assert(n <= size());
+ size_ -= n;
}
- nssv_constexpr14 void swap( basic_string_view & other ) nssv_noexcept
- {
- using std::swap;
- swap( data_, other.data_ );
- swap( size_, other.size_ );
+ nssv_constexpr14 void swap(basic_string_view &other) nssv_noexcept {
+ using std::swap;
+ swap(data_, other.data_);
+ swap(size_, other.size_);
}
// 24.4.2.6 String operations:
- size_type copy( CharT * dest, size_type n, size_type pos = 0 ) const
- {
+ size_type copy(CharT *dest, size_type n, size_type pos = 0) const {
#if nssv_CONFIG_NO_EXCEPTIONS
- assert( pos <= size() );
+ assert(pos <= size());
#else
- if ( pos > size() )
- {
- throw std::out_of_range("nonst::string_view::copy()");
- }
+ if (pos > size()) {
+ throw std::out_of_range("nonstd::string_view::copy()");
+ }
#endif
- const size_type rlen = (std::min)( n, size() - pos );
+ const size_type rlen = (std::min)(n, size() - pos);
- (void) Traits::copy( dest, data() + pos, rlen );
+ (void)Traits::copy(dest, data() + pos, rlen);
- return rlen;
+ return rlen;
}
- nssv_constexpr14 basic_string_view substr( size_type pos = 0, size_type n = npos ) const
- {
+ nssv_constexpr14 basic_string_view substr(size_type pos = 0, size_type n = npos) const {
#if nssv_CONFIG_NO_EXCEPTIONS
- assert( pos <= size() );
+ assert(pos <= size());
#else
- if ( pos > size() )
- {
- throw std::out_of_range("nonst::string_view::substr()");
- }
+ if (pos > size()) {
+ throw std::out_of_range("nonstd::string_view::substr()");
+ }
#endif
- return basic_string_view( data() + pos, (std::min)( n, size() - pos ) );
+ return basic_string_view(data() + pos, (std::min)(n, size() - pos));
}
// compare(), 6x:
- nssv_constexpr14 int compare( basic_string_view other ) const nssv_noexcept // (1)
+ nssv_constexpr14 int compare(basic_string_view other) const nssv_noexcept // (1)
{
- if ( const int result = Traits::compare( data(), other.data(), (std::min)( size(), other.size() ) ) )
- return result;
+ if (const int result = Traits::compare(data(), other.data(), (std::min)(size(), other.size()))) {
+ return result;
+ }
- return size() == other.size() ? 0 : size() < other.size() ? -1 : 1;
+ return size() == other.size() ? 0 : size() < other.size() ? -1 : 1;
}
- nssv_constexpr int compare( size_type pos1, size_type n1, basic_string_view other ) const // (2)
+ nssv_constexpr int compare(size_type pos1, size_type n1, basic_string_view other) const // (2)
{
- return substr( pos1, n1 ).compare( other );
+ return substr(pos1, n1).compare(other);
}
- nssv_constexpr int compare( size_type pos1, size_type n1, basic_string_view other, size_type pos2, size_type n2 ) const // (3)
+ nssv_constexpr int compare(size_type pos1, size_type n1, basic_string_view other, size_type pos2,
+ size_type n2) const // (3)
{
- return substr( pos1, n1 ).compare( other.substr( pos2, n2 ) );
+ return substr(pos1, n1).compare(other.substr(pos2, n2));
}
- nssv_constexpr int compare( CharT const * s ) const // (4)
+ nssv_constexpr int compare(CharT const *s) const // (4)
{
- return compare( basic_string_view( s ) );
+ return compare(basic_string_view(s));
}
- nssv_constexpr int compare( size_type pos1, size_type n1, CharT const * s ) const // (5)
+ nssv_constexpr int compare(size_type pos1, size_type n1, CharT const *s) const // (5)
{
- return substr( pos1, n1 ).compare( basic_string_view( s ) );
+ return substr(pos1, n1).compare(basic_string_view(s));
}
- nssv_constexpr int compare( size_type pos1, size_type n1, CharT const * s, size_type n2 ) const // (6)
+ nssv_constexpr int compare(size_type pos1, size_type n1, CharT const *s, size_type n2) const // (6)
{
- return substr( pos1, n1 ).compare( basic_string_view( s, n2 ) );
+ return substr(pos1, n1).compare(basic_string_view(s, n2));
}
// 24.4.2.7 Searching:
// starts_with(), 3x, since C++20:
- nssv_constexpr bool starts_with( basic_string_view v ) const nssv_noexcept // (1)
+ nssv_constexpr bool starts_with(basic_string_view v) const nssv_noexcept // (1)
{
- return size() >= v.size() && compare( 0, v.size(), v ) == 0;
+ return size() >= v.size() && compare(0, v.size(), v) == 0;
}
- nssv_constexpr bool starts_with( CharT c ) const nssv_noexcept // (2)
+ nssv_constexpr bool starts_with(CharT c) const nssv_noexcept // (2)
{
- return starts_with( basic_string_view( &c, 1 ) );
+ return starts_with(basic_string_view(&c, 1));
}
- nssv_constexpr bool starts_with( CharT const * s ) const // (3)
+ nssv_constexpr bool starts_with(CharT const *s) const // (3)
{
- return starts_with( basic_string_view( s ) );
+ return starts_with(basic_string_view(s));
}
// ends_with(), 3x, since C++20:
- nssv_constexpr bool ends_with( basic_string_view v ) const nssv_noexcept // (1)
+ nssv_constexpr bool ends_with(basic_string_view v) const nssv_noexcept // (1)
{
- return size() >= v.size() && compare( size() - v.size(), npos, v ) == 0;
+ return size() >= v.size() && compare(size() - v.size(), npos, v) == 0;
}
- nssv_constexpr bool ends_with( CharT c ) const nssv_noexcept // (2)
+ nssv_constexpr bool ends_with(CharT c) const nssv_noexcept // (2)
{
- return ends_with( basic_string_view( &c, 1 ) );
+ return ends_with(basic_string_view(&c, 1));
}
- nssv_constexpr bool ends_with( CharT const * s ) const // (3)
+ nssv_constexpr bool ends_with(CharT const *s) const // (3)
{
- return ends_with( basic_string_view( s ) );
+ return ends_with(basic_string_view(s));
}
// find(), 4x:
- nssv_constexpr14 size_type find( basic_string_view v, size_type pos = 0 ) const nssv_noexcept // (1)
+ nssv_constexpr14 size_type find(basic_string_view v, size_type pos = 0) const nssv_noexcept // (1)
{
- return assert( v.size() == 0 || v.data() != nssv_nullptr )
- , pos >= size()
- ? npos
- : to_pos( std::search( cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq ) );
+ return assert(v.size() == 0 || v.data() != nssv_nullptr),
+ pos >= size() ? npos : to_pos(std::search(cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq));
}
- nssv_constexpr14 size_type find( CharT c, size_type pos = 0 ) const nssv_noexcept // (2)
+ nssv_constexpr14 size_type find(CharT c, size_type pos = 0) const nssv_noexcept // (2)
{
- return find( basic_string_view( &c, 1 ), pos );
+ return find(basic_string_view(&c, 1), pos);
}
- nssv_constexpr14 size_type find( CharT const * s, size_type pos, size_type n ) const // (3)
+ nssv_constexpr14 size_type find(CharT const *s, size_type pos, size_type n) const // (3)
{
- return find( basic_string_view( s, n ), pos );
+ return find(basic_string_view(s, n), pos);
}
- nssv_constexpr14 size_type find( CharT const * s, size_type pos = 0 ) const // (4)
+ nssv_constexpr14 size_type find(CharT const *s, size_type pos = 0) const // (4)
{
- return find( basic_string_view( s ), pos );
+ return find(basic_string_view(s), pos);
}
// rfind(), 4x:
- nssv_constexpr14 size_type rfind( basic_string_view v, size_type pos = npos ) const nssv_noexcept // (1)
+ nssv_constexpr14 size_type rfind(basic_string_view v, size_type pos = npos) const nssv_noexcept // (1)
{
- if ( size() < v.size() )
- return npos;
+ if (size() < v.size()) {
+ return npos;
+ }
- if ( v.empty() )
- return (std::min)( size(), pos );
+ if (v.empty()) {
+ return (std::min)(size(), pos);
+ }
- const_iterator last = cbegin() + (std::min)( size() - v.size(), pos ) + v.size();
- const_iterator result = std::find_end( cbegin(), last, v.cbegin(), v.cend(), Traits::eq );
+ const_iterator last = cbegin() + (std::min)(size() - v.size(), pos) + v.size();
+ const_iterator result = std::find_end(cbegin(), last, v.cbegin(), v.cend(), Traits::eq);
- return result != last ? size_type( result - cbegin() ) : npos;
+ return result != last ? size_type(result - cbegin()) : npos;
}
- nssv_constexpr14 size_type rfind( CharT c, size_type pos = npos ) const nssv_noexcept // (2)
+ nssv_constexpr14 size_type rfind(CharT c, size_type pos = npos) const nssv_noexcept // (2)
{
- return rfind( basic_string_view( &c, 1 ), pos );
+ return rfind(basic_string_view(&c, 1), pos);
}
- nssv_constexpr14 size_type rfind( CharT const * s, size_type pos, size_type n ) const // (3)
+ nssv_constexpr14 size_type rfind(CharT const *s, size_type pos, size_type n) const // (3)
{
- return rfind( basic_string_view( s, n ), pos );
+ return rfind(basic_string_view(s, n), pos);
}
- nssv_constexpr14 size_type rfind( CharT const * s, size_type pos = npos ) const // (4)
+ nssv_constexpr14 size_type rfind(CharT const *s, size_type pos = npos) const // (4)
{
- return rfind( basic_string_view( s ), pos );
+ return rfind(basic_string_view(s), pos);
}
// find_first_of(), 4x:
- nssv_constexpr size_type find_first_of( basic_string_view v, size_type pos = 0 ) const nssv_noexcept // (1)
+ nssv_constexpr size_type find_first_of(basic_string_view v, size_type pos = 0) const nssv_noexcept // (1)
{
- return pos >= size()
- ? npos
- : to_pos( std::find_first_of( cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq ) );
+ return pos >= size() ? npos
+ : to_pos(std::find_first_of(cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq));
}
- nssv_constexpr size_type find_first_of( CharT c, size_type pos = 0 ) const nssv_noexcept // (2)
+ nssv_constexpr size_type find_first_of(CharT c, size_type pos = 0) const nssv_noexcept // (2)
{
- return find_first_of( basic_string_view( &c, 1 ), pos );
+ return find_first_of(basic_string_view(&c, 1), pos);
}
- nssv_constexpr size_type find_first_of( CharT const * s, size_type pos, size_type n ) const // (3)
+ nssv_constexpr size_type find_first_of(CharT const *s, size_type pos, size_type n) const // (3)
{
- return find_first_of( basic_string_view( s, n ), pos );
+ return find_first_of(basic_string_view(s, n), pos);
}
- nssv_constexpr size_type find_first_of( CharT const * s, size_type pos = 0 ) const // (4)
+ nssv_constexpr size_type find_first_of(CharT const *s, size_type pos = 0) const // (4)
{
- return find_first_of( basic_string_view( s ), pos );
+ return find_first_of(basic_string_view(s), pos);
}
// find_last_of(), 4x:
- nssv_constexpr size_type find_last_of( basic_string_view v, size_type pos = npos ) const nssv_noexcept // (1)
+ nssv_constexpr size_type find_last_of(basic_string_view v, size_type pos = npos) const nssv_noexcept // (1)
{
- return empty()
- ? npos
- : pos >= size()
- ? find_last_of( v, size() - 1 )
- : to_pos( std::find_first_of( const_reverse_iterator( cbegin() + pos + 1 ), crend(), v.cbegin(), v.cend(), Traits::eq ) );
+ return empty() ? npos
+ : pos >= size() ? find_last_of(v, size() - 1)
+ : to_pos(std::find_first_of(const_reverse_iterator(cbegin() + pos + 1), crend(),
+ v.cbegin(), v.cend(), Traits::eq));
}
- nssv_constexpr size_type find_last_of( CharT c, size_type pos = npos ) const nssv_noexcept // (2)
+ nssv_constexpr size_type find_last_of(CharT c, size_type pos = npos) const nssv_noexcept // (2)
{
- return find_last_of( basic_string_view( &c, 1 ), pos );
+ return find_last_of(basic_string_view(&c, 1), pos);
}
- nssv_constexpr size_type find_last_of( CharT const * s, size_type pos, size_type count ) const // (3)
+ nssv_constexpr size_type find_last_of(CharT const *s, size_type pos, size_type count) const // (3)
{
- return find_last_of( basic_string_view( s, count ), pos );
+ return find_last_of(basic_string_view(s, count), pos);
}
- nssv_constexpr size_type find_last_of( CharT const * s, size_type pos = npos ) const // (4)
+ nssv_constexpr size_type find_last_of(CharT const *s, size_type pos = npos) const // (4)
{
- return find_last_of( basic_string_view( s ), pos );
+ return find_last_of(basic_string_view(s), pos);
}
// find_first_not_of(), 4x:
- nssv_constexpr size_type find_first_not_of( basic_string_view v, size_type pos = 0 ) const nssv_noexcept // (1)
+ nssv_constexpr size_type find_first_not_of(basic_string_view v, size_type pos = 0) const nssv_noexcept // (1)
{
- return pos >= size()
- ? npos
- : to_pos( std::find_if( cbegin() + pos, cend(), not_in_view( v ) ) );
+ return pos >= size() ? npos : to_pos(std::find_if(cbegin() + pos, cend(), not_in_view(v)));
}
- nssv_constexpr size_type find_first_not_of( CharT c, size_type pos = 0 ) const nssv_noexcept // (2)
+ nssv_constexpr size_type find_first_not_of(CharT c, size_type pos = 0) const nssv_noexcept // (2)
{
- return find_first_not_of( basic_string_view( &c, 1 ), pos );
+ return find_first_not_of(basic_string_view(&c, 1), pos);
}
- nssv_constexpr size_type find_first_not_of( CharT const * s, size_type pos, size_type count ) const // (3)
+ nssv_constexpr size_type find_first_not_of(CharT const *s, size_type pos, size_type count) const // (3)
{
- return find_first_not_of( basic_string_view( s, count ), pos );
+ return find_first_not_of(basic_string_view(s, count), pos);
}
- nssv_constexpr size_type find_first_not_of( CharT const * s, size_type pos = 0 ) const // (4)
+ nssv_constexpr size_type find_first_not_of(CharT const *s, size_type pos = 0) const // (4)
{
- return find_first_not_of( basic_string_view( s ), pos );
+ return find_first_not_of(basic_string_view(s), pos);
}
// find_last_not_of(), 4x:
- nssv_constexpr size_type find_last_not_of( basic_string_view v, size_type pos = npos ) const nssv_noexcept // (1)
+ nssv_constexpr size_type find_last_not_of(basic_string_view v, size_type pos = npos) const nssv_noexcept // (1)
{
- return empty()
- ? npos
- : pos >= size()
- ? find_last_not_of( v, size() - 1 )
- : to_pos( std::find_if( const_reverse_iterator( cbegin() + pos + 1 ), crend(), not_in_view( v ) ) );
+ return empty() ? npos
+ : pos >= size()
+ ? find_last_not_of(v, size() - 1)
+ : to_pos(std::find_if(const_reverse_iterator(cbegin() + pos + 1), crend(), not_in_view(v)));
}
- nssv_constexpr size_type find_last_not_of( CharT c, size_type pos = npos ) const nssv_noexcept // (2)
+ nssv_constexpr size_type find_last_not_of(CharT c, size_type pos = npos) const nssv_noexcept // (2)
{
- return find_last_not_of( basic_string_view( &c, 1 ), pos );
+ return find_last_not_of(basic_string_view(&c, 1), pos);
}
- nssv_constexpr size_type find_last_not_of( CharT const * s, size_type pos, size_type count ) const // (3)
+ nssv_constexpr size_type find_last_not_of(CharT const *s, size_type pos, size_type count) const // (3)
{
- return find_last_not_of( basic_string_view( s, count ), pos );
+ return find_last_not_of(basic_string_view(s, count), pos);
}
- nssv_constexpr size_type find_last_not_of( CharT const * s, size_type pos = npos ) const // (4)
+ nssv_constexpr size_type find_last_not_of(CharT const *s, size_type pos = npos) const // (4)
{
- return find_last_not_of( basic_string_view( s ), pos );
+ return find_last_not_of(basic_string_view(s), pos);
}
// Constants:
@@ -903,298 +845,418 @@ public:
enum { npos = size_type(-1) };
#endif
-private:
- struct not_in_view
- {
- const basic_string_view v;
+ private:
+ struct not_in_view {
+ const basic_string_view v;
- nssv_constexpr not_in_view( basic_string_view v ) : v( v ) {}
+ nssv_constexpr explicit not_in_view(basic_string_view v) : v(v) {}
- nssv_constexpr bool operator()( CharT c ) const
- {
- return npos == v.find_first_of( c );
- }
+ nssv_constexpr bool operator()(CharT c) const { return npos == v.find_first_of(c); }
};
- nssv_constexpr size_type to_pos( const_iterator it ) const
- {
- return it == cend() ? npos : size_type( it - cbegin() );
- }
+ nssv_constexpr size_type to_pos(const_iterator it) const { return it == cend() ? npos : size_type(it - cbegin()); }
- nssv_constexpr size_type to_pos( const_reverse_iterator it ) const
- {
- return it == crend() ? npos : size_type( crend() - it - 1 );
+ nssv_constexpr size_type to_pos(const_reverse_iterator it) const {
+ return it == crend() ? npos : size_type(crend() - it - 1);
}
- nssv_constexpr const_reference data_at( size_type pos ) const
- {
-#if nssv_BETWEEN( nssv_COMPILER_GNUC_VERSION, 1, 500 )
- return data_[pos];
+ nssv_constexpr const_reference data_at(size_type pos) const {
+#if nssv_BETWEEN(nssv_COMPILER_GNUC_VERSION, 1, 500)
+ return data_[pos];
#else
- return assert( pos < size() ), data_[pos];
+ return assert(pos < size()), data_[pos];
#endif
}
-private:
+ private:
const_pointer data_;
- size_type size_;
+ size_type size_;
-public:
+ public:
#if nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS
- template< class Allocator >
- basic_string_view( std::basic_string<CharT, Traits, Allocator> const & s ) nssv_noexcept
- : data_( s.data() )
- , size_( s.size() )
- {}
+ template <class Allocator>
+ basic_string_view(std::basic_string<CharT, Traits, Allocator> const &s) nssv_noexcept : data_(s.data()),
+ size_(s.size()) {}
#if nssv_HAVE_EXPLICIT_CONVERSION
- template< class Allocator >
- explicit operator std::basic_string<CharT, Traits, Allocator>() const
- {
- return to_string( Allocator() );
+ template <class Allocator> explicit operator std::basic_string<CharT, Traits, Allocator>() const {
+ return to_string(Allocator());
}
#endif // nssv_HAVE_EXPLICIT_CONVERSION
#if nssv_CPP11_OR_GREATER
- template< class Allocator = std::allocator<CharT> >
- std::basic_string<CharT, Traits, Allocator>
- to_string( Allocator const & a = Allocator() ) const
- {
- return std::basic_string<CharT, Traits, Allocator>( begin(), end(), a );
+ template <class Allocator = std::allocator<CharT>>
+ std::basic_string<CharT, Traits, Allocator> to_string(Allocator const &a = Allocator()) const {
+ return std::basic_string<CharT, Traits, Allocator>(begin(), end(), a);
}
#else
- std::basic_string<CharT, Traits>
- to_string() const
- {
- return std::basic_string<CharT, Traits>( begin(), end() );
- }
+ std::basic_string<CharT, Traits> to_string() const { return std::basic_string<CharT, Traits>(begin(), end()); }
- template< class Allocator >
- std::basic_string<CharT, Traits, Allocator>
- to_string( Allocator const & a ) const
- {
- return std::basic_string<CharT, Traits, Allocator>( begin(), end(), a );
+ template <class Allocator> std::basic_string<CharT, Traits, Allocator> to_string(Allocator const &a) const {
+ return std::basic_string<CharT, Traits, Allocator>(begin(), end(), a);
}
#endif // nssv_CPP11_OR_GREATER
#endif // nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS
-};
+ };
-//
-// Non-member functions:
-//
+ //
+ // Non-member functions:
+ //
+
+ // 24.4.3 Non-member comparison functions:
+ // lexicographically compare two string views (function template):
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator==(basic_string_view<CharT, Traits> lhs,
+ basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.compare(rhs) == 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator!=(basic_string_view<CharT, Traits> lhs,
+ basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.compare(rhs) != 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator<(basic_string_view<CharT, Traits> lhs,
+ basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.compare(rhs) < 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator<=(basic_string_view<CharT, Traits> lhs,
+ basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.compare(rhs) <= 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator>(basic_string_view<CharT, Traits> lhs,
+ basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.compare(rhs) > 0;
+ }
-// 24.4.3 Non-member comparison functions:
-// lexicographically compare two string views (function template):
-
-template< class CharT, class Traits >
-nssv_constexpr bool operator== (
- basic_string_view <CharT, Traits> lhs,
- basic_string_view <CharT, Traits> rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) == 0 ; }
-
-template< class CharT, class Traits >
-nssv_constexpr bool operator!= (
- basic_string_view <CharT, Traits> lhs,
- basic_string_view <CharT, Traits> rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) != 0 ; }
-
-template< class CharT, class Traits >
-nssv_constexpr bool operator< (
- basic_string_view <CharT, Traits> lhs,
- basic_string_view <CharT, Traits> rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) < 0 ; }
-
-template< class CharT, class Traits >
-nssv_constexpr bool operator<= (
- basic_string_view <CharT, Traits> lhs,
- basic_string_view <CharT, Traits> rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) <= 0 ; }
-
-template< class CharT, class Traits >
-nssv_constexpr bool operator> (
- basic_string_view <CharT, Traits> lhs,
- basic_string_view <CharT, Traits> rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) > 0 ; }
-
-template< class CharT, class Traits >
-nssv_constexpr bool operator>= (
- basic_string_view <CharT, Traits> lhs,
- basic_string_view <CharT, Traits> rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) >= 0 ; }
-
-// Let S be basic_string_view<CharT, Traits>, and sv be an instance of S.
-// Implementations shall provide sufficient additional overloads marked
-// constexpr and noexcept so that an object t with an implicit conversion
-// to S can be compared according to Table 67.
-
-#if nssv_CPP11_OR_GREATER && ! nssv_BETWEEN( nssv_COMPILER_MSVC_VERSION, 100, 141 )
-
-#define nssv_BASIC_STRING_VIEW_I(T,U) typename std::decay< basic_string_view<T,U> >::type
-
-#if nssv_BETWEEN( nssv_COMPILER_MSVC_VERSION, 140, 150 )
-# define nssv_MSVC_ORDER(x) , int=x
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator>=(basic_string_view<CharT, Traits> lhs,
+ basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.compare(rhs) >= 0;
+ }
+
+ // Let S be basic_string_view<CharT, Traits>, and sv be an instance of S.
+ // Implementations shall provide sufficient additional overloads marked
+ // constexpr and noexcept so that an object t with an implicit conversion
+ // to S can be compared according to Table 67.
+
+#if !nssv_CPP11_OR_GREATER || nssv_BETWEEN(nssv_COMPILER_MSVC_VERSION, 100, 141)
+
+ // accomodate for older compilers:
+
+ // ==
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator==(basic_string_view<CharT, Traits> lhs, char const *rhs) nssv_noexcept {
+ return lhs.compare(rhs) == 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator==(char const *lhs, basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return rhs.compare(lhs) == 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator==(basic_string_view<CharT, Traits> lhs,
+ std::basic_string<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.size() == rhs.size() && lhs.compare(rhs) == 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator==(std::basic_string<CharT, Traits> rhs,
+ basic_string_view<CharT, Traits> lhs) nssv_noexcept {
+ return lhs.size() == rhs.size() && lhs.compare(rhs) == 0;
+ }
+
+ // !=
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator!=(basic_string_view<CharT, Traits> lhs, char const *rhs) nssv_noexcept {
+ return lhs.compare(rhs) != 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator!=(char const *lhs, basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return rhs.compare(lhs) != 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator!=(basic_string_view<CharT, Traits> lhs,
+ std::basic_string<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.size() != rhs.size() && lhs.compare(rhs) != 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator!=(std::basic_string<CharT, Traits> rhs,
+ basic_string_view<CharT, Traits> lhs) nssv_noexcept {
+ return lhs.size() != rhs.size() || rhs.compare(lhs) != 0;
+ }
+
+ // <
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator<(basic_string_view<CharT, Traits> lhs, char const *rhs) nssv_noexcept {
+ return lhs.compare(rhs) < 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator<(char const *lhs, basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return rhs.compare(lhs) > 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator<(basic_string_view<CharT, Traits> lhs,
+ std::basic_string<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.compare(rhs) < 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator<(std::basic_string<CharT, Traits> rhs,
+ basic_string_view<CharT, Traits> lhs) nssv_noexcept {
+ return rhs.compare(lhs) > 0;
+ }
+
+ // <=
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator<=(basic_string_view<CharT, Traits> lhs, char const *rhs) nssv_noexcept {
+ return lhs.compare(rhs) <= 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator<=(char const *lhs, basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return rhs.compare(lhs) >= 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator<=(basic_string_view<CharT, Traits> lhs,
+ std::basic_string<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.compare(rhs) <= 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator<=(std::basic_string<CharT, Traits> rhs,
+ basic_string_view<CharT, Traits> lhs) nssv_noexcept {
+ return rhs.compare(lhs) >= 0;
+ }
+
+ // >
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator>(basic_string_view<CharT, Traits> lhs, char const *rhs) nssv_noexcept {
+ return lhs.compare(rhs) > 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator>(char const *lhs, basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return rhs.compare(lhs) < 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator>(basic_string_view<CharT, Traits> lhs,
+ std::basic_string<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.compare(rhs) > 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator>(std::basic_string<CharT, Traits> rhs,
+ basic_string_view<CharT, Traits> lhs) nssv_noexcept {
+ return rhs.compare(lhs) < 0;
+ }
+
+ // >=
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator>=(basic_string_view<CharT, Traits> lhs, char const *rhs) nssv_noexcept {
+ return lhs.compare(rhs) >= 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator>=(char const *lhs, basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return rhs.compare(lhs) <= 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator>=(basic_string_view<CharT, Traits> lhs,
+ std::basic_string<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.compare(rhs) >= 0;
+ }
+
+ template <class CharT, class Traits>
+ nssv_constexpr bool operator>=(std::basic_string<CharT, Traits> rhs,
+ basic_string_view<CharT, Traits> lhs) nssv_noexcept {
+ return rhs.compare(lhs) <= 0;
+ }
+
+#else // newer compilers:
+
+#define nssv_BASIC_STRING_VIEW_I(T, U) typename std::decay<basic_string_view<T, U>>::type
+
+#if nssv_BETWEEN(nssv_COMPILER_MSVC_VERSION, 140, 150)
+#define nssv_MSVC_ORDER(x) , int = x
#else
-# define nssv_MSVC_ORDER(x) /*, int=x*/
+#define nssv_MSVC_ORDER(x) /*, int=x*/
#endif
-// ==
-
-template< class CharT, class Traits nssv_MSVC_ORDER(1) >
-nssv_constexpr bool operator==(
- basic_string_view <CharT, Traits> lhs,
- nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) == 0; }
-
-template< class CharT, class Traits nssv_MSVC_ORDER(2) >
-nssv_constexpr bool operator==(
- nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs,
- basic_string_view <CharT, Traits> rhs ) nssv_noexcept
-{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }
-
-// !=
-
-template< class CharT, class Traits nssv_MSVC_ORDER(1) >
-nssv_constexpr bool operator!= (
- basic_string_view < CharT, Traits > lhs,
- nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
-{ return lhs.size() != rhs.size() || lhs.compare( rhs ) != 0 ; }
-
-template< class CharT, class Traits nssv_MSVC_ORDER(2) >
-nssv_constexpr bool operator!= (
- nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
- basic_string_view < CharT, Traits > rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) != 0 ; }
-
-// <
-
-template< class CharT, class Traits nssv_MSVC_ORDER(1) >
-nssv_constexpr bool operator< (
- basic_string_view < CharT, Traits > lhs,
- nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) < 0 ; }
-
-template< class CharT, class Traits nssv_MSVC_ORDER(2) >
-nssv_constexpr bool operator< (
- nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
- basic_string_view < CharT, Traits > rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) < 0 ; }
-
-// <=
-
-template< class CharT, class Traits nssv_MSVC_ORDER(1) >
-nssv_constexpr bool operator<= (
- basic_string_view < CharT, Traits > lhs,
- nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) <= 0 ; }
-
-template< class CharT, class Traits nssv_MSVC_ORDER(2) >
-nssv_constexpr bool operator<= (
- nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
- basic_string_view < CharT, Traits > rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) <= 0 ; }
-
-// >
-
-template< class CharT, class Traits nssv_MSVC_ORDER(1) >
-nssv_constexpr bool operator> (
- basic_string_view < CharT, Traits > lhs,
- nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) > 0 ; }
-
-template< class CharT, class Traits nssv_MSVC_ORDER(2) >
-nssv_constexpr bool operator> (
- nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
- basic_string_view < CharT, Traits > rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) > 0 ; }
-
-// >=
-
-template< class CharT, class Traits nssv_MSVC_ORDER(1) >
-nssv_constexpr bool operator>= (
- basic_string_view < CharT, Traits > lhs,
- nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) >= 0 ; }
-
-template< class CharT, class Traits nssv_MSVC_ORDER(2) >
-nssv_constexpr bool operator>= (
- nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,
- basic_string_view < CharT, Traits > rhs ) nssv_noexcept
-{ return lhs.compare( rhs ) >= 0 ; }
+ // ==
+
+ template <class CharT, class Traits nssv_MSVC_ORDER(1)>
+ nssv_constexpr bool operator==(basic_string_view<CharT, Traits> lhs,
+ nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs) nssv_noexcept {
+ return lhs.compare(rhs) == 0;
+ }
+
+ template <class CharT, class Traits nssv_MSVC_ORDER(2)>
+ nssv_constexpr bool operator==(nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs,
+ basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.size() == rhs.size() && lhs.compare(rhs) == 0;
+ }
+
+ // !=
+
+ template <class CharT, class Traits nssv_MSVC_ORDER(1)>
+ nssv_constexpr bool operator!=(basic_string_view<CharT, Traits> lhs,
+ nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs) nssv_noexcept {
+ return lhs.size() != rhs.size() || lhs.compare(rhs) != 0;
+ }
+
+ template <class CharT, class Traits nssv_MSVC_ORDER(2)>
+ nssv_constexpr bool operator!=(nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs,
+ basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.compare(rhs) != 0;
+ }
+
+ // <
+
+ template <class CharT, class Traits nssv_MSVC_ORDER(1)>
+ nssv_constexpr bool operator<(basic_string_view<CharT, Traits> lhs,
+ nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs) nssv_noexcept {
+ return lhs.compare(rhs) < 0;
+ }
+
+ template <class CharT, class Traits nssv_MSVC_ORDER(2)>
+ nssv_constexpr bool operator<(nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs,
+ basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.compare(rhs) < 0;
+ }
+
+ // <=
+
+ template <class CharT, class Traits nssv_MSVC_ORDER(1)>
+ nssv_constexpr bool operator<=(basic_string_view<CharT, Traits> lhs,
+ nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs) nssv_noexcept {
+ return lhs.compare(rhs) <= 0;
+ }
+
+ template <class CharT, class Traits nssv_MSVC_ORDER(2)>
+ nssv_constexpr bool operator<=(nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs,
+ basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.compare(rhs) <= 0;
+ }
+
+ // >
+
+ template <class CharT, class Traits nssv_MSVC_ORDER(1)>
+ nssv_constexpr bool operator>(basic_string_view<CharT, Traits> lhs,
+ nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs) nssv_noexcept {
+ return lhs.compare(rhs) > 0;
+ }
+
+ template <class CharT, class Traits nssv_MSVC_ORDER(2)>
+ nssv_constexpr bool operator>(nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs,
+ basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.compare(rhs) > 0;
+ }
+
+ // >=
+
+ template <class CharT, class Traits nssv_MSVC_ORDER(1)>
+ nssv_constexpr bool operator>=(basic_string_view<CharT, Traits> lhs,
+ nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs) nssv_noexcept {
+ return lhs.compare(rhs) >= 0;
+ }
+
+ template <class CharT, class Traits nssv_MSVC_ORDER(2)>
+ nssv_constexpr bool operator>=(nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs,
+ basic_string_view<CharT, Traits> rhs) nssv_noexcept {
+ return lhs.compare(rhs) >= 0;
+ }
#undef nssv_MSVC_ORDER
#undef nssv_BASIC_STRING_VIEW_I
-#endif // nssv_CPP11_OR_GREATER
+#endif // compiler-dependent approach to comparisons
-// 24.4.4 Inserters and extractors:
+ // 24.4.4 Inserters and extractors:
-namespace detail {
+ namespace detail {
-template< class Stream >
-void write_padding( Stream & os, std::streamsize n )
-{
- for ( std::streamsize i = 0; i < n; ++i )
- os.rdbuf()->sputc( os.fill() );
-}
+ template <class Stream> void write_padding(Stream &os, std::streamsize n) {
+ for (std::streamsize i = 0; i < n; ++i)
+ os.rdbuf()->sputc(os.fill());
+ }
-template< class Stream, class View >
-Stream & write_to_stream( Stream & os, View const & sv )
-{
- typename Stream::sentry sentry( os );
+ template <class Stream, class View> Stream &write_to_stream(Stream &os, View const &sv) {
+ typename Stream::sentry sentry(os);
- if ( !os )
- return os;
+ if (!os)
+ return os;
- const std::streamsize length = static_cast<std::streamsize>( sv.length() );
+ const std::streamsize length = static_cast<std::streamsize>(sv.length());
// Whether, and how, to pad:
- const bool pad = ( length < os.width() );
- const bool left_pad = pad && ( os.flags() & std::ios_base::adjustfield ) == std::ios_base::right;
+ const bool pad = (length < os.width());
+ const bool left_pad = pad && (os.flags() & std::ios_base::adjustfield) == std::ios_base::right;
- if ( left_pad )
- write_padding( os, os.width() - length );
+ if (left_pad)
+ write_padding(os, os.width() - length);
// Write span characters:
- os.rdbuf()->sputn( sv.begin(), length );
+ os.rdbuf()->sputn(sv.begin(), length);
- if ( pad && !left_pad )
- write_padding( os, os.width() - length );
+ if (pad && !left_pad)
+ write_padding(os, os.width() - length);
// Reset output stream width:
- os.width( 0 );
+ os.width(0);
return os;
-}
+ }
-} // namespace detail
+ } // namespace detail
-template< class CharT, class Traits >
-std::basic_ostream<CharT, Traits> &
-operator<<(
- std::basic_ostream<CharT, Traits>& os,
- basic_string_view <CharT, Traits> sv )
-{
- return detail::write_to_stream( os, sv );
-}
+ template <class CharT, class Traits>
+ std::basic_ostream<CharT, Traits> &operator<<(std::basic_ostream<CharT, Traits> &os,
+ basic_string_view<CharT, Traits> sv) {
+ return detail::write_to_stream(os, sv);
+ }
-// Several typedefs for common character types are provided:
+ // Several typedefs for common character types are provided:
-typedef basic_string_view<char> string_view;
-typedef basic_string_view<wchar_t> wstring_view;
+ typedef basic_string_view<char> string_view;
+ typedef basic_string_view<wchar_t> wstring_view;
#if nssv_HAVE_WCHAR16_T
-typedef basic_string_view<char16_t> u16string_view;
-typedef basic_string_view<char32_t> u32string_view;
+ typedef basic_string_view<char16_t> u16string_view;
+ typedef basic_string_view<char32_t> u32string_view;
#endif
-}} // namespace nonstd::sv_lite
+ } // namespace sv_lite
+} // namespace nonstd::sv_lite
//
// 24.4.6 Suffix for basic_string_view literals:
@@ -1204,57 +1266,58 @@ typedef basic_string_view<char32_t> u32string_view;
namespace nonstd {
nssv_inline_ns namespace literals {
-nssv_inline_ns namespace string_view_literals {
+ nssv_inline_ns namespace string_view_literals {
#if nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS
-nssv_constexpr nonstd::sv_lite::string_view operator "" sv( const char* str, size_t len ) nssv_noexcept // (1)
-{
- return nonstd::sv_lite::string_view{ str, len };
-}
+ nssv_constexpr nonstd::sv_lite::string_view operator"" sv(const char *str, size_t len) nssv_noexcept // (1)
+ {
+ return nonstd::sv_lite::string_view {str, len};
+ }
-nssv_constexpr nonstd::sv_lite::u16string_view operator "" sv( const char16_t* str, size_t len ) nssv_noexcept // (2)
-{
- return nonstd::sv_lite::u16string_view{ str, len };
-}
+ nssv_constexpr nonstd::sv_lite::u16string_view operator"" sv(const char16_t *str, size_t len) nssv_noexcept // (2)
+ {
+ return nonstd::sv_lite::u16string_view {str, len};
+ }
-nssv_constexpr nonstd::sv_lite::u32string_view operator "" sv( const char32_t* str, size_t len ) nssv_noexcept // (3)
-{
- return nonstd::sv_lite::u32string_view{ str, len };
-}
+ nssv_constexpr nonstd::sv_lite::u32string_view operator"" sv(const char32_t *str, size_t len) nssv_noexcept // (3)
+ {
+ return nonstd::sv_lite::u32string_view {str, len};
+ }
-nssv_constexpr nonstd::sv_lite::wstring_view operator "" sv( const wchar_t* str, size_t len ) nssv_noexcept // (4)
-{
- return nonstd::sv_lite::wstring_view{ str, len };
-}
+ nssv_constexpr nonstd::sv_lite::wstring_view operator"" sv(const wchar_t *str, size_t len) nssv_noexcept // (4)
+ {
+ return nonstd::sv_lite::wstring_view {str, len};
+ }
#endif // nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS
#if nssv_CONFIG_USR_SV_OPERATOR
-nssv_constexpr nonstd::sv_lite::string_view operator "" _sv( const char* str, size_t len ) nssv_noexcept // (1)
-{
- return nonstd::sv_lite::string_view{ str, len };
-}
+ nssv_constexpr nonstd::sv_lite::string_view operator"" _sv(const char *str, size_t len) nssv_noexcept // (1)
+ {
+ return nonstd::sv_lite::string_view {str, len};
+ }
-nssv_constexpr nonstd::sv_lite::u16string_view operator "" _sv( const char16_t* str, size_t len ) nssv_noexcept // (2)
-{
- return nonstd::sv_lite::u16string_view{ str, len };
-}
+ nssv_constexpr nonstd::sv_lite::u16string_view operator"" _sv(const char16_t *str, size_t len) nssv_noexcept // (2)
+ {
+ return nonstd::sv_lite::u16string_view {str, len};
+ }
-nssv_constexpr nonstd::sv_lite::u32string_view operator "" _sv( const char32_t* str, size_t len ) nssv_noexcept // (3)
-{
- return nonstd::sv_lite::u32string_view{ str, len };
-}
+ nssv_constexpr nonstd::sv_lite::u32string_view operator"" _sv(const char32_t *str, size_t len) nssv_noexcept // (3)
+ {
+ return nonstd::sv_lite::u32string_view {str, len};
+ }
-nssv_constexpr nonstd::sv_lite::wstring_view operator "" _sv( const wchar_t* str, size_t len ) nssv_noexcept // (4)
-{
- return nonstd::sv_lite::wstring_view{ str, len };
-}
+ nssv_constexpr nonstd::sv_lite::wstring_view operator"" _sv(const wchar_t *str, size_t len) nssv_noexcept // (4)
+ {
+ return nonstd::sv_lite::wstring_view {str, len};
+ }
#endif // nssv_CONFIG_USR_SV_OPERATOR
-
-}}} // namespace nonstd::literals::string_view_literals
+ }
+}
+} // namespace nonstd
#endif
@@ -1271,39 +1334,32 @@ namespace sv_lite {
#if nssv_CPP11_OR_GREATER && nssv_COMPILER_MSVC_VERSION != 140
-template< class CharT, class Traits, class Allocator = std::allocator<CharT> >
-std::basic_string<CharT, Traits, Allocator>
-to_string( basic_string_view<CharT, Traits> v, Allocator const & a = Allocator() )
-{
- return std::basic_string<CharT,Traits, Allocator>( v.begin(), v.end(), a );
+template <class CharT, class Traits, class Allocator = std::allocator<CharT>>
+std::basic_string<CharT, Traits, Allocator> to_string(basic_string_view<CharT, Traits> v,
+ Allocator const &a = Allocator()) {
+ return std::basic_string<CharT, Traits, Allocator>(v.begin(), v.end(), a);
}
#else
-template< class CharT, class Traits >
-std::basic_string<CharT, Traits>
-to_string( basic_string_view<CharT, Traits> v )
-{
- return std::basic_string<CharT, Traits>( v.begin(), v.end() );
+template <class CharT, class Traits> std::basic_string<CharT, Traits> to_string(basic_string_view<CharT, Traits> v) {
+ return std::basic_string<CharT, Traits>(v.begin(), v.end());
}
-template< class CharT, class Traits, class Allocator >
-std::basic_string<CharT, Traits, Allocator>
-to_string( basic_string_view<CharT, Traits> v, Allocator const & a )
-{
- return std::basic_string<CharT, Traits, Allocator>( v.begin(), v.end(), a );
+template <class CharT, class Traits, class Allocator>
+std::basic_string<CharT, Traits, Allocator> to_string(basic_string_view<CharT, Traits> v, Allocator const &a) {
+ return std::basic_string<CharT, Traits, Allocator>(v.begin(), v.end(), a);
}
#endif // nssv_CPP11_OR_GREATER
-template< class CharT, class Traits, class Allocator >
-basic_string_view<CharT, Traits>
-to_string_view( std::basic_string<CharT, Traits, Allocator> const & s )
-{
- return basic_string_view<CharT, Traits>( s.data(), s.size() );
+template <class CharT, class Traits, class Allocator>
+basic_string_view<CharT, Traits> to_string_view(std::basic_string<CharT, Traits, Allocator> const &s) {
+ return basic_string_view<CharT, Traits>(s.data(), s.size());
}
-}} // namespace nonstd::sv_lite
+} // namespace sv_lite
+} // namespace nonstd
#endif // nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS
@@ -1353,44 +1409,32 @@ using sv_lite::to_string_view;
namespace std {
-template<>
-struct hash< nonstd::string_view >
-{
+template <> struct hash<nonstd::string_view> {
public:
- std::size_t operator()( nonstd::string_view v ) const nssv_noexcept
- {
- return std::hash<std::string>()( std::string( v.data(), v.size() ) );
- }
+ std::size_t operator()(nonstd::string_view v) const nssv_noexcept {
+ return std::hash<std::string>()(std::string(v.data(), v.size()));
+ }
};
-template<>
-struct hash< nonstd::wstring_view >
-{
+template <> struct hash<nonstd::wstring_view> {
public:
- std::size_t operator()( nonstd::wstring_view v ) const nssv_noexcept
- {
- return std::hash<std::wstring>()( std::wstring( v.data(), v.size() ) );
- }
+ std::size_t operator()(nonstd::wstring_view v) const nssv_noexcept {
+ return std::hash<std::wstring>()(std::wstring(v.data(), v.size()));
+ }
};
-template<>
-struct hash< nonstd::u16string_view >
-{
+template <> struct hash<nonstd::u16string_view> {
public:
- std::size_t operator()( nonstd::u16string_view v ) const nssv_noexcept
- {
- return std::hash<std::u16string>()( std::u16string( v.data(), v.size() ) );
- }
+ std::size_t operator()(nonstd::u16string_view v) const nssv_noexcept {
+ return std::hash<std::u16string>()(std::u16string(v.data(), v.size()));
+ }
};
-template<>
-struct hash< nonstd::u32string_view >
-{
+template <> struct hash<nonstd::u32string_view> {
public:
- std::size_t operator()( nonstd::u32string_view v ) const nssv_noexcept
- {
- return std::hash<std::u32string>()( std::u32string( v.data(), v.size() ) );
- }
+ std::size_t operator()(nonstd::u32string_view v) const nssv_noexcept {
+ return std::hash<std::u32string>()(std::u32string(v.data(), v.size()));
+ }
};
} // namespace std
@@ -1403,23 +1447,22 @@ nssv_RESTORE_WARNINGS()
#endif // NONSTD_SV_LITE_H_INCLUDED
-
namespace inja {
-enum class ElementNotation {
- Dot,
- Pointer
-};
-
/*!
* \brief Class for lexer configuration.
*/
struct LexerConfig {
std::string statement_open {"{%"};
+ std::string statement_open_no_lstrip {"{%+"};
+ std::string statement_open_force_lstrip {"{%-"};
std::string statement_close {"%}"};
+ std::string statement_close_force_rstrip {"-%}"};
std::string line_statement {"##"};
std::string expression_open {"{{"};
+ std::string expression_open_force_lstrip {"{{-"};
std::string expression_close {"}}"};
+ std::string expression_close_force_rstrip {"-}}"};
std::string comment_open {"{#"};
std::string comment_close {"#}"};
std::string open_chars {"#{"};
@@ -1435,9 +1478,18 @@ struct LexerConfig {
if (open_chars.find(statement_open[0]) == std::string::npos) {
open_chars += statement_open[0];
}
+ if (open_chars.find(statement_open_no_lstrip[0]) == std::string::npos) {
+ open_chars += statement_open_no_lstrip[0];
+ }
+ if (open_chars.find(statement_open_force_lstrip[0]) == std::string::npos) {
+ open_chars += statement_open_force_lstrip[0];
+ }
if (open_chars.find(expression_open[0]) == std::string::npos) {
open_chars += expression_open[0];
}
+ if (open_chars.find(expression_open_force_lstrip[0]) == std::string::npos) {
+ open_chars += expression_open_force_lstrip[0];
+ }
if (open_chars.find(comment_open[0]) == std::string::npos) {
open_chars += comment_open[0];
}
@@ -1448,69 +1500,78 @@ struct LexerConfig {
* \brief Class for parser configuration.
*/
struct ParserConfig {
- ElementNotation notation {ElementNotation::Dot};
+ bool search_included_templates_in_files {true};
};
-}
-
-#endif // PANTOR_INJA_CONFIG_HPP
+/*!
+ * \brief Class for render configuration.
+ */
+struct RenderConfig {
+ bool throw_at_missing_includes {true};
+};
-// #include "function_storage.hpp"
-#ifndef PANTOR_INJA_FUNCTION_STORAGE_HPP
-#define PANTOR_INJA_FUNCTION_STORAGE_HPP
+} // namespace inja
-#include <vector>
+#endif // INCLUDE_INJA_CONFIG_HPP_
-// #include "bytecode.hpp"
-#ifndef PANTOR_INJA_BYTECODE_HPP
-#define PANTOR_INJA_BYTECODE_HPP
+// #include "function_storage.hpp"
+// Copyright (c) 2020 Pantor. All rights reserved.
-#include <string>
-#include <utility>
+#ifndef INCLUDE_INJA_FUNCTION_STORAGE_HPP_
+#define INCLUDE_INJA_FUNCTION_STORAGE_HPP_
-#include <nlohmann/json.hpp>
+#include <vector>
// #include "string_view.hpp"
-
namespace inja {
using json = nlohmann::json;
+using Arguments = std::vector<const json *>;
+using CallbackFunction = std::function<json(Arguments &args)>;
+using VoidCallbackFunction = std::function<void(Arguments &args)>;
-struct Bytecode {
- enum class Op : uint8_t {
- Nop,
- // print StringRef (always immediate)
- PrintText,
- // print value
- PrintValue,
- // push value onto stack (always immediate)
- Push,
-
- // builtin functions
- // result is pushed to stack
- // args specify number of arguments
- // all functions can take their "last" argument either immediate
- // or popped off stack (e.g. if immediate, it's like the immediate was
- // just pushed to the stack)
+/*!
+ * \brief Class for builtin functions and user-defined callbacks.
+ */
+class FunctionStorage {
+public:
+ enum class Operation {
Not,
And,
Or,
In,
Equal,
+ NotEqual,
Greater,
GreaterEqual,
Less,
LessEqual,
+ Add,
+ Subtract,
+ Multiplication,
+ Division,
+ Power,
+ Modulo,
+ AtId,
At,
- Different,
+ Default,
DivisibleBy,
Even,
+ Exists,
+ ExistsInObject,
First,
Float,
Int,
+ IsArray,
+ IsBoolean,
+ IsFloat,
+ IsInteger,
+ IsNumber,
+ IsObject,
+ IsString,
Last,
Length,
Lower,
@@ -1518,175 +1579,157 @@ struct Bytecode {
Min,
Odd,
Range,
- Result,
Round,
Sort,
Upper,
- Exists,
- ExistsInObject,
- IsBoolean,
- IsNumber,
- IsInteger,
- IsFloat,
- IsObject,
- IsArray,
- IsString,
- Default,
-
- // include another template
- // value is the template name
- Include,
-
- // callback function
- // str is the function name (this means it cannot be a lookup)
- // args specify number of arguments
- // as with builtin functions, "last" argument can be immediate
Callback,
+ ParenLeft,
+ ParenRight,
+ None,
+ };
- // unconditional jump
- // args is the index of the bytecode to jump to.
- Jump,
-
- // conditional jump
- // value popped off stack is checked for truthyness
- // if false, args is the index of the bytecode to jump to.
- // if true, no action is taken (falls through)
- ConditionalJump,
-
- // start loop
- // value popped off stack is what is iterated over
- // args is index of bytecode after end loop (jumped to if iterable is
- // empty)
- // immediate value is key name (for maps)
- // str is value name
- StartLoop,
-
- // end a loop
- // args is index of the first bytecode in the loop body
- EndLoop,
+ struct FunctionData {
+ explicit FunctionData(const Operation &op, const CallbackFunction &cb = CallbackFunction{}) : operation(op), callback(cb) {}
+ const Operation operation;
+ const CallbackFunction callback;
};
- enum Flag {
- // location of value for value-taking ops (mask)
- ValueMask = 0x03,
- // pop value off stack
- ValuePop = 0x00,
- // value is immediate rather than on stack
- ValueImmediate = 0x01,
- // lookup immediate str (dot notation)
- ValueLookupDot = 0x02,
- // lookup immediate str (json pointer notation)
- ValueLookupPointer = 0x03,
+private:
+ const int VARIADIC {-1};
+
+ std::map<std::pair<std::string, int>, FunctionData> function_storage = {
+ {std::make_pair("at", 2), FunctionData { Operation::At }},
+ {std::make_pair("default", 2), FunctionData { Operation::Default }},
+ {std::make_pair("divisibleBy", 2), FunctionData { Operation::DivisibleBy }},
+ {std::make_pair("even", 1), FunctionData { Operation::Even }},
+ {std::make_pair("exists", 1), FunctionData { Operation::Exists }},
+ {std::make_pair("existsIn", 2), FunctionData { Operation::ExistsInObject }},
+ {std::make_pair("first", 1), FunctionData { Operation::First }},
+ {std::make_pair("float", 1), FunctionData { Operation::Float }},
+ {std::make_pair("int", 1), FunctionData { Operation::Int }},
+ {std::make_pair("isArray", 1), FunctionData { Operation::IsArray }},
+ {std::make_pair("isBoolean", 1), FunctionData { Operation::IsBoolean }},
+ {std::make_pair("isFloat", 1), FunctionData { Operation::IsFloat }},
+ {std::make_pair("isInteger", 1), FunctionData { Operation::IsInteger }},
+ {std::make_pair("isNumber", 1), FunctionData { Operation::IsNumber }},
+ {std::make_pair("isObject", 1), FunctionData { Operation::IsObject }},
+ {std::make_pair("isString", 1), FunctionData { Operation::IsString }},
+ {std::make_pair("last", 1), FunctionData { Operation::Last }},
+ {std::make_pair("length", 1), FunctionData { Operation::Length }},
+ {std::make_pair("lower", 1), FunctionData { Operation::Lower }},
+ {std::make_pair("max", 1), FunctionData { Operation::Max }},
+ {std::make_pair("min", 1), FunctionData { Operation::Min }},
+ {std::make_pair("odd", 1), FunctionData { Operation::Odd }},
+ {std::make_pair("range", 1), FunctionData { Operation::Range }},
+ {std::make_pair("round", 2), FunctionData { Operation::Round }},
+ {std::make_pair("sort", 1), FunctionData { Operation::Sort }},
+ {std::make_pair("upper", 1), FunctionData { Operation::Upper }},
};
- Op op {Op::Nop};
- uint32_t args: 30;
- uint32_t flags: 2;
+public:
+ void add_builtin(nonstd::string_view name, int num_args, Operation op) {
+ function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData { op });
+ }
- json value;
- std::string str;
+ void add_callback(nonstd::string_view name, int num_args, const CallbackFunction &callback) {
+ function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData { Operation::Callback, callback });
+ }
- Bytecode(): args(0), flags(0) {}
- explicit Bytecode(Op op, unsigned int args = 0): op(op), args(args), flags(0) {}
- explicit Bytecode(Op op, nonstd::string_view str, unsigned int flags): op(op), args(0), flags(flags), str(str) {}
- explicit Bytecode(Op op, json&& value, unsigned int flags): op(op), args(0), flags(flags), value(std::move(value)) {}
-};
+ FunctionData find_function(nonstd::string_view name, int num_args) const {
+ auto it = function_storage.find(std::make_pair(static_cast<std::string>(name), num_args));
+ if (it != function_storage.end()) {
+ return it->second;
-} // namespace inja
+ // Find variadic function
+ } else if (num_args > 0) {
+ it = function_storage.find(std::make_pair(static_cast<std::string>(name), VARIADIC));
+ if (it != function_storage.end()) {
+ return it->second;
+ }
+ }
-#endif // PANTOR_INJA_BYTECODE_HPP
+ return FunctionData { Operation::None };
+ }
+};
-// #include "string_view.hpp"
+} // namespace inja
+#endif // INCLUDE_INJA_FUNCTION_STORAGE_HPP_
+// #include "parser.hpp"
+// Copyright (c) 2020 Pantor. All rights reserved.
-namespace inja {
+#ifndef INCLUDE_INJA_PARSER_HPP_
+#define INCLUDE_INJA_PARSER_HPP_
+
+#include <limits>
+#include <stack>
+#include <string>
+#include <utility>
+#include <queue>
+#include <vector>
-using namespace nlohmann;
+// #include "config.hpp"
-using Arguments = std::vector<const json*>;
-using CallbackFunction = std::function<json(Arguments& args)>;
+// #include "exceptions.hpp"
+// Copyright (c) 2020 Pantor. All rights reserved.
-/*!
- * \brief Class for builtin functions and user-defined callbacks.
- */
-class FunctionStorage {
- public:
- void add_builtin(nonstd::string_view name, unsigned int num_args, Bytecode::Op op) {
- auto& data = get_or_new(name, num_args);
- data.op = op;
- }
+#ifndef INCLUDE_INJA_EXCEPTIONS_HPP_
+#define INCLUDE_INJA_EXCEPTIONS_HPP_
- void add_callback(nonstd::string_view name, unsigned int num_args, const CallbackFunction& function) {
- auto& data = get_or_new(name, num_args);
- data.function = function;
- }
+#include <stdexcept>
+#include <string>
- Bytecode::Op find_builtin(nonstd::string_view name, unsigned int num_args) const {
- if (auto ptr = get(name, num_args)) {
- return ptr->op;
- }
- return Bytecode::Op::Nop;
- }
+namespace inja {
- CallbackFunction find_callback(nonstd::string_view name, unsigned int num_args) const {
- if (auto ptr = get(name, num_args)) {
- return ptr->function;
- }
- return nullptr;
- }
+struct SourceLocation {
+ size_t line;
+ size_t column;
+};
- private:
- struct FunctionData {
- unsigned int num_args {0};
- Bytecode::Op op {Bytecode::Op::Nop}; // for builtins
- CallbackFunction function; // for callbacks
- };
+struct InjaError : public std::runtime_error {
+ const std::string type;
+ const std::string message;
- FunctionData& get_or_new(nonstd::string_view name, unsigned int num_args) {
- auto &vec = m_map[static_cast<std::string>(name)];
- for (auto &i: vec) {
- if (i.num_args == num_args) return i;
- }
- vec.emplace_back();
- vec.back().num_args = num_args;
- return vec.back();
- }
+ const SourceLocation location;
- const FunctionData* get(nonstd::string_view name, unsigned int num_args) const {
- auto it = m_map.find(static_cast<std::string>(name));
- if (it == m_map.end()) return nullptr;
- for (auto &&i: it->second) {
- if (i.num_args == num_args) return &i;
- }
- return nullptr;
- }
+ explicit InjaError(const std::string &type, const std::string &message)
+ : std::runtime_error("[inja.exception." + type + "] " + message), type(type), message(message), location({0, 0}) {}
- std::map<std::string, std::vector<FunctionData>> m_map;
+ explicit InjaError(const std::string &type, const std::string &message, SourceLocation location)
+ : std::runtime_error("[inja.exception." + type + "] (at " + std::to_string(location.line) + ":" +
+ std::to_string(location.column) + ") " + message),
+ type(type), message(message), location(location) {}
};
-}
+struct ParserError : public InjaError {
+ explicit ParserError(const std::string &message, SourceLocation location) : InjaError("parser_error", message, location) {}
+};
-#endif // PANTOR_INJA_FUNCTION_STORAGE_HPP
+struct RenderError : public InjaError {
+ explicit RenderError(const std::string &message, SourceLocation location) : InjaError("render_error", message, location) {}
+};
-// #include "parser.hpp"
-#ifndef PANTOR_INJA_PARSER_HPP
-#define PANTOR_INJA_PARSER_HPP
+struct FileError : public InjaError {
+ explicit FileError(const std::string &message) : InjaError("file_error", message) {}
+ explicit FileError(const std::string &message, SourceLocation location) : InjaError("file_error", message, location) {}
+};
-#include <limits>
-#include <string>
-#include <utility>
-#include <vector>
+struct JsonError : public InjaError {
+ explicit JsonError(const std::string &message, SourceLocation location) : InjaError("json_error", message, location) {}
+};
-// #include "bytecode.hpp"
+} // namespace inja
-// #include "config.hpp"
+#endif // INCLUDE_INJA_EXCEPTIONS_HPP_
// #include "function_storage.hpp"
// #include "lexer.hpp"
-#ifndef PANTOR_INJA_LEXER_HPP
-#define PANTOR_INJA_LEXER_HPP
+// Copyright (c) 2020 Pantor. All rights reserved.
+
+#ifndef INCLUDE_INJA_LEXER_HPP_
+#define INCLUDE_INJA_LEXER_HPP_
#include <cctype>
#include <locale>
@@ -1694,130 +1737,157 @@ class FunctionStorage {
// #include "config.hpp"
// #include "token.hpp"
-#ifndef PANTOR_INJA_TOKEN_HPP
-#define PANTOR_INJA_TOKEN_HPP
+// Copyright (c) 2020 Pantor. All rights reserved.
+
+#ifndef INCLUDE_INJA_TOKEN_HPP_
+#define INCLUDE_INJA_TOKEN_HPP_
#include <string>
// #include "string_view.hpp"
-
namespace inja {
/*!
- * \brief Helper-class for the inja Parser.
+ * \brief Helper-class for the inja Lexer.
*/
struct Token {
enum class Kind {
Text,
- ExpressionOpen, // {{
- ExpressionClose, // }}
- LineStatementOpen, // ##
- LineStatementClose, // \n
- StatementOpen, // {%
- StatementClose, // %}
- CommentOpen, // {#
- CommentClose, // #}
- Id, // this, this.foo
- Number, // 1, 2, -1, 5.2, -5.3
- String, // "this"
- Comma, // ,
- Colon, // :
- LeftParen, // (
- RightParen, // )
- LeftBracket, // [
- RightBracket, // ]
- LeftBrace, // {
- RightBrace, // }
- Equal, // ==
- GreaterThan, // >
- GreaterEqual, // >=
- LessThan, // <
- LessEqual, // <=
- NotEqual, // !=
+ ExpressionOpen, // {{
+ ExpressionClose, // }}
+ LineStatementOpen, // ##
+ LineStatementClose, // \n
+ StatementOpen, // {%
+ StatementClose, // %}
+ CommentOpen, // {#
+ CommentClose, // #}
+ Id, // this, this.foo
+ Number, // 1, 2, -1, 5.2, -5.3
+ String, // "this"
+ Plus, // +
+ Minus, // -
+ Times, // *
+ Slash, // /
+ Percent, // %
+ Power, // ^
+ Comma, // ,
+ Dot, // .
+ Colon, // :
+ LeftParen, // (
+ RightParen, // )
+ LeftBracket, // [
+ RightBracket, // ]
+ LeftBrace, // {
+ RightBrace, // }
+ Equal, // ==
+ NotEqual, // !=
+ GreaterThan, // >
+ GreaterEqual, // >=
+ LessThan, // <
+ LessEqual, // <=
Unknown,
- Eof
- } kind {Kind::Unknown};
-
+ Eof,
+ };
+
+ Kind kind {Kind::Unknown};
nonstd::string_view text;
- constexpr Token() = default;
- constexpr Token(Kind kind, nonstd::string_view text): kind(kind), text(text) {}
+ explicit constexpr Token() = default;
+ explicit constexpr Token(Kind kind, nonstd::string_view text) : kind(kind), text(text) {}
std::string describe() const {
switch (kind) {
- case Kind::Text:
- return "<text>";
- case Kind::LineStatementClose:
- return "<eol>";
- case Kind::Eof:
- return "<eof>";
- default:
- return static_cast<std::string>(text);
+ case Kind::Text:
+ return "<text>";
+ case Kind::LineStatementClose:
+ return "<eol>";
+ case Kind::Eof:
+ return "<eof>";
+ default:
+ return static_cast<std::string>(text);
}
}
};
-}
+} // namespace inja
-#endif // PANTOR_INJA_TOKEN_HPP
+#endif // INCLUDE_INJA_TOKEN_HPP_
// #include "utils.hpp"
-#ifndef PANTOR_INJA_UTILS_HPP
-#define PANTOR_INJA_UTILS_HPP
+// Copyright (c) 2020 Pantor. All rights reserved.
+
+#ifndef INCLUDE_INJA_UTILS_HPP_
+#define INCLUDE_INJA_UTILS_HPP_
#include <algorithm>
#include <fstream>
-#include <stdexcept>
#include <string>
#include <utility>
-// #include "string_view.hpp"
+// #include "exceptions.hpp"
+// #include "string_view.hpp"
namespace inja {
-inline void inja_throw(const std::string& type, const std::string& message) {
- throw std::runtime_error("[inja.exception." + type + "] " + message);
-}
-
-inline std::ifstream open_file_or_throw(const std::string& path) {
- std::ifstream file;
+inline void open_file_or_throw(const std::string &path, std::ifstream &file) {
file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
try {
file.open(path);
- } catch(const std::ios_base::failure& e) {
- inja_throw("file_error", "failed accessing file at '" + path + "'");
+ } catch (const std::ios_base::failure & /*e*/) {
+ throw FileError("failed accessing file at '" + path + "'");
}
- return file;
}
namespace string_view {
- inline nonstd::string_view slice(nonstd::string_view view, size_t start, size_t end) {
- start = std::min(start, view.size());
- end = std::min(std::max(start, end), view.size());
- return view.substr(start, end - start); // StringRef(Data + Start, End - Start);
+inline nonstd::string_view slice(nonstd::string_view view, size_t start, size_t end) {
+ start = std::min(start, view.size());
+ end = std::min(std::max(start, end), view.size());
+ return view.substr(start, end - start);
+}
+
+inline std::pair<nonstd::string_view, nonstd::string_view> split(nonstd::string_view view, char Separator) {
+ size_t idx = view.find(Separator);
+ if (idx == nonstd::string_view::npos) {
+ return std::make_pair(view, nonstd::string_view());
}
+ return std::make_pair(slice(view, 0, idx), slice(view, idx + 1, nonstd::string_view::npos));
+}
- inline std::pair<nonstd::string_view, nonstd::string_view> split(nonstd::string_view view, char Separator) {
- size_t idx = view.find(Separator);
- if (idx == nonstd::string_view::npos) {
- return std::make_pair(view, nonstd::string_view());
- }
- return std::make_pair(slice(view, 0, idx), slice(view, idx + 1, nonstd::string_view::npos));
+inline bool starts_with(nonstd::string_view view, nonstd::string_view prefix) {
+ return (view.size() >= prefix.size() && view.compare(0, prefix.size(), prefix) == 0);
+}
+} // namespace string_view
+
+inline SourceLocation get_source_location(nonstd::string_view content, size_t pos) {
+ // Get line and offset position (starts at 1:1)
+ auto sliced = string_view::slice(content, 0, pos);
+ std::size_t last_newline = sliced.rfind("\n");
+
+ if (last_newline == nonstd::string_view::npos) {
+ return {1, sliced.length() + 1};
}
- inline bool starts_with(nonstd::string_view view, nonstd::string_view prefix) {
- return (view.size() >= prefix.size() && view.compare(0, prefix.size(), prefix) == 0);
+ // Count newlines
+ size_t count_lines = 0;
+ size_t search_start = 0;
+ while (search_start <= sliced.size()) {
+ search_start = sliced.find("\n", search_start) + 1;
+ if (search_start == 0) {
+ break;
+ }
+ count_lines += 1;
}
-} // namespace string
-} // namespace inja
+ return {count_lines + 1, sliced.length() - last_newline};
+}
-#endif // PANTOR_INJA_UTILS_HPP
+} // namespace inja
+#endif // INCLUDE_INJA_UTILS_HPP_
namespace inja {
@@ -1829,236 +1899,188 @@ class Lexer {
enum class State {
Text,
ExpressionStart,
+ ExpressionStartForceLstrip,
ExpressionBody,
LineStart,
LineBody,
StatementStart,
+ StatementStartNoLstrip,
+ StatementStartForceLstrip,
StatementBody,
CommentStart,
- CommentBody
- } m_state;
-
- const LexerConfig& m_config;
- nonstd::string_view m_in;
- size_t m_tok_start;
- size_t m_pos;
-
- public:
- explicit Lexer(const LexerConfig& config) : m_config(config) {}
-
- void start(nonstd::string_view in) {
- m_in = in;
- m_tok_start = 0;
- m_pos = 0;
- m_state = State::Text;
- }
-
- Token scan() {
- m_tok_start = m_pos;
+ CommentBody,
+ };
- again:
- if (m_tok_start >= m_in.size()) return make_token(Token::Kind::Eof);
+ enum class MinusState {
+ Operator,
+ Number,
+ };
- switch (m_state) {
- default:
- case State::Text: {
- // fast-scan to first open character
- size_t open_start = m_in.substr(m_pos).find_first_of(m_config.open_chars);
- if (open_start == nonstd::string_view::npos) {
- // didn't find open, return remaining text as text token
- m_pos = m_in.size();
- return make_token(Token::Kind::Text);
- }
- m_pos += open_start;
-
- // try to match one of the opening sequences, and get the close
- nonstd::string_view open_str = m_in.substr(m_pos);
- bool must_lstrip = false;
- if (inja::string_view::starts_with(open_str, m_config.expression_open)) {
- m_state = State::ExpressionStart;
- } else if (inja::string_view::starts_with(open_str, m_config.statement_open)) {
- m_state = State::StatementStart;
- must_lstrip = m_config.lstrip_blocks;
- } else if (inja::string_view::starts_with(open_str, m_config.comment_open)) {
- m_state = State::CommentStart;
- must_lstrip = m_config.lstrip_blocks;
- } else if ((m_pos == 0 || m_in[m_pos - 1] == '\n') &&
- inja::string_view::starts_with(open_str, m_config.line_statement)) {
- m_state = State::LineStart;
- } else {
- m_pos += 1; // wasn't actually an opening sequence
- goto again;
- }
+ const LexerConfig &config;
- nonstd::string_view text = string_view::slice(m_in, m_tok_start, m_pos);
- if (must_lstrip)
- text = clear_final_line_if_whitespace(text);
-
- if (text.empty()) goto again; // don't generate empty token
- return Token(Token::Kind::Text, text);
- }
- case State::ExpressionStart: {
- m_state = State::ExpressionBody;
- m_pos += m_config.expression_open.size();
- return make_token(Token::Kind::ExpressionOpen);
- }
- case State::LineStart: {
- m_state = State::LineBody;
- m_pos += m_config.line_statement.size();
- return make_token(Token::Kind::LineStatementOpen);
- }
- case State::StatementStart: {
- m_state = State::StatementBody;
- m_pos += m_config.statement_open.size();
- return make_token(Token::Kind::StatementOpen);
- }
- case State::CommentStart: {
- m_state = State::CommentBody;
- m_pos += m_config.comment_open.size();
- return make_token(Token::Kind::CommentOpen);
- }
- case State::ExpressionBody:
- return scan_body(m_config.expression_close, Token::Kind::ExpressionClose);
- case State::LineBody:
- return scan_body("\n", Token::Kind::LineStatementClose);
- case State::StatementBody:
- return scan_body(m_config.statement_close, Token::Kind::StatementClose, m_config.trim_blocks);
- case State::CommentBody: {
- // fast-scan to comment close
- size_t end = m_in.substr(m_pos).find(m_config.comment_close);
- if (end == nonstd::string_view::npos) {
- m_pos = m_in.size();
- return make_token(Token::Kind::Eof);
- }
- // return the entire comment in the close token
- m_state = State::Text;
- m_pos += end + m_config.comment_close.size();
- Token tok = make_token(Token::Kind::CommentClose);
- if (m_config.trim_blocks)
- skip_newline();
- return tok;
- }
- }
- }
+ State state;
+ MinusState minus_state;
+ nonstd::string_view m_in;
+ size_t tok_start;
+ size_t pos;
- const LexerConfig& get_config() const { return m_config; }
- private:
- Token scan_body(nonstd::string_view close, Token::Kind closeKind, bool trim = false) {
+ Token scan_body(nonstd::string_view close, Token::Kind closeKind, nonstd::string_view close_trim = nonstd::string_view(), bool trim = false) {
again:
// skip whitespace (except for \n as it might be a close)
- if (m_tok_start >= m_in.size()) return make_token(Token::Kind::Eof);
- char ch = m_in[m_tok_start];
+ if (tok_start >= m_in.size()) {
+ return make_token(Token::Kind::Eof);
+ }
+ char ch = m_in[tok_start];
if (ch == ' ' || ch == '\t' || ch == '\r') {
- m_tok_start += 1;
+ tok_start += 1;
goto again;
}
// check for close
- if (inja::string_view::starts_with(m_in.substr(m_tok_start), close)) {
- m_state = State::Text;
- m_pos = m_tok_start + close.size();
+ if (!close_trim.empty() && inja::string_view::starts_with(m_in.substr(tok_start), close_trim)) {
+ state = State::Text;
+ pos = tok_start + close_trim.size();
+ Token tok = make_token(closeKind);
+ skip_whitespaces_and_newlines();
+ return tok;
+ }
+
+ if (inja::string_view::starts_with(m_in.substr(tok_start), close)) {
+ state = State::Text;
+ pos = tok_start + close.size();
Token tok = make_token(closeKind);
- if (trim)
- skip_newline();
+ if (trim) {
+ skip_whitespaces_and_first_newline();
+ }
return tok;
}
// skip \n
if (ch == '\n') {
- m_tok_start += 1;
+ tok_start += 1;
goto again;
}
- m_pos = m_tok_start + 1;
- if (std::isalpha(ch)) return scan_id();
+ pos = tok_start + 1;
+ if (std::isalpha(ch)) {
+ minus_state = MinusState::Operator;
+ return scan_id();
+ }
+
+ MinusState current_minus_state = minus_state;
+ if (minus_state == MinusState::Operator) {
+ minus_state = MinusState::Number;
+ }
+
switch (ch) {
- case ',':
- return make_token(Token::Kind::Comma);
- case ':':
- return make_token(Token::Kind::Colon);
- case '(':
- return make_token(Token::Kind::LeftParen);
- case ')':
- return make_token(Token::Kind::RightParen);
- case '[':
- return make_token(Token::Kind::LeftBracket);
- case ']':
- return make_token(Token::Kind::RightBracket);
- case '{':
- return make_token(Token::Kind::LeftBrace);
- case '}':
- return make_token(Token::Kind::RightBrace);
- case '>':
- if (m_pos < m_in.size() && m_in[m_pos] == '=') {
- m_pos += 1;
- return make_token(Token::Kind::GreaterEqual);
- }
- return make_token(Token::Kind::GreaterThan);
- case '<':
- if (m_pos < m_in.size() && m_in[m_pos] == '=') {
- m_pos += 1;
- return make_token(Token::Kind::LessEqual);
- }
- return make_token(Token::Kind::LessThan);
- case '=':
- if (m_pos < m_in.size() && m_in[m_pos] == '=') {
- m_pos += 1;
- return make_token(Token::Kind::Equal);
- }
- return make_token(Token::Kind::Unknown);
- case '!':
- if (m_pos < m_in.size() && m_in[m_pos] == '=') {
- m_pos += 1;
- return make_token(Token::Kind::NotEqual);
- }
- return make_token(Token::Kind::Unknown);
- case '\"':
- return scan_string();
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- case '-':
- return scan_number();
- case '_':
- return scan_id();
- default:
- return make_token(Token::Kind::Unknown);
+ case '+':
+ return make_token(Token::Kind::Plus);
+ case '-':
+ if (current_minus_state == MinusState::Operator) {
+ return make_token(Token::Kind::Minus);
+ }
+ return scan_number();
+ case '*':
+ return make_token(Token::Kind::Times);
+ case '/':
+ return make_token(Token::Kind::Slash);
+ case '^':
+ return make_token(Token::Kind::Power);
+ case '%':
+ return make_token(Token::Kind::Percent);
+ case '.':
+ return make_token(Token::Kind::Dot);
+ case ',':
+ return make_token(Token::Kind::Comma);
+ case ':':
+ return make_token(Token::Kind::Colon);
+ case '(':
+ return make_token(Token::Kind::LeftParen);
+ case ')':
+ minus_state = MinusState::Operator;
+ return make_token(Token::Kind::RightParen);
+ case '[':
+ return make_token(Token::Kind::LeftBracket);
+ case ']':
+ minus_state = MinusState::Operator;
+ return make_token(Token::Kind::RightBracket);
+ case '{':
+ return make_token(Token::Kind::LeftBrace);
+ case '}':
+ minus_state = MinusState::Operator;
+ return make_token(Token::Kind::RightBrace);
+ case '>':
+ if (pos < m_in.size() && m_in[pos] == '=') {
+ pos += 1;
+ return make_token(Token::Kind::GreaterEqual);
+ }
+ return make_token(Token::Kind::GreaterThan);
+ case '<':
+ if (pos < m_in.size() && m_in[pos] == '=') {
+ pos += 1;
+ return make_token(Token::Kind::LessEqual);
+ }
+ return make_token(Token::Kind::LessThan);
+ case '=':
+ if (pos < m_in.size() && m_in[pos] == '=') {
+ pos += 1;
+ return make_token(Token::Kind::Equal);
+ }
+ return make_token(Token::Kind::Unknown);
+ case '!':
+ if (pos < m_in.size() && m_in[pos] == '=') {
+ pos += 1;
+ return make_token(Token::Kind::NotEqual);
+ }
+ return make_token(Token::Kind::Unknown);
+ case '\"':
+ return scan_string();
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ minus_state = MinusState::Operator;
+ return scan_number();
+ case '_':
+ minus_state = MinusState::Operator;
+ return scan_id();
+ default:
+ return make_token(Token::Kind::Unknown);
}
}
Token scan_id() {
for (;;) {
- if (m_pos >= m_in.size()) {
+ if (pos >= m_in.size()) {
break;
}
- char ch = m_in[m_pos];
+ char ch = m_in[pos];
if (!std::isalnum(ch) && ch != '.' && ch != '/' && ch != '_' && ch != '-') {
break;
}
- m_pos += 1;
+ pos += 1;
}
return make_token(Token::Kind::Id);
}
Token scan_number() {
for (;;) {
- if (m_pos >= m_in.size()) {
+ if (pos >= m_in.size()) {
break;
}
- char ch = m_in[m_pos];
+ char ch = m_in[pos];
// be very permissive in lexer (we'll catch errors when conversion happens)
if (!std::isdigit(ch) && ch != '.' && ch != 'e' && ch != 'E' && ch != '+' && ch != '-') {
break;
}
- m_pos += 1;
+ pos += 1;
}
return make_token(Token::Kind::Number);
}
@@ -2066,11 +2088,13 @@ class Lexer {
Token scan_string() {
bool escape {false};
for (;;) {
- if (m_pos >= m_in.size()) break;
- char ch = m_in[m_pos++];
+ if (pos >= m_in.size()) {
+ break;
+ }
+ char ch = m_in[pos++];
if (ch == '\\') {
escape = true;
- } else if (!escape && ch == m_in[m_tok_start]) {
+ } else if (!escape && ch == m_in[tok_start]) {
break;
} else {
escape = false;
@@ -2079,52 +2103,615 @@ class Lexer {
return make_token(Token::Kind::String);
}
- Token make_token(Token::Kind kind) const {
- return Token(kind, string_view::slice(m_in, m_tok_start, m_pos));
+ Token make_token(Token::Kind kind) const { return Token(kind, string_view::slice(m_in, tok_start, pos)); }
+
+ void skip_whitespaces_and_newlines() {
+ if (pos < m_in.size()) {
+ while (pos < m_in.size() && (m_in[pos] == ' ' || m_in[pos] == '\t' || m_in[pos] == '\n' || m_in[pos] == '\r')) {
+ pos += 1;
+ }
+ }
}
- void skip_newline() {
- if (m_pos < m_in.size()) {
- char ch = m_in[m_pos];
- if (ch == '\n')
- m_pos += 1;
- else if (ch == '\r') {
- m_pos += 1;
- if (m_pos < m_in.size() && m_in[m_pos] == '\n')
- m_pos += 1;
+ void skip_whitespaces_and_first_newline() {
+ if (pos < m_in.size()) {
+ while (pos < m_in.size() && (m_in[pos] == ' ' || m_in[pos] == '\t')) {
+ pos += 1;
+ }
+ }
+
+ if (pos < m_in.size()) {
+ char ch = m_in[pos];
+ if (ch == '\n') {
+ pos += 1;
+ } else if (ch == '\r') {
+ pos += 1;
+ if (pos < m_in.size() && m_in[pos] == '\n') {
+ pos += 1;
+ }
}
}
}
- static nonstd::string_view clear_final_line_if_whitespace(nonstd::string_view text)
- {
+ static nonstd::string_view clear_final_line_if_whitespace(nonstd::string_view text) {
nonstd::string_view result = text;
while (!result.empty()) {
char ch = result.back();
- if (ch == ' ' || ch == '\t')
- result.remove_suffix(1);
- else if (ch == '\n' || ch == '\r')
+ if (ch == ' ' || ch == '\t') {
+ result.remove_suffix(1);
+ } else if (ch == '\n' || ch == '\r') {
break;
- else
+ } else {
return text;
+ }
}
return result;
}
+
+public:
+ explicit Lexer(const LexerConfig &config) : config(config), state(State::Text), minus_state(MinusState::Number) {}
+
+ SourceLocation current_position() const {
+ return get_source_location(m_in, tok_start);
+ }
+
+ void start(nonstd::string_view input) {
+ m_in = input;
+ tok_start = 0;
+ pos = 0;
+ state = State::Text;
+ minus_state = MinusState::Number;
+
+ // Consume byte order mark (BOM) for UTF-8
+ if (inja::string_view::starts_with(m_in, "\xEF\xBB\xBF")) {
+ m_in = m_in.substr(3);
+ }
+ }
+
+ Token scan() {
+ tok_start = pos;
+
+ again:
+ if (tok_start >= m_in.size()) {
+ return make_token(Token::Kind::Eof);
+ }
+
+ switch (state) {
+ default:
+ case State::Text: {
+ // fast-scan to first open character
+ size_t open_start = m_in.substr(pos).find_first_of(config.open_chars);
+ if (open_start == nonstd::string_view::npos) {
+ // didn't find open, return remaining text as text token
+ pos = m_in.size();
+ return make_token(Token::Kind::Text);
+ }
+ pos += open_start;
+
+ // try to match one of the opening sequences, and get the close
+ nonstd::string_view open_str = m_in.substr(pos);
+ bool must_lstrip = false;
+ if (inja::string_view::starts_with(open_str, config.expression_open)) {
+ if (inja::string_view::starts_with(open_str, config.expression_open_force_lstrip)) {
+ state = State::ExpressionStartForceLstrip;
+ must_lstrip = true;
+ } else {
+ state = State::ExpressionStart;
+ }
+ } else if (inja::string_view::starts_with(open_str, config.statement_open)) {
+ if (inja::string_view::starts_with(open_str, config.statement_open_no_lstrip)) {
+ state = State::StatementStartNoLstrip;
+ } else if (inja::string_view::starts_with(open_str, config.statement_open_force_lstrip )) {
+ state = State::StatementStartForceLstrip;
+ must_lstrip = true;
+ } else {
+ state = State::StatementStart;
+ must_lstrip = config.lstrip_blocks;
+ }
+ } else if (inja::string_view::starts_with(open_str, config.comment_open)) {
+ state = State::CommentStart;
+ must_lstrip = config.lstrip_blocks;
+ } else if ((pos == 0 || m_in[pos - 1] == '\n') && inja::string_view::starts_with(open_str, config.line_statement)) {
+ state = State::LineStart;
+ } else {
+ pos += 1; // wasn't actually an opening sequence
+ goto again;
+ }
+
+ nonstd::string_view text = string_view::slice(m_in, tok_start, pos);
+ if (must_lstrip) {
+ text = clear_final_line_if_whitespace(text);
+ }
+
+ if (text.empty()) {
+ goto again; // don't generate empty token
+ }
+ return Token(Token::Kind::Text, text);
+ }
+ case State::ExpressionStart: {
+ state = State::ExpressionBody;
+ pos += config.expression_open.size();
+ return make_token(Token::Kind::ExpressionOpen);
+ }
+ case State::ExpressionStartForceLstrip: {
+ state = State::ExpressionBody;
+ pos += config.expression_open_force_lstrip.size();
+ return make_token(Token::Kind::ExpressionOpen);
+ }
+ case State::LineStart: {
+ state = State::LineBody;
+ pos += config.line_statement.size();
+ return make_token(Token::Kind::LineStatementOpen);
+ }
+ case State::StatementStart: {
+ state = State::StatementBody;
+ pos += config.statement_open.size();
+ return make_token(Token::Kind::StatementOpen);
+ }
+ case State::StatementStartNoLstrip: {
+ state = State::StatementBody;
+ pos += config.statement_open_no_lstrip.size();
+ return make_token(Token::Kind::StatementOpen);
+ }
+ case State::StatementStartForceLstrip: {
+ state = State::StatementBody;
+ pos += config.statement_open_force_lstrip.size();
+ return make_token(Token::Kind::StatementOpen);
+ }
+ case State::CommentStart: {
+ state = State::CommentBody;
+ pos += config.comment_open.size();
+ return make_token(Token::Kind::CommentOpen);
+ }
+ case State::ExpressionBody:
+ return scan_body(config.expression_close, Token::Kind::ExpressionClose, config.expression_close_force_rstrip);
+ case State::LineBody:
+ return scan_body("\n", Token::Kind::LineStatementClose);
+ case State::StatementBody:
+ return scan_body(config.statement_close, Token::Kind::StatementClose, config.statement_close_force_rstrip, config.trim_blocks);
+ case State::CommentBody: {
+ // fast-scan to comment close
+ size_t end = m_in.substr(pos).find(config.comment_close);
+ if (end == nonstd::string_view::npos) {
+ pos = m_in.size();
+ return make_token(Token::Kind::Eof);
+ }
+ // return the entire comment in the close token
+ state = State::Text;
+ pos += end + config.comment_close.size();
+ Token tok = make_token(Token::Kind::CommentClose);
+ if (config.trim_blocks) {
+ skip_whitespaces_and_first_newline();
+ }
+ return tok;
+ }
+ }
+ }
+
+ const LexerConfig &get_config() const {
+ return config;
+ }
};
-}
+} // namespace inja
+
+#endif // INCLUDE_INJA_LEXER_HPP_
+
+// #include "node.hpp"
+// Copyright (c) 2020 Pantor. All rights reserved.
+
+#ifndef INCLUDE_INJA_NODE_HPP_
+#define INCLUDE_INJA_NODE_HPP_
+
+#include <string>
+#include <utility>
+
+#include <nlohmann/json.hpp>
+
+// #include "function_storage.hpp"
+
+// #include "string_view.hpp"
+
+
+
+namespace inja {
+
+class NodeVisitor;
+class BlockNode;
+class TextNode;
+class ExpressionNode;
+class LiteralNode;
+class JsonNode;
+class FunctionNode;
+class ExpressionListNode;
+class StatementNode;
+class ForStatementNode;
+class ForArrayStatementNode;
+class ForObjectStatementNode;
+class IfStatementNode;
+class IncludeStatementNode;
+class SetStatementNode;
+
+
+class NodeVisitor {
+public:
+ virtual void visit(const BlockNode& node) = 0;
+ virtual void visit(const TextNode& node) = 0;
+ virtual void visit(const ExpressionNode& node) = 0;
+ virtual void visit(const LiteralNode& node) = 0;
+ virtual void visit(const JsonNode& node) = 0;
+ virtual void visit(const FunctionNode& node) = 0;
+ virtual void visit(const ExpressionListNode& node) = 0;
+ virtual void visit(const StatementNode& node) = 0;
+ virtual void visit(const ForStatementNode& node) = 0;
+ virtual void visit(const ForArrayStatementNode& node) = 0;
+ virtual void visit(const ForObjectStatementNode& node) = 0;
+ virtual void visit(const IfStatementNode& node) = 0;
+ virtual void visit(const IncludeStatementNode& node) = 0;
+ virtual void visit(const SetStatementNode& node) = 0;
+};
+
+/*!
+ * \brief Base node class for the abstract syntax tree (AST).
+ */
+class AstNode {
+public:
+ virtual void accept(NodeVisitor& v) const = 0;
+
+ size_t pos;
+
+ AstNode(size_t pos) : pos(pos) { }
+ virtual ~AstNode() { };
+};
+
+
+class BlockNode : public AstNode {
+public:
+ std::vector<std::shared_ptr<AstNode>> nodes;
+
+ explicit BlockNode() : AstNode(0) {}
+
+ void accept(NodeVisitor& v) const {
+ v.visit(*this);
+ }
+};
+
+class TextNode : public AstNode {
+public:
+ const size_t length;
+
+ explicit TextNode(size_t pos, size_t length): AstNode(pos), length(length) { }
+
+ void accept(NodeVisitor& v) const {
+ v.visit(*this);
+ }
+};
+
+class ExpressionNode : public AstNode {
+public:
+ explicit ExpressionNode(size_t pos) : AstNode(pos) {}
+
+ void accept(NodeVisitor& v) const {
+ v.visit(*this);
+ }
+};
+
+class LiteralNode : public ExpressionNode {
+public:
+ const nlohmann::json value;
+
+ explicit LiteralNode(const nlohmann::json& value, size_t pos) : ExpressionNode(pos), value(value) { }
+
+ void accept(NodeVisitor& v) const {
+ v.visit(*this);
+ }
+};
+
+class JsonNode : public ExpressionNode {
+public:
+ const std::string name;
+ const json::json_pointer ptr;
+
+ static std::string convert_dot_to_json_ptr(nonstd::string_view ptr_name) {
+ std::string result;
+ do {
+ nonstd::string_view part;
+ std::tie(part, ptr_name) = string_view::split(ptr_name, '.');
+ result.push_back('/');
+ result.append(part.begin(), part.end());
+ } while (!ptr_name.empty());
+ return result;
+ }
+
+ explicit JsonNode(nonstd::string_view ptr_name, size_t pos) : ExpressionNode(pos), name(ptr_name), ptr(json::json_pointer(convert_dot_to_json_ptr(ptr_name))) { }
+
+ void accept(NodeVisitor& v) const {
+ v.visit(*this);
+ }
+};
+
+class FunctionNode : public ExpressionNode {
+ using Op = FunctionStorage::Operation;
+
+public:
+ enum class Associativity {
+ Left,
+ Right,
+ };
+
+ unsigned int precedence;
+ Associativity associativity;
+
+ Op operation;
+
+ std::string name;
+ int number_args; // Should also be negative -> -1 for unknown number
+ CallbackFunction callback;
+
+ explicit FunctionNode(nonstd::string_view name, size_t pos) : ExpressionNode(pos), precedence(8), associativity(Associativity::Left), operation(Op::Callback), name(name), number_args(1) { }
+ explicit FunctionNode(Op operation, size_t pos) : ExpressionNode(pos), operation(operation), number_args(1) {
+ switch (operation) {
+ case Op::Not: {
+ precedence = 4;
+ associativity = Associativity::Left;
+ } break;
+ case Op::And: {
+ precedence = 1;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Or: {
+ precedence = 1;
+ associativity = Associativity::Left;
+ } break;
+ case Op::In: {
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Equal: {
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::NotEqual: {
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Greater: {
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::GreaterEqual: {
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Less: {
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::LessEqual: {
+ precedence = 2;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Add: {
+ precedence = 3;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Subtract: {
+ precedence = 3;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Multiplication: {
+ precedence = 4;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Division: {
+ precedence = 4;
+ associativity = Associativity::Left;
+ } break;
+ case Op::Power: {
+ precedence = 5;
+ associativity = Associativity::Right;
+ } break;
+ case Op::Modulo: {
+ precedence = 4;
+ associativity = Associativity::Left;
+ } break;
+ case Op::AtId: {
+ precedence = 8;
+ associativity = Associativity::Left;
+ } break;
+ default: {
+ precedence = 1;
+ associativity = Associativity::Left;
+ }
+ }
+ }
+
+ void accept(NodeVisitor& v) const {
+ v.visit(*this);
+ }
+};
+
+class ExpressionListNode : public AstNode {
+public:
+ std::vector<std::shared_ptr<ExpressionNode>> rpn_output;
+
+ explicit ExpressionListNode() : AstNode(0) { }
+ explicit ExpressionListNode(size_t pos) : AstNode(pos) { }
+
+ void accept(NodeVisitor& v) const {
+ v.visit(*this);
+ }
+};
+
+class StatementNode : public AstNode {
+public:
+ StatementNode(size_t pos) : AstNode(pos) { }
+
+ virtual void accept(NodeVisitor& v) const = 0;
+};
+
+class ForStatementNode : public StatementNode {
+public:
+ ExpressionListNode condition;
+ BlockNode body;
+ BlockNode *const parent;
+
+ ForStatementNode(BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent) { }
+
+ virtual void accept(NodeVisitor& v) const = 0;
+};
+
+class ForArrayStatementNode : public ForStatementNode {
+public:
+ const std::string value;
+
+ explicit ForArrayStatementNode(const std::string& value, BlockNode *const parent, size_t pos) : ForStatementNode(parent, pos), value(value) { }
+
+ void accept(NodeVisitor& v) const {
+ v.visit(*this);
+ }
+};
-#endif // PANTOR_INJA_LEXER_HPP
+class ForObjectStatementNode : public ForStatementNode {
+public:
+ const std::string key;
+ const std::string value;
+
+ explicit ForObjectStatementNode(const std::string& key, const std::string& value, BlockNode *const parent, size_t pos) : ForStatementNode(parent, pos), key(key), value(value) { }
+
+ void accept(NodeVisitor& v) const {
+ v.visit(*this);
+ }
+};
+
+class IfStatementNode : public StatementNode {
+public:
+ ExpressionListNode condition;
+ BlockNode true_statement;
+ BlockNode false_statement;
+ BlockNode *const parent;
+
+ const bool is_nested;
+ bool has_false_statement {false};
+
+ explicit IfStatementNode(BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent), is_nested(false) { }
+ explicit IfStatementNode(bool is_nested, BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent), is_nested(is_nested) { }
+
+ void accept(NodeVisitor& v) const {
+ v.visit(*this);
+ }
+};
+
+class IncludeStatementNode : public StatementNode {
+public:
+ const std::string file;
+
+ explicit IncludeStatementNode(const std::string& file, size_t pos) : StatementNode(pos), file(file) { }
+
+ void accept(NodeVisitor& v) const {
+ v.visit(*this);
+ };
+};
+
+class SetStatementNode : public StatementNode {
+public:
+ const std::string key;
+ ExpressionListNode expression;
+
+ explicit SetStatementNode(const std::string& key, size_t pos) : StatementNode(pos), key(key) { }
+
+ void accept(NodeVisitor& v) const {
+ v.visit(*this);
+ };
+};
+
+} // namespace inja
+
+#endif // INCLUDE_INJA_NODE_HPP_
// #include "template.hpp"
-#ifndef PANTOR_INJA_TEMPLATE_HPP
-#define PANTOR_INJA_TEMPLATE_HPP
+// Copyright (c) 2019 Pantor. All rights reserved.
+
+#ifndef INCLUDE_INJA_TEMPLATE_HPP_
+#define INCLUDE_INJA_TEMPLATE_HPP_
#include <map>
+#include <memory>
#include <string>
#include <vector>
-// #include "bytecode.hpp"
+// #include "node.hpp"
+
+// #include "statistics.hpp"
+// Copyright (c) 2019 Pantor. All rights reserved.
+
+#ifndef INCLUDE_INJA_STATISTICS_HPP_
+#define INCLUDE_INJA_STATISTICS_HPP_
+
+// #include "node.hpp"
+
+
+
+namespace inja {
+
+/*!
+ * \brief A class for counting statistics on a Template.
+ */
+class StatisticsVisitor : public NodeVisitor {
+ void visit(const BlockNode& node) {
+ for (auto& n : node.nodes) {
+ n->accept(*this);
+ }
+ }
+
+ void visit(const TextNode&) { }
+ void visit(const ExpressionNode&) { }
+ void visit(const LiteralNode&) { }
+
+ void visit(const JsonNode&) {
+ variable_counter += 1;
+ }
+
+ void visit(const FunctionNode&) { }
+
+ void visit(const ExpressionListNode& node) {
+ for (auto& n : node.rpn_output) {
+ n->accept(*this);
+ }
+ }
+
+ void visit(const StatementNode&) { }
+ void visit(const ForStatementNode&) { }
+
+ void visit(const ForArrayStatementNode& node) {
+ node.condition.accept(*this);
+ node.body.accept(*this);
+ }
+
+ void visit(const ForObjectStatementNode& node) {
+ node.condition.accept(*this);
+ node.body.accept(*this);
+ }
+
+ void visit(const IfStatementNode& node) {
+ node.condition.accept(*this);
+ node.true_statement.accept(*this);
+ node.false_statement.accept(*this);
+ }
+
+ void visit(const IncludeStatementNode&) { }
+
+ void visit(const SetStatementNode&) { }
+
+public:
+ unsigned int variable_counter;
+
+ explicit StatisticsVisitor() : variable_counter(0) { }
+};
+
+} // namespace inja
+
+#endif // INCLUDE_INJA_STATISTICS_HPP_
@@ -2134,15 +2721,25 @@ namespace inja {
* \brief The main inja Template.
*/
struct Template {
- std::vector<Bytecode> bytecodes;
+ BlockNode root;
std::string content;
+
+ explicit Template() { }
+ explicit Template(const std::string& content): content(content) { }
+
+ /// Return number of variables (total number, not distinct ones) in the template
+ int count_variables() {
+ auto statistic_visitor = StatisticsVisitor();
+ root.accept(statistic_visitor);
+ return statistic_visitor.variable_counter;
+ }
};
using TemplateStorage = std::map<std::string, Template>;
-}
+} // namespace inja
-#endif // PANTOR_INJA_TEMPLATE_HPP
+#endif // INCLUDE_INJA_TEMPLATE_HPP_
// #include "token.hpp"
@@ -2151,484 +2748,538 @@ using TemplateStorage = std::map<std::string, Template>;
#include <nlohmann/json.hpp>
-
namespace inja {
-class ParserStatic {
- ParserStatic() {
- functions.add_builtin("at", 2, Bytecode::Op::At);
- functions.add_builtin("default", 2, Bytecode::Op::Default);
- functions.add_builtin("divisibleBy", 2, Bytecode::Op::DivisibleBy);
- functions.add_builtin("even", 1, Bytecode::Op::Even);
- functions.add_builtin("first", 1, Bytecode::Op::First);
- functions.add_builtin("float", 1, Bytecode::Op::Float);
- functions.add_builtin("int", 1, Bytecode::Op::Int);
- functions.add_builtin("last", 1, Bytecode::Op::Last);
- functions.add_builtin("length", 1, Bytecode::Op::Length);
- functions.add_builtin("lower", 1, Bytecode::Op::Lower);
- functions.add_builtin("max", 1, Bytecode::Op::Max);
- functions.add_builtin("min", 1, Bytecode::Op::Min);
- functions.add_builtin("odd", 1, Bytecode::Op::Odd);
- functions.add_builtin("range", 1, Bytecode::Op::Range);
- functions.add_builtin("round", 2, Bytecode::Op::Round);
- functions.add_builtin("sort", 1, Bytecode::Op::Sort);
- functions.add_builtin("upper", 1, Bytecode::Op::Upper);
- functions.add_builtin("exists", 1, Bytecode::Op::Exists);
- functions.add_builtin("existsIn", 2, Bytecode::Op::ExistsInObject);
- functions.add_builtin("isBoolean", 1, Bytecode::Op::IsBoolean);
- functions.add_builtin("isNumber", 1, Bytecode::Op::IsNumber);
- functions.add_builtin("isInteger", 1, Bytecode::Op::IsInteger);
- functions.add_builtin("isFloat", 1, Bytecode::Op::IsFloat);
- functions.add_builtin("isObject", 1, Bytecode::Op::IsObject);
- functions.add_builtin("isArray", 1, Bytecode::Op::IsArray);
- functions.add_builtin("isString", 1, Bytecode::Op::IsString);
- }
-
- public:
- ParserStatic(const ParserStatic&) = delete;
- ParserStatic& operator=(const ParserStatic&) = delete;
-
- static const ParserStatic& get_instance() {
- static ParserStatic inst;
- return inst;
- }
-
- FunctionStorage functions;
-};
-
/*!
* \brief Class for parsing an inja Template.
*/
class Parser {
- public:
- explicit Parser(const ParserConfig& parser_config, const LexerConfig& lexer_config, TemplateStorage& included_templates): m_config(parser_config), m_lexer(lexer_config), m_included_templates(included_templates), m_static(ParserStatic::get_instance()) { }
-
- bool parse_expression(Template& tmpl) {
- if (!parse_expression_and(tmpl)) return false;
- if (m_tok.kind != Token::Kind::Id || m_tok.text != static_cast<decltype(m_tok.text)>("or")) return true;
- get_next_token();
- if (!parse_expression_and(tmpl)) return false;
- append_function(tmpl, Bytecode::Op::Or, 2);
- return true;
- }
+ const ParserConfig &config;
- bool parse_expression_and(Template& tmpl) {
- if (!parse_expression_not(tmpl)) return false;
- if (m_tok.kind != Token::Kind::Id || m_tok.text != static_cast<decltype(m_tok.text)>("and")) return true;
- get_next_token();
- if (!parse_expression_not(tmpl)) return false;
- append_function(tmpl, Bytecode::Op::And, 2);
- return true;
+ Lexer lexer;
+ TemplateStorage &template_storage;
+ const FunctionStorage &function_storage;
+
+ Token tok, peek_tok;
+ bool have_peek_tok {false};
+
+ size_t current_paren_level {0};
+ size_t current_bracket_level {0};
+ size_t current_brace_level {0};
+
+ nonstd::string_view json_literal_start;
+
+ BlockNode *current_block {nullptr};
+ ExpressionListNode *current_expression_list {nullptr};
+ std::stack<std::pair<FunctionNode*, size_t>> function_stack;
+
+ std::stack<std::shared_ptr<FunctionNode>> operator_stack;
+ std::stack<IfStatementNode*> if_statement_stack;
+ std::stack<ForStatementNode*> for_statement_stack;
+
+ void throw_parser_error(const std::string &message) {
+ throw ParserError(message, lexer.current_position());
}
- bool parse_expression_not(Template& tmpl) {
- if (m_tok.kind == Token::Kind::Id && m_tok.text == static_cast<decltype(m_tok.text)>("not")) {
- get_next_token();
- if (!parse_expression_not(tmpl)) return false;
- append_function(tmpl, Bytecode::Op::Not, 1);
- return true;
+ void get_next_token() {
+ if (have_peek_tok) {
+ tok = peek_tok;
+ have_peek_tok = false;
} else {
- return parse_expression_comparison(tmpl);
+ tok = lexer.scan();
}
}
- bool parse_expression_comparison(Template& tmpl) {
- if (!parse_expression_datum(tmpl)) return false;
- Bytecode::Op op;
- switch (m_tok.kind) {
- case Token::Kind::Id:
- if (m_tok.text == static_cast<decltype(m_tok.text)>("in"))
- op = Bytecode::Op::In;
- else
- return true;
- break;
- case Token::Kind::Equal:
- op = Bytecode::Op::Equal;
- break;
- case Token::Kind::GreaterThan:
- op = Bytecode::Op::Greater;
- break;
- case Token::Kind::LessThan:
- op = Bytecode::Op::Less;
- break;
- case Token::Kind::LessEqual:
- op = Bytecode::Op::LessEqual;
- break;
- case Token::Kind::GreaterEqual:
- op = Bytecode::Op::GreaterEqual;
- break;
- case Token::Kind::NotEqual:
- op = Bytecode::Op::Different;
- break;
- default:
- return true;
+ void get_peek_token() {
+ if (!have_peek_tok) {
+ peek_tok = lexer.scan();
+ have_peek_tok = true;
}
- get_next_token();
- if (!parse_expression_datum(tmpl)) return false;
- append_function(tmpl, op, 2);
- return true;
}
- bool parse_expression_datum(Template& tmpl) {
- nonstd::string_view json_first;
- size_t bracket_level = 0;
- size_t brace_level = 0;
+ void add_json_literal(const char* content_ptr) {
+ nonstd::string_view json_text(json_literal_start.data(), tok.text.data() - json_literal_start.data() + tok.text.size());
+ current_expression_list->rpn_output.emplace_back(std::make_shared<LiteralNode>(json::parse(json_text), json_text.data() - content_ptr));
+ }
- for (;;) {
- switch (m_tok.kind) {
- case Token::Kind::LeftParen: {
- get_next_token();
- if (!parse_expression(tmpl)) return false;
- if (m_tok.kind != Token::Kind::RightParen) {
- inja_throw("parser_error", "unmatched '('");
+ bool parse_expression(Template &tmpl, Token::Kind closing) {
+ while (tok.kind != closing && tok.kind != Token::Kind::Eof) {
+ // Literals
+ switch (tok.kind) {
+ case Token::Kind::String: {
+ if (current_brace_level == 0 && current_bracket_level == 0) {
+ json_literal_start = tok.text;
+ add_json_literal(tmpl.content.c_str());
+ }
+
+ } break;
+ case Token::Kind::Number: {
+ if (current_brace_level == 0 && current_bracket_level == 0) {
+ json_literal_start = tok.text;
+ add_json_literal(tmpl.content.c_str());
+ }
+
+ } break;
+ case Token::Kind::LeftBracket: {
+ if (current_brace_level == 0 && current_bracket_level == 0) {
+ json_literal_start = tok.text;
+ }
+ current_bracket_level += 1;
+
+ } break;
+ case Token::Kind::LeftBrace: {
+ if (current_brace_level == 0 && current_bracket_level == 0) {
+ json_literal_start = tok.text;
+ }
+ current_brace_level += 1;
+
+ } break;
+ case Token::Kind::RightBracket: {
+ if (current_bracket_level == 0) {
+ throw_parser_error("unexpected ']'");
+ }
+
+ current_bracket_level -= 1;
+ if (current_brace_level == 0 && current_bracket_level == 0) {
+ add_json_literal(tmpl.content.c_str());
+ }
+
+ } break;
+ case Token::Kind::RightBrace: {
+ if (current_brace_level == 0) {
+ throw_parser_error("unexpected '}'");
+ }
+
+ current_brace_level -= 1;
+ if (current_brace_level == 0 && current_bracket_level == 0) {
+ add_json_literal(tmpl.content.c_str());
+ }
+
+ } break;
+ case Token::Kind::Id: {
+ get_peek_token();
+
+ // Json Literal
+ if (tok.text == static_cast<decltype(tok.text)>("true") || tok.text == static_cast<decltype(tok.text)>("false") || tok.text == static_cast<decltype(tok.text)>("null")) {
+ if (current_brace_level == 0 && current_bracket_level == 0) {
+ json_literal_start = tok.text;
+ add_json_literal(tmpl.content.c_str());
}
- get_next_token();
- return true;
+
+ // Operator
+ } else if (tok.text == "and" || tok.text == "or" || tok.text == "in" || tok.text == "not") {
+ goto parse_operator;
+
+ // Functions
+ } else if (peek_tok.kind == Token::Kind::LeftParen) {
+ operator_stack.emplace(std::make_shared<FunctionNode>(static_cast<std::string>(tok.text), tok.text.data() - tmpl.content.c_str()));
+ function_stack.emplace(operator_stack.top().get(), current_paren_level);
+
+ // Variables
+ } else {
+ current_expression_list->rpn_output.emplace_back(std::make_shared<JsonNode>(static_cast<std::string>(tok.text), tok.text.data() - tmpl.content.c_str()));
}
- case Token::Kind::Id:
- get_peek_token();
- if (m_peek_tok.kind == Token::Kind::LeftParen) {
- // function call, parse arguments
- Token func_token = m_tok;
- get_next_token(); // id
- get_next_token(); // leftParen
- unsigned int num_args = 0;
- if (m_tok.kind == Token::Kind::RightParen) {
- // no args
- get_next_token();
- } else {
- for (;;) {
- if (!parse_expression(tmpl)) {
- inja_throw("parser_error", "expected expression, got '" + m_tok.describe() + "'");
- }
- num_args += 1;
- if (m_tok.kind == Token::Kind::RightParen) {
- get_next_token();
- break;
- }
- if (m_tok.kind != Token::Kind::Comma) {
- inja_throw("parser_error", "expected ')' or ',', got '" + m_tok.describe() + "'");
- }
- get_next_token();
- }
- }
-
- auto op = m_static.functions.find_builtin(func_token.text, num_args);
-
- if (op != Bytecode::Op::Nop) {
- // swap arguments for default(); see comment in RenderTo()
- if (op == Bytecode::Op::Default)
- std::swap(tmpl.bytecodes.back(), *(tmpl.bytecodes.rbegin() + 1));
- append_function(tmpl, op, num_args);
- return true;
- } else {
- append_callback(tmpl, func_token.text, num_args);
- return true;
- }
- } else if (m_tok.text == static_cast<decltype(m_tok.text)>("true") ||
- m_tok.text == static_cast<decltype(m_tok.text)>("false") ||
- m_tok.text == static_cast<decltype(m_tok.text)>("null")) {
- // true, false, null are json literals
- if (brace_level == 0 && bracket_level == 0) {
- json_first = m_tok.text;
- goto returnJson;
- }
- break;
+
+ // Operators
+ } break;
+ case Token::Kind::Equal:
+ case Token::Kind::NotEqual:
+ case Token::Kind::GreaterThan:
+ case Token::Kind::GreaterEqual:
+ case Token::Kind::LessThan:
+ case Token::Kind::LessEqual:
+ case Token::Kind::Plus:
+ case Token::Kind::Minus:
+ case Token::Kind::Times:
+ case Token::Kind::Slash:
+ case Token::Kind::Power:
+ case Token::Kind::Percent:
+ case Token::Kind::Dot: {
+
+ parse_operator:
+ FunctionStorage::Operation operation;
+ switch (tok.kind) {
+ case Token::Kind::Id: {
+ if (tok.text == "and") {
+ operation = FunctionStorage::Operation::And;
+ } else if (tok.text == "or") {
+ operation = FunctionStorage::Operation::Or;
+ } else if (tok.text == "in") {
+ operation = FunctionStorage::Operation::In;
+ } else if (tok.text == "not") {
+ operation = FunctionStorage::Operation::Not;
} else {
- // normal literal (json read)
- tmpl.bytecodes.emplace_back(
- Bytecode::Op::Push, m_tok.text,
- m_config.notation == ElementNotation::Pointer ? Bytecode::Flag::ValueLookupPointer : Bytecode::Flag::ValueLookupDot);
- get_next_token();
- return true;
- }
- // json passthrough
- case Token::Kind::Number:
- case Token::Kind::String:
- if (brace_level == 0 && bracket_level == 0) {
- json_first = m_tok.text;
- goto returnJson;
+ throw_parser_error("unknown operator in parser.");
}
- break;
- case Token::Kind::Comma:
- case Token::Kind::Colon:
- if (brace_level == 0 && bracket_level == 0) {
- inja_throw("parser_error", "unexpected token '" + m_tok.describe() + "'");
- }
- break;
- case Token::Kind::LeftBracket:
- if (brace_level == 0 && bracket_level == 0) {
- json_first = m_tok.text;
- }
- bracket_level += 1;
- break;
- case Token::Kind::LeftBrace:
- if (brace_level == 0 && bracket_level == 0) {
- json_first = m_tok.text;
+ } break;
+ case Token::Kind::Equal: {
+ operation = FunctionStorage::Operation::Equal;
+ } break;
+ case Token::Kind::NotEqual: {
+ operation = FunctionStorage::Operation::NotEqual;
+ } break;
+ case Token::Kind::GreaterThan: {
+ operation = FunctionStorage::Operation::Greater;
+ } break;
+ case Token::Kind::GreaterEqual: {
+ operation = FunctionStorage::Operation::GreaterEqual;
+ } break;
+ case Token::Kind::LessThan: {
+ operation = FunctionStorage::Operation::Less;
+ } break;
+ case Token::Kind::LessEqual: {
+ operation = FunctionStorage::Operation::LessEqual;
+ } break;
+ case Token::Kind::Plus: {
+ operation = FunctionStorage::Operation::Add;
+ } break;
+ case Token::Kind::Minus: {
+ operation = FunctionStorage::Operation::Subtract;
+ } break;
+ case Token::Kind::Times: {
+ operation = FunctionStorage::Operation::Multiplication;
+ } break;
+ case Token::Kind::Slash: {
+ operation = FunctionStorage::Operation::Division;
+ } break;
+ case Token::Kind::Power: {
+ operation = FunctionStorage::Operation::Power;
+ } break;
+ case Token::Kind::Percent: {
+ operation = FunctionStorage::Operation::Modulo;
+ } break;
+ case Token::Kind::Dot: {
+ operation = FunctionStorage::Operation::AtId;
+ } break;
+ default: {
+ throw_parser_error("unknown operator in parser.");
+ }
+ }
+ auto function_node = std::make_shared<FunctionNode>(operation, tok.text.data() - tmpl.content.c_str());
+
+ while (!operator_stack.empty() && ((operator_stack.top()->precedence > function_node->precedence) || (operator_stack.top()->precedence == function_node->precedence && function_node->associativity == FunctionNode::Associativity::Left)) && (operator_stack.top()->operation != FunctionStorage::Operation::ParenLeft)) {
+ current_expression_list->rpn_output.emplace_back(operator_stack.top());
+ operator_stack.pop();
+ }
+
+ operator_stack.emplace(function_node);
+
+ } break;
+ case Token::Kind::Comma: {
+ if (current_brace_level == 0 && current_bracket_level == 0) {
+ if (function_stack.empty()) {
+ throw_parser_error("unexpected ','");
}
- brace_level += 1;
- break;
- case Token::Kind::RightBracket:
- if (bracket_level == 0) {
- inja_throw("parser_error", "unexpected ']'");
+
+ function_stack.top().first->number_args += 1;
+ }
+
+ } break;
+ case Token::Kind::Colon: {
+ if (current_brace_level == 0 && current_bracket_level == 0) {
+ throw_parser_error("unexpected ':'");
+ }
+
+ } break;
+ case Token::Kind::LeftParen: {
+ current_paren_level += 1;
+ operator_stack.emplace(std::make_shared<FunctionNode>(FunctionStorage::Operation::ParenLeft, tok.text.data() - tmpl.content.c_str()));
+
+ get_peek_token();
+ if (peek_tok.kind == Token::Kind::RightParen) {
+ if (!function_stack.empty() && function_stack.top().second == current_paren_level - 1) {
+ function_stack.top().first->number_args = 0;
}
- --bracket_level;
- if (brace_level == 0 && bracket_level == 0) goto returnJson;
- break;
- case Token::Kind::RightBrace:
- if (brace_level == 0) {
- inja_throw("parser_error", "unexpected '}'");
+ }
+
+ } break;
+ case Token::Kind::RightParen: {
+ current_paren_level -= 1;
+ while (!operator_stack.empty() && operator_stack.top()->operation != FunctionStorage::Operation::ParenLeft) {
+ current_expression_list->rpn_output.emplace_back(operator_stack.top());
+ operator_stack.pop();
+ }
+
+ if (!operator_stack.empty() && operator_stack.top()->operation == FunctionStorage::Operation::ParenLeft) {
+ operator_stack.pop();
+ }
+
+ if (!function_stack.empty() && function_stack.top().second == current_paren_level) {
+ auto func = function_stack.top().first;
+ auto function_data = function_storage.find_function(func->name, func->number_args);
+ if (function_data.operation == FunctionStorage::Operation::None) {
+ throw_parser_error("unknown function " + func->name);
}
- --brace_level;
- if (brace_level == 0 && bracket_level == 0) goto returnJson;
- break;
- default:
- if (brace_level != 0) {
- inja_throw("parser_error", "unmatched '{'");
+ func->operation = function_data.operation;
+ if (function_data.operation == FunctionStorage::Operation::Callback) {
+ func->callback = function_data.callback;
}
- if (bracket_level != 0) {
- inja_throw("parser_error", "unmatched '['");
+
+ if (operator_stack.empty()) {
+ throw_parser_error("internal error at function " + func->name);
}
- return false;
+
+ current_expression_list->rpn_output.emplace_back(operator_stack.top());
+ operator_stack.pop();
+ function_stack.pop();
+ }
+ }
+ default:
+ break;
}
get_next_token();
}
- returnJson:
- // bridge across all intermediate tokens
- nonstd::string_view json_text(json_first.data(), m_tok.text.data() - json_first.data() + m_tok.text.size());
- tmpl.bytecodes.emplace_back(Bytecode::Op::Push, json::parse(json_text), Bytecode::Flag::ValueImmediate);
- get_next_token();
+ while (!operator_stack.empty()) {
+ current_expression_list->rpn_output.emplace_back(operator_stack.top());
+ operator_stack.pop();
+ }
+
return true;
}
- bool parse_statement(Template& tmpl, nonstd::string_view path) {
- if (m_tok.kind != Token::Kind::Id) return false;
+ bool parse_statement(Template &tmpl, Token::Kind closing, nonstd::string_view path) {
+ if (tok.kind != Token::Kind::Id) {
+ return false;
+ }
- if (m_tok.text == static_cast<decltype(m_tok.text)>("if")) {
+ if (tok.text == static_cast<decltype(tok.text)>("if")) {
get_next_token();
- // evaluate expression
- if (!parse_expression(tmpl)) return false;
+ auto if_statement_node = std::make_shared<IfStatementNode>(current_block, tok.text.data() - tmpl.content.c_str());
+ current_block->nodes.emplace_back(if_statement_node);
+ if_statement_stack.emplace(if_statement_node.get());
+ current_block = &if_statement_node->true_statement;
+ current_expression_list = &if_statement_node->condition;
- // start a new if block on if stack
- m_if_stack.emplace_back(tmpl.bytecodes.size());
+ if (!parse_expression(tmpl, closing)) {
+ return false;
+ }
- // conditional jump; destination will be filled in by else or endif
- tmpl.bytecodes.emplace_back(Bytecode::Op::ConditionalJump);
- } else if (m_tok.text == static_cast<decltype(m_tok.text)>("endif")) {
- if (m_if_stack.empty()) {
- inja_throw("parser_error", "endif without matching if");
+ } else if (tok.text == static_cast<decltype(tok.text)>("else")) {
+ if (if_statement_stack.empty()) {
+ throw_parser_error("else without matching if");
}
- auto& if_data = m_if_stack.back();
+ auto &if_statement_data = if_statement_stack.top();
get_next_token();
- // previous conditional jump jumps here
- if (if_data.prev_cond_jump != std::numeric_limits<unsigned int>::max()) {
- tmpl.bytecodes[if_data.prev_cond_jump].args = tmpl.bytecodes.size();
- }
+ if_statement_data->has_false_statement = true;
+ current_block = &if_statement_data->false_statement;
- // update all previous unconditional jumps to here
- for (unsigned int i: if_data.uncond_jumps) {
- tmpl.bytecodes[i].args = tmpl.bytecodes.size();
- }
+ // Chained else if
+ if (tok.kind == Token::Kind::Id && tok.text == static_cast<decltype(tok.text)>("if")) {
+ get_next_token();
- // pop if stack
- m_if_stack.pop_back();
- } else if (m_tok.text == static_cast<decltype(m_tok.text)>("else")) {
- if (m_if_stack.empty())
- inja_throw("parser_error", "else without matching if");
- auto& if_data = m_if_stack.back();
- get_next_token();
+ auto if_statement_node = std::make_shared<IfStatementNode>(true, current_block, tok.text.data() - tmpl.content.c_str());
+ current_block->nodes.emplace_back(if_statement_node);
+ if_statement_stack.emplace(if_statement_node.get());
+ current_block = &if_statement_node->true_statement;
+ current_expression_list = &if_statement_node->condition;
- // end previous block with unconditional jump to endif; destination will be
- // filled in by endif
- if_data.uncond_jumps.push_back(tmpl.bytecodes.size());
- tmpl.bytecodes.emplace_back(Bytecode::Op::Jump);
+ if (!parse_expression(tmpl, closing)) {
+ return false;
+ }
+ }
- // previous conditional jump jumps here
- tmpl.bytecodes[if_data.prev_cond_jump].args = tmpl.bytecodes.size();
- if_data.prev_cond_jump = std::numeric_limits<unsigned int>::max();
+ } else if (tok.text == static_cast<decltype(tok.text)>("endif")) {
+ if (if_statement_stack.empty()) {
+ throw_parser_error("endif without matching if");
+ }
- // chained else if
- if (m_tok.kind == Token::Kind::Id && m_tok.text == static_cast<decltype(m_tok.text)>("if")) {
- get_next_token();
+ // Nested if statements
+ while (if_statement_stack.top()->is_nested) {
+ if_statement_stack.pop();
+ }
- // evaluate expression
- if (!parse_expression(tmpl)) return false;
+ auto &if_statement_data = if_statement_stack.top();
+ get_next_token();
- // update "previous jump"
- if_data.prev_cond_jump = tmpl.bytecodes.size();
+ current_block = if_statement_data->parent;
+ if_statement_stack.pop();
- // conditional jump; destination will be filled in by else or endif
- tmpl.bytecodes.emplace_back(Bytecode::Op::ConditionalJump);
- }
- } else if (m_tok.text == static_cast<decltype(m_tok.text)>("for")) {
+ } else if (tok.text == static_cast<decltype(tok.text)>("for")) {
get_next_token();
// options: for a in arr; for a, b in obj
- if (m_tok.kind != Token::Kind::Id)
- inja_throw("parser_error", "expected id, got '" + m_tok.describe() + "'");
- Token value_token = m_tok;
+ if (tok.kind != Token::Kind::Id) {
+ throw_parser_error("expected id, got '" + tok.describe() + "'");
+ }
+
+ Token value_token = tok;
get_next_token();
- Token key_token;
- if (m_tok.kind == Token::Kind::Comma) {
+ // Object type
+ std::shared_ptr<ForStatementNode> for_statement_node;
+ if (tok.kind == Token::Kind::Comma) {
get_next_token();
- if (m_tok.kind != Token::Kind::Id)
- inja_throw("parser_error", "expected id, got '" + m_tok.describe() + "'");
- key_token = std::move(value_token);
- value_token = m_tok;
+ if (tok.kind != Token::Kind::Id) {
+ throw_parser_error("expected id, got '" + tok.describe() + "'");
+ }
+
+ Token key_token = std::move(value_token);
+ value_token = tok;
get_next_token();
- }
- if (m_tok.kind != Token::Kind::Id || m_tok.text != static_cast<decltype(m_tok.text)>("in"))
- inja_throw("parser_error",
- "expected 'in', got '" + m_tok.describe() + "'");
- get_next_token();
+ for_statement_node = std::make_shared<ForObjectStatementNode>(static_cast<std::string>(key_token.text), static_cast<std::string>(value_token.text), current_block, tok.text.data() - tmpl.content.c_str());
- if (!parse_expression(tmpl)) return false;
+ // Array type
+ } else {
+ for_statement_node = std::make_shared<ForArrayStatementNode>(static_cast<std::string>(value_token.text), current_block, tok.text.data() - tmpl.content.c_str());
+ }
- m_loop_stack.push_back(tmpl.bytecodes.size());
+ current_block->nodes.emplace_back(for_statement_node);
+ for_statement_stack.emplace(for_statement_node.get());
+ current_block = &for_statement_node->body;
+ current_expression_list = &for_statement_node->condition;
- tmpl.bytecodes.emplace_back(Bytecode::Op::StartLoop);
- if (!key_token.text.empty()) {
- tmpl.bytecodes.back().value = key_token.text;
+ if (tok.kind != Token::Kind::Id || tok.text != static_cast<decltype(tok.text)>("in")) {
+ throw_parser_error("expected 'in', got '" + tok.describe() + "'");
}
- tmpl.bytecodes.back().str = static_cast<std::string>(value_token.text);
- } else if (m_tok.text == static_cast<decltype(m_tok.text)>("endfor")) {
get_next_token();
- if (m_loop_stack.empty()) {
- inja_throw("parser_error", "endfor without matching for");
+
+ if (!parse_expression(tmpl, closing)) {
+ return false;
+ }
+
+ } else if (tok.text == static_cast<decltype(tok.text)>("endfor")) {
+ if (for_statement_stack.empty()) {
+ throw_parser_error("endfor without matching for");
}
- // update loop with EndLoop index (for empty case)
- tmpl.bytecodes[m_loop_stack.back()].args = tmpl.bytecodes.size();
+ auto &for_statement_data = for_statement_stack.top();
+ get_next_token();
+
+ current_block = for_statement_data->parent;
+ for_statement_stack.pop();
- tmpl.bytecodes.emplace_back(Bytecode::Op::EndLoop);
- tmpl.bytecodes.back().args = m_loop_stack.back() + 1; // loop body
- m_loop_stack.pop_back();
- } else if (m_tok.text == static_cast<decltype(m_tok.text)>("include")) {
+ } else if (tok.text == static_cast<decltype(tok.text)>("include")) {
get_next_token();
- if (m_tok.kind != Token::Kind::String) {
- inja_throw("parser_error", "expected string, got '" + m_tok.describe() + "'");
+ if (tok.kind != Token::Kind::String) {
+ throw_parser_error("expected string, got '" + tok.describe() + "'");
}
- // build the relative path
- json json_name = json::parse(m_tok.text);
+ // Build the relative path
+ json json_name = json::parse(tok.text);
std::string pathname = static_cast<std::string>(path);
- pathname += json_name.get_ref<const std::string&>();
+ pathname += json_name.get_ref<const std::string &>();
if (pathname.compare(0, 2, "./") == 0) {
pathname.erase(0, 2);
}
// sys::path::remove_dots(pathname, true, sys::path::Style::posix);
- if (m_included_templates.find(pathname) == m_included_templates.end()) {
- Template include_template = parse_template(pathname);
- m_included_templates.emplace(pathname, include_template);
+ if (config.search_included_templates_in_files && template_storage.find(pathname) == template_storage.end()) {
+ auto include_template = Template(load_file(pathname));
+ template_storage.emplace(pathname, include_template);
+ parse_into_template(template_storage[pathname], pathname);
}
- // generate a reference bytecode
- tmpl.bytecodes.emplace_back(Bytecode::Op::Include, json(pathname), Bytecode::Flag::ValueImmediate);
+ current_block->nodes.emplace_back(std::make_shared<IncludeStatementNode>(pathname, tok.text.data() - tmpl.content.c_str()));
get_next_token();
- } else {
- return false;
- }
- return true;
- }
- void append_function(Template& tmpl, Bytecode::Op op, unsigned int num_args) {
- // we can merge with back-to-back push
- if (!tmpl.bytecodes.empty()) {
- Bytecode& last = tmpl.bytecodes.back();
- if (last.op == Bytecode::Op::Push) {
- last.op = op;
- last.args = num_args;
- return;
+ } else if (tok.text == static_cast<decltype(tok.text)>("set")) {
+ get_next_token();
+
+ if (tok.kind != Token::Kind::Id) {
+ throw_parser_error("expected variable name, got '" + tok.describe() + "'");
}
- }
- // otherwise just add it to the end
- tmpl.bytecodes.emplace_back(op, num_args);
- }
+ std::string key = static_cast<std::string>(tok.text);
+ get_next_token();
+
+ auto set_statement_node = std::make_shared<SetStatementNode>(key, tok.text.data() - tmpl.content.c_str());
+ current_block->nodes.emplace_back(set_statement_node);
+ current_expression_list = &set_statement_node->expression;
- void append_callback(Template& tmpl, nonstd::string_view name, unsigned int num_args) {
- // we can merge with back-to-back push value (not lookup)
- if (!tmpl.bytecodes.empty()) {
- Bytecode& last = tmpl.bytecodes.back();
- if (last.op == Bytecode::Op::Push &&
- (last.flags & Bytecode::Flag::ValueMask) == Bytecode::Flag::ValueImmediate) {
- last.op = Bytecode::Op::Callback;
- last.args = num_args;
- last.str = static_cast<std::string>(name);
- return;
+ if (tok.text != static_cast<decltype(tok.text)>("=")) {
+ throw_parser_error("expected '=', got '" + tok.describe() + "'");
}
- }
+ get_next_token();
- // otherwise just add it to the end
- tmpl.bytecodes.emplace_back(Bytecode::Op::Callback, num_args);
- tmpl.bytecodes.back().str = static_cast<std::string>(name);
+ if (!parse_expression(tmpl, closing)) {
+ return false;
+ }
+
+ } else {
+ return false;
+ }
+ return true;
}
- void parse_into(Template& tmpl, nonstd::string_view path) {
- m_lexer.start(tmpl.content);
+ void parse_into(Template &tmpl, nonstd::string_view path) {
+ lexer.start(tmpl.content);
+ current_block = &tmpl.root;
for (;;) {
get_next_token();
- switch (m_tok.kind) {
- case Token::Kind::Eof:
- if (!m_if_stack.empty()) inja_throw("parser_error", "unmatched if");
- if (!m_loop_stack.empty()) inja_throw("parser_error", "unmatched for");
- return;
- case Token::Kind::Text:
- tmpl.bytecodes.emplace_back(Bytecode::Op::PrintText, m_tok.text, 0u);
- break;
- case Token::Kind::StatementOpen:
- get_next_token();
- if (!parse_statement(tmpl, path)) {
- inja_throw("parser_error", "expected statement, got '" + m_tok.describe() + "'");
- }
- if (m_tok.kind != Token::Kind::StatementClose) {
- inja_throw("parser_error", "expected statement close, got '" + m_tok.describe() + "'");
- }
- break;
- case Token::Kind::LineStatementOpen:
- get_next_token();
- parse_statement(tmpl, path);
- if (m_tok.kind != Token::Kind::LineStatementClose &&
- m_tok.kind != Token::Kind::Eof) {
- inja_throw("parser_error", "expected line statement close, got '" + m_tok.describe() + "'");
- }
- break;
- case Token::Kind::ExpressionOpen:
- get_next_token();
- if (!parse_expression(tmpl)) {
- inja_throw("parser_error", "expected expression, got '" + m_tok.describe() + "'");
- }
- append_function(tmpl, Bytecode::Op::PrintValue, 1);
- if (m_tok.kind != Token::Kind::ExpressionClose) {
- inja_throw("parser_error", "expected expression close, got '" + m_tok.describe() + "'");
- }
- break;
- case Token::Kind::CommentOpen:
- get_next_token();
- if (m_tok.kind != Token::Kind::CommentClose) {
- inja_throw("parser_error", "expected comment close, got '" + m_tok.describe() + "'");
- }
- break;
- default:
- inja_throw("parser_error", "unexpected token '" + m_tok.describe() + "'");
- break;
+ switch (tok.kind) {
+ case Token::Kind::Eof: {
+ if (!if_statement_stack.empty()) {
+ throw_parser_error("unmatched if");
+ }
+ if (!for_statement_stack.empty()) {
+ throw_parser_error("unmatched for");
+ }
+ } return;
+ case Token::Kind::Text: {
+ current_block->nodes.emplace_back(std::make_shared<TextNode>(tok.text.data() - tmpl.content.c_str(), tok.text.size()));
+ } break;
+ case Token::Kind::StatementOpen: {
+ get_next_token();
+ if (!parse_statement(tmpl, Token::Kind::StatementClose, path)) {
+ throw_parser_error("expected statement, got '" + tok.describe() + "'");
+ }
+ if (tok.kind != Token::Kind::StatementClose) {
+ throw_parser_error("expected statement close, got '" + tok.describe() + "'");
+ }
+ } break;
+ case Token::Kind::LineStatementOpen: {
+ get_next_token();
+ if (!parse_statement(tmpl, Token::Kind::LineStatementClose, path)) {
+ throw_parser_error("expected statement, got '" + tok.describe() + "'");
+ }
+ if (tok.kind != Token::Kind::LineStatementClose && tok.kind != Token::Kind::Eof) {
+ throw_parser_error("expected line statement close, got '" + tok.describe() + "'");
+ }
+ } break;
+ case Token::Kind::ExpressionOpen: {
+ get_next_token();
+
+ auto expression_list_node = std::make_shared<ExpressionListNode>(tok.text.data() - tmpl.content.c_str());
+ current_block->nodes.emplace_back(expression_list_node);
+ current_expression_list = expression_list_node.get();
+
+ if (!parse_expression(tmpl, Token::Kind::ExpressionClose)) {
+ throw_parser_error("expected expression, got '" + tok.describe() + "'");
+ }
+
+ if (tok.kind != Token::Kind::ExpressionClose) {
+ throw_parser_error("expected expression close, got '" + tok.describe() + "'");
+ }
+ } break;
+ case Token::Kind::CommentOpen: {
+ get_next_token();
+ if (tok.kind != Token::Kind::CommentClose) {
+ throw_parser_error("expected comment close, got '" + tok.describe() + "'");
+ }
+ } break;
+ default: {
+ throw_parser_error("unexpected token '" + tok.describe() + "'");
+ } break;
}
}
}
+
+public:
+ explicit Parser(const ParserConfig &parser_config, const LexerConfig &lexer_config,
+ TemplateStorage &template_storage, const FunctionStorage &function_storage)
+ : config(parser_config), lexer(lexer_config), template_storage(template_storage), function_storage(function_storage) { }
+
Template parse(nonstd::string_view input, nonstd::string_view path) {
- Template result;
- result.content = static_cast<std::string>(input);
+ auto result = Template(static_cast<std::string>(input));
parse_into(result, path);
return result;
}
@@ -2637,118 +3288,31 @@ class Parser {
return parse(input, "./");
}
- Template parse_template(nonstd::string_view filename) {
- Template result;
- result.content = load_file(filename);
-
+ void parse_into_template(Template& tmpl, nonstd::string_view filename) {
nonstd::string_view path = filename.substr(0, filename.find_last_of("/\\") + 1);
- // StringRef path = sys::path::parent_path(filename);
- Parser(m_config, m_lexer.get_config(), m_included_templates).parse_into(result, path);
- return result;
+
+ // StringRef path = sys::path::parent_path(filename);
+ auto sub_parser = Parser(config, lexer.get_config(), template_storage, function_storage);
+ sub_parser.parse_into(tmpl, path);
}
std::string load_file(nonstd::string_view filename) {
- std::ifstream file = open_file_or_throw(static_cast<std::string>(filename));
+ std::ifstream file;
+ open_file_or_throw(static_cast<std::string>(filename), file);
std::string text((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
return text;
}
-
- private:
- const ParserConfig& m_config;
- Lexer m_lexer;
- Token m_tok;
- Token m_peek_tok;
- bool m_have_peek_tok {false};
- TemplateStorage& m_included_templates;
- const ParserStatic& m_static;
-
- struct IfData {
- unsigned int prev_cond_jump;
- std::vector<unsigned int> uncond_jumps;
-
- explicit IfData(unsigned int condJump): prev_cond_jump(condJump) {}
- };
-
- std::vector<IfData> m_if_stack;
- std::vector<unsigned int> m_loop_stack;
-
- void get_next_token() {
- if (m_have_peek_tok) {
- m_tok = m_peek_tok;
- m_have_peek_tok = false;
- } else {
- m_tok = m_lexer.scan();
- }
- }
-
- void get_peek_token() {
- if (!m_have_peek_tok) {
- m_peek_tok = m_lexer.scan();
- m_have_peek_tok = true;
- }
- }
};
-} // namespace inja
-
-#endif // PANTOR_INJA_PARSER_HPP
-
-// #include "polyfill.hpp"
-#ifndef PANTOR_INJA_POLYFILL_HPP
-#define PANTOR_INJA_POLYFILL_HPP
-
-
-#if __cplusplus < 201402L
-
-#include <cstddef>
-#include <memory>
-#include <type_traits>
-#include <utility>
-
-
-namespace stdinja {
- template<class T> struct _Unique_if {
- typedef std::unique_ptr<T> _Single_object;
- };
-
- template<class T> struct _Unique_if<T[]> {
- typedef std::unique_ptr<T[]> _Unknown_bound;
- };
-
- template<class T, size_t N> struct _Unique_if<T[N]> {
- typedef void _Known_bound;
- };
-
- template<class T, class... Args>
- typename _Unique_if<T>::_Single_object
- make_unique(Args&&... args) {
- return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
- }
-
- template<class T>
- typename _Unique_if<T>::_Unknown_bound
- make_unique(size_t n) {
- typedef typename std::remove_extent<T>::type U;
- return std::unique_ptr<T>(new U[n]());
- }
-
- template<class T, class... Args>
- typename _Unique_if<T>::_Known_bound
- make_unique(Args&&...) = delete;
-}
-
-#else
-
-namespace stdinja = std;
-
-#endif // memory */
-
+} // namespace inja
-#endif // PANTOR_INJA_POLYFILL_HPP
+#endif // INCLUDE_INJA_PARSER_HPP_
// #include "renderer.hpp"
-#ifndef PANTOR_INJA_RENDERER_HPP
-#define PANTOR_INJA_RENDERER_HPP
+// Copyright (c) 2020 Pantor. All rights reserved.
+
+#ifndef INCLUDE_INJA_RENDERER_HPP_
+#define INCLUDE_INJA_RENDERER_HPP_
#include <algorithm>
#include <numeric>
@@ -2758,577 +3322,605 @@ namespace stdinja = std;
#include <nlohmann/json.hpp>
-// #include "bytecode.hpp"
+// #include "config.hpp"
+
+// #include "exceptions.hpp"
+
+// #include "node.hpp"
// #include "template.hpp"
// #include "utils.hpp"
-
namespace inja {
-inline nonstd::string_view convert_dot_to_json_pointer(nonstd::string_view dot, std::string& out) {
- out.clear();
- do {
- nonstd::string_view part;
- std::tie(part, dot) = string_view::split(dot, '.');
- out.push_back('/');
- out.append(part.begin(), part.end());
- } while (!dot.empty());
- return nonstd::string_view(out.data(), out.size());
-}
-
/*!
* \brief Class for rendering a Template with data.
*/
-class Renderer {
- std::vector<const json*>& get_args(const Bytecode& bc) {
- m_tmp_args.clear();
+class Renderer : public NodeVisitor {
+ using Op = FunctionStorage::Operation;
+
+ const RenderConfig config;
+ const Template *current_template;
+ const TemplateStorage &template_storage;
+ const FunctionStorage &function_storage;
+
+ const json *json_input;
+ std::ostream *output_stream;
+
+ json json_additional_data;
+ json* current_loop_data = &json_additional_data["loop"];
+
+ std::vector<std::shared_ptr<json>> json_tmp_stack;
+ std::stack<const json*> json_eval_stack;
+ std::stack<const JsonNode*> not_found_stack;
+
+ bool truthy(const json* data) const {
+ if (data->is_boolean()) {
+ return data->get<bool>();
+ } else if (data->is_number()) {
+ return (*data != 0);
+ } else if (data->is_null()) {
+ return false;
+ }
+ return !data->empty();
+ }
- bool has_imm = ((bc.flags & Bytecode::Flag::ValueMask) != Bytecode::Flag::ValuePop);
+ void print_json(const std::shared_ptr<json> value) {
+ if (value->is_string()) {
+ *output_stream << value->get_ref<const json::string_t&>();
+ } else if (value->is_number_integer()) {
+ *output_stream << value->get<const json::number_integer_t>();
+ } else if (value->is_null()) {
+ } else {
+ *output_stream << value->dump();
+ }
+ }
- // get args from stack
- unsigned int pop_args = bc.args;
- if (has_imm) {
- pop_args -= 1;
+ const std::shared_ptr<json> eval_expression_list(const ExpressionListNode& expression_list) {
+ for (auto& expression : expression_list.rpn_output) {
+ expression->accept(*this);
}
- for (auto i = std::prev(m_stack.end(), pop_args); i != m_stack.end(); i++) {
- m_tmp_args.push_back(&(*i));
+ if (json_eval_stack.empty()) {
+ throw_renderer_error("empty expression", expression_list);
+ } else if (json_eval_stack.size() != 1) {
+ throw_renderer_error("malformed expression", expression_list);
}
- // get immediate arg
- if (has_imm) {
- m_tmp_args.push_back(get_imm(bc));
+ auto result = json_eval_stack.top();
+ json_eval_stack.pop();
+
+ if (!result) {
+ if (not_found_stack.empty()) {
+ throw_renderer_error("expression could not be evaluated", expression_list);
+ }
+
+ auto node = not_found_stack.top();
+ not_found_stack.pop();
+
+ throw_renderer_error("variable '" + static_cast<std::string>(node->name) + "' not found", *node);
}
+ return std::make_shared<json>(*result);
+ }
- return m_tmp_args;
+ void throw_renderer_error(const std::string &message, const AstNode& node) {
+ SourceLocation loc = get_source_location(current_template->content, node.pos);
+ throw RenderError(message, loc);
}
- void pop_args(const Bytecode& bc) {
- unsigned int popArgs = bc.args;
- if ((bc.flags & Bytecode::Flag::ValueMask) != Bytecode::Flag::ValuePop) {
- popArgs -= 1;
+ template<size_t N, bool throw_not_found=true>
+ std::array<const json*, N> get_arguments(const AstNode& node) {
+ if (json_eval_stack.size() < N) {
+ throw_renderer_error("function needs " + std::to_string(N) + " variables, but has only found " + std::to_string(json_eval_stack.size()), node);
}
- for (unsigned int i = 0; i < popArgs; ++i) {
- m_stack.pop_back();
+
+ std::array<const json*, N> result;
+ for (size_t i = 0; i < N; i += 1) {
+ result[N - i - 1] = json_eval_stack.top();
+ json_eval_stack.pop();
+
+ if (!result[N - i - 1]) {
+ auto json_node = not_found_stack.top();
+ not_found_stack.pop();
+
+ if (throw_not_found) {
+ throw_renderer_error("variable '" + static_cast<std::string>(json_node->name) + "' not found", *json_node);
+ }
+ }
}
+ return result;
}
- const json* get_imm(const Bytecode& bc) {
- std::string ptr_buffer;
- nonstd::string_view ptr;
- switch (bc.flags & Bytecode::Flag::ValueMask) {
- case Bytecode::Flag::ValuePop:
- return nullptr;
- case Bytecode::Flag::ValueImmediate:
- return &bc.value;
- case Bytecode::Flag::ValueLookupDot:
- ptr = convert_dot_to_json_pointer(bc.str, ptr_buffer);
- break;
- case Bytecode::Flag::ValueLookupPointer:
- ptr_buffer += '/';
- ptr_buffer += bc.str;
- ptr = ptr_buffer;
- break;
- }
- try {
- return &m_data->at(json::json_pointer(ptr.data()));
- } catch (std::exception&) {
- // try to evaluate as a no-argument callback
- if (auto callback = m_callbacks.find_callback(bc.str, 0)) {
- std::vector<const json*> arguments {};
- m_tmp_val = callback(arguments);
- return &m_tmp_val;
+ template<bool throw_not_found=true>
+ Arguments get_argument_vector(size_t N, const AstNode& node) {
+ Arguments result {N};
+ for (size_t i = 0; i < N; i += 1) {
+ result[N - i - 1] = json_eval_stack.top();
+ json_eval_stack.pop();
+
+ if (!result[N - i - 1]) {
+ auto json_node = not_found_stack.top();
+ not_found_stack.pop();
+
+ if (throw_not_found) {
+ throw_renderer_error("variable '" + static_cast<std::string>(json_node->name) + "' not found", *json_node);
+ }
}
- inja_throw("render_error", "variable '" + static_cast<std::string>(bc.str) + "' not found");
- return nullptr;
}
+ return result;
}
- bool truthy(const json& var) const {
- if (var.empty()) {
- return false;
- } else if (var.is_number()) {
- return (var != 0);
- } else if (var.is_string()) {
- return !var.empty();
+ void visit(const BlockNode& node) {
+ for (auto& n : node.nodes) {
+ n->accept(*this);
}
+ }
- try {
- return var.get<bool>();
- } catch (json::type_error& e) {
- inja_throw("json_error", e.what());
- throw;
- }
+ void visit(const TextNode& node) {
+ output_stream->write(current_template->content.c_str() + node.pos, node.length);
}
- void update_loop_data() {
- LoopLevel& level = m_loop_stack.back();
+ void visit(const ExpressionNode&) { }
- if (level.loop_type == LoopLevel::Type::Array) {
- level.data[static_cast<std::string>(level.value_name)] = level.values.at(level.index); // *level.it;
- auto& loopData = level.data["loop"];
- loopData["index"] = level.index;
- loopData["index1"] = level.index + 1;
- loopData["is_first"] = (level.index == 0);
- loopData["is_last"] = (level.index == level.size - 1);
- } else {
- level.data[static_cast<std::string>(level.key_name)] = level.map_it->first;
- level.data[static_cast<std::string>(level.value_name)] = *level.map_it->second;
- }
+ void visit(const LiteralNode& node) {
+ json_eval_stack.push(&node.value);
}
- const TemplateStorage& m_included_templates;
- const FunctionStorage& m_callbacks;
-
- std::vector<json> m_stack;
+ void visit(const JsonNode& node) {
+ if (json_additional_data.contains(node.ptr)) {
+ json_eval_stack.push(&(json_additional_data[node.ptr]));
+
+ } else if (json_input->contains(node.ptr)) {
+ json_eval_stack.push(&(*json_input)[node.ptr]);
+
+ } else {
+ // Try to evaluate as a no-argument callback
+ auto function_data = function_storage.find_function(node.name, 0);
+ if (function_data.operation == FunctionStorage::Operation::Callback) {
+ Arguments empty_args {};
+ auto value = std::make_shared<json>(function_data.callback(empty_args));
+ json_tmp_stack.push_back(value);
+ json_eval_stack.push(value.get());
+ } else {
+ json_eval_stack.push(nullptr);
+ not_found_stack.emplace(&node);
+ }
+ }
+ }
- struct LoopLevel {
- enum class Type { Map, Array };
+ void visit(const FunctionNode& node) {
+ std::shared_ptr<json> result_ptr;
+
+ switch (node.operation) {
+ case Op::Not: {
+ auto args = get_arguments<1>(node);
+ result_ptr = std::make_shared<json>(!truthy(args[0]));
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::And: {
+ auto args = get_arguments<2>(node);
+ result_ptr = std::make_shared<json>(truthy(args[0]) && truthy(args[1]));
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Or: {
+ auto args = get_arguments<2>(node);
+ result_ptr = std::make_shared<json>(truthy(args[0]) || truthy(args[1]));
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::In: {
+ auto args = get_arguments<2>(node);
+ result_ptr = std::make_shared<json>(std::find(args[1]->begin(), args[1]->end(), *args[0]) != args[1]->end());
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Equal: {
+ auto args = get_arguments<2>(node);
+ result_ptr = std::make_shared<json>(*args[0] == *args[1]);
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::NotEqual: {
+ auto args = get_arguments<2>(node);
+ result_ptr = std::make_shared<json>(*args[0] != *args[1]);
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Greater: {
+ auto args = get_arguments<2>(node);
+ result_ptr = std::make_shared<json>(*args[0] > *args[1]);
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::GreaterEqual: {
+ auto args = get_arguments<2>(node);
+ result_ptr = std::make_shared<json>(*args[0] >= *args[1]);
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Less: {
+ auto args = get_arguments<2>(node);
+ result_ptr = std::make_shared<json>(*args[0] < *args[1]);
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::LessEqual: {
+ auto args = get_arguments<2>(node);
+ result_ptr = std::make_shared<json>(*args[0] <= *args[1]);
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Add: {
+ auto args = get_arguments<2>(node);
+ if (args[0]->is_string() && args[1]->is_string()) {
+ result_ptr = std::make_shared<json>(args[0]->get_ref<const std::string&>() + args[1]->get_ref<const std::string&>());
+ json_tmp_stack.push_back(result_ptr);
+ } else if (args[0]->is_number_integer() && args[1]->is_number_integer()) {
+ result_ptr = std::make_shared<json>(args[0]->get<int>() + args[1]->get<int>());
+ json_tmp_stack.push_back(result_ptr);
+ } else {
+ result_ptr = std::make_shared<json>(args[0]->get<double>() + args[1]->get<double>());
+ json_tmp_stack.push_back(result_ptr);
+ }
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Subtract: {
+ auto args = get_arguments<2>(node);
+ if (args[0]->is_number_integer() && args[1]->is_number_integer()) {
+ result_ptr = std::make_shared<json>(args[0]->get<int>() - args[1]->get<int>());
+ json_tmp_stack.push_back(result_ptr);
+ } else {
+ result_ptr = std::make_shared<json>(args[0]->get<double>() - args[1]->get<double>());
+ json_tmp_stack.push_back(result_ptr);
+ }
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Multiplication: {
+ auto args = get_arguments<2>(node);
+ if (args[0]->is_number_integer() && args[1]->is_number_integer()) {
+ result_ptr = std::make_shared<json>(args[0]->get<int>() * args[1]->get<int>());
+ json_tmp_stack.push_back(result_ptr);
+ } else {
+ result_ptr = std::make_shared<json>(args[0]->get<double>() * args[1]->get<double>());
+ json_tmp_stack.push_back(result_ptr);
+ }
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Division: {
+ auto args = get_arguments<2>(node);
+ if (args[1]->get<double>() == 0) {
+ throw_renderer_error("division by zero", node);
+ }
+ result_ptr = std::make_shared<json>(args[0]->get<double>() / args[1]->get<double>());
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Power: {
+ auto args = get_arguments<2>(node);
+ if (args[0]->is_number_integer() && args[1]->get<int>() >= 0) {
+ int result = std::pow(args[0]->get<int>(), args[1]->get<int>());
+ result_ptr = std::make_shared<json>(std::move(result));
+ json_tmp_stack.push_back(result_ptr);
+ } else {
+ double result = std::pow(args[0]->get<double>(), args[1]->get<int>());
+ result_ptr = std::make_shared<json>(std::move(result));
+ json_tmp_stack.push_back(result_ptr);
+ }
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Modulo: {
+ auto args = get_arguments<2>(node);
+ result_ptr = std::make_shared<json>(args[0]->get<int>() % args[1]->get<int>());
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::AtId: {
+ json_eval_stack.pop(); // Pop id nullptr
+ auto container = get_arguments<1, false>(node)[0];
+ if (not_found_stack.empty()) {
+ throw_renderer_error("could not find element with given name", node);
+ }
+ auto id_node = not_found_stack.top();
+ not_found_stack.pop();
+ json_eval_stack.push(&container->at(id_node->name));
+ } break;
+ case Op::At: {
+ auto args = get_arguments<2>(node);
+ json_eval_stack.push(&args[0]->at(args[1]->get<int>()));
+ } break;
+ case Op::Default: {
+ auto default_arg = get_arguments<1>(node)[0];
+ auto test_arg = get_arguments<1, false>(node)[0];
+ json_eval_stack.push(test_arg ? test_arg : default_arg);
+ } break;
+ case Op::DivisibleBy: {
+ auto args = get_arguments<2>(node);
+ int divisor = args[1]->get<int>();
+ result_ptr = std::make_shared<json>((divisor != 0) && (args[0]->get<int>() % divisor == 0));
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Even: {
+ result_ptr = std::make_shared<json>(get_arguments<1>(node)[0]->get<int>() % 2 == 0);
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Exists: {
+ auto &&name = get_arguments<1>(node)[0]->get_ref<const std::string &>();
+ result_ptr = std::make_shared<json>(json_input->contains(json::json_pointer(JsonNode::convert_dot_to_json_ptr(name))));
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::ExistsInObject: {
+ auto args = get_arguments<2>(node);
+ auto &&name = args[1]->get_ref<const std::string &>();
+ result_ptr = std::make_shared<json>(args[0]->find(name) != args[0]->end());
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::First: {
+ auto result = &get_arguments<1>(node)[0]->front();
+ json_eval_stack.push(result);
+ } break;
+ case Op::Float: {
+ result_ptr = std::make_shared<json>(std::stod(get_arguments<1>(node)[0]->get_ref<const std::string &>()));
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Int: {
+ result_ptr = std::make_shared<json>(std::stoi(get_arguments<1>(node)[0]->get_ref<const std::string &>()));
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Last: {
+ auto result = &get_arguments<1>(node)[0]->back();
+ json_eval_stack.push(result);
+ } break;
+ case Op::Length: {
+ auto val = get_arguments<1>(node)[0];
+ if (val->is_string()) {
+ result_ptr = std::make_shared<json>(val->get_ref<const std::string &>().length());
+ } else {
+ result_ptr = std::make_shared<json>(val->size());
+ }
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Lower: {
+ std::string result = get_arguments<1>(node)[0]->get<std::string>();
+ std::transform(result.begin(), result.end(), result.begin(), ::tolower);
+ result_ptr = std::make_shared<json>(std::move(result));
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Max: {
+ auto args = get_arguments<1>(node);
+ auto result = std::max_element(args[0]->begin(), args[0]->end());
+ json_eval_stack.push(&(*result));
+ } break;
+ case Op::Min: {
+ auto args = get_arguments<1>(node);
+ auto result = std::min_element(args[0]->begin(), args[0]->end());
+ json_eval_stack.push(&(*result));
+ } break;
+ case Op::Odd: {
+ result_ptr = std::make_shared<json>(get_arguments<1>(node)[0]->get<int>() % 2 != 0);
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Range: {
+ std::vector<int> result(get_arguments<1>(node)[0]->get<int>());
+ std::iota(result.begin(), result.end(), 0);
+ result_ptr = std::make_shared<json>(std::move(result));
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Round: {
+ auto args = get_arguments<2>(node);
+ int precision = args[1]->get<int>();
+ double result = std::round(args[0]->get<double>() * std::pow(10.0, precision)) / std::pow(10.0, precision);
+ result_ptr = std::make_shared<json>(std::move(result));
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Sort: {
+ result_ptr = std::make_shared<json>(get_arguments<1>(node)[0]->get<std::vector<json>>());
+ std::sort(result_ptr->begin(), result_ptr->end());
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Upper: {
+ std::string result = get_arguments<1>(node)[0]->get<std::string>();
+ std::transform(result.begin(), result.end(), result.begin(), ::toupper);
+ result_ptr = std::make_shared<json>(std::move(result));
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::IsBoolean: {
+ result_ptr = std::make_shared<json>(get_arguments<1>(node)[0]->is_boolean());
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::IsNumber: {
+ result_ptr = std::make_shared<json>(get_arguments<1>(node)[0]->is_number());
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::IsInteger: {
+ result_ptr = std::make_shared<json>(get_arguments<1>(node)[0]->is_number_integer());
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::IsFloat: {
+ result_ptr = std::make_shared<json>(get_arguments<1>(node)[0]->is_number_float());
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::IsObject: {
+ result_ptr = std::make_shared<json>(get_arguments<1>(node)[0]->is_object());
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::IsArray: {
+ result_ptr = std::make_shared<json>(get_arguments<1>(node)[0]->is_array());
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::IsString: {
+ result_ptr = std::make_shared<json>(get_arguments<1>(node)[0]->is_string());
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::Callback: {
+ auto args = get_argument_vector(node.number_args, node);
+ result_ptr = std::make_shared<json>(node.callback(args));
+ json_tmp_stack.push_back(result_ptr);
+ json_eval_stack.push(result_ptr.get());
+ } break;
+ case Op::ParenLeft:
+ case Op::ParenRight:
+ case Op::None:
+ break;
+ }
+ }
- Type loop_type;
- nonstd::string_view key_name; // variable name for keys
- nonstd::string_view value_name; // variable name for values
- json data; // data with loop info added
+ void visit(const ExpressionListNode& node) {
+ print_json(eval_expression_list(node));
+ }
- json values; // values to iterate over
+ void visit(const StatementNode&) { }
- // loop over list
- size_t index; // current list index
- size_t size; // length of list
+ void visit(const ForStatementNode&) { }
- // loop over map
- using KeyValue = std::pair<nonstd::string_view, json*>;
- using MapValues = std::vector<KeyValue>;
- MapValues map_values; // values to iterate over
- MapValues::iterator map_it; // iterator over values
+ void visit(const ForArrayStatementNode& node) {
+ auto result = eval_expression_list(node.condition);
+ if (!result->is_array()) {
+ throw_renderer_error("object must be an array", node);
+ }
- };
+ if (!current_loop_data->empty()) {
+ auto tmp = *current_loop_data; // Because of clang-3
+ (*current_loop_data)["parent"] = std::move(tmp);
+ }
- std::vector<LoopLevel> m_loop_stack;
- const json* m_data;
+ size_t index = 0;
+ (*current_loop_data)["is_first"] = true;
+ (*current_loop_data)["is_last"] = (result->size() <= 1);
+ for (auto it = result->begin(); it != result->end(); ++it) {
+ json_additional_data[static_cast<std::string>(node.value)] = *it;
- std::vector<const json*> m_tmp_args;
- json m_tmp_val;
+ (*current_loop_data)["index"] = index;
+ (*current_loop_data)["index1"] = index + 1;
+ if (index == 1) {
+ (*current_loop_data)["is_first"] = false;
+ }
+ if (index == result->size() - 1) {
+ (*current_loop_data)["is_last"] = true;
+ }
+ node.body.accept(*this);
+ ++index;
+ }
- public:
- Renderer(const TemplateStorage& included_templates, const FunctionStorage& callbacks): m_included_templates(included_templates), m_callbacks(callbacks) {
- m_stack.reserve(16);
- m_tmp_args.reserve(4);
- m_loop_stack.reserve(16);
+ json_additional_data[static_cast<std::string>(node.value)].clear();
+ if (!(*current_loop_data)["parent"].empty()) {
+ auto tmp = (*current_loop_data)["parent"];
+ *current_loop_data = std::move(tmp);
+ } else {
+ current_loop_data = &json_additional_data["loop"];
+ }
}
- void render_to(std::ostream& os, const Template& tmpl, const json& data) {
- m_data = &data;
+ void visit(const ForObjectStatementNode& node) {
+ auto result = eval_expression_list(node.condition);
+ if (!result->is_object()) {
+ throw_renderer_error("object must be an object", node);
+ }
- for (size_t i = 0; i < tmpl.bytecodes.size(); ++i) {
- const auto& bc = tmpl.bytecodes[i];
+ if (!current_loop_data->empty()) {
+ (*current_loop_data)["parent"] = std::move(*current_loop_data);
+ }
- switch (bc.op) {
- case Bytecode::Op::Nop: {
- break;
- }
- case Bytecode::Op::PrintText: {
- os << bc.str;
- break;
- }
- case Bytecode::Op::PrintValue: {
- const json& val = *get_args(bc)[0];
- if (val.is_string()) {
- os << val.get_ref<const std::string&>();
- } else {
- os << val.dump();
- }
- pop_args(bc);
- break;
- }
- case Bytecode::Op::Push: {
- m_stack.emplace_back(*get_imm(bc));
- break;
- }
- case Bytecode::Op::Upper: {
- auto result = get_args(bc)[0]->get<std::string>();
- std::transform(result.begin(), result.end(), result.begin(), ::toupper);
- pop_args(bc);
- m_stack.emplace_back(std::move(result));
- break;
- }
- case Bytecode::Op::Lower: {
- auto result = get_args(bc)[0]->get<std::string>();
- std::transform(result.begin(), result.end(), result.begin(), ::tolower);
- pop_args(bc);
- m_stack.emplace_back(std::move(result));
- break;
- }
- case Bytecode::Op::Range: {
- int number = get_args(bc)[0]->get<int>();
- std::vector<int> result(number);
- std::iota(std::begin(result), std::end(result), 0);
- pop_args(bc);
- m_stack.emplace_back(std::move(result));
- break;
- }
- case Bytecode::Op::Length: {
- const json& val = *get_args(bc)[0];
+ size_t index = 0;
+ (*current_loop_data)["is_first"] = true;
+ (*current_loop_data)["is_last"] = (result->size() <= 1);
+ for (auto it = result->begin(); it != result->end(); ++it) {
+ json_additional_data[static_cast<std::string>(node.key)] = it.key();
+ json_additional_data[static_cast<std::string>(node.value)] = it.value();
+
+ (*current_loop_data)["index"] = index;
+ (*current_loop_data)["index1"] = index + 1;
+ if (index == 1) {
+ (*current_loop_data)["is_first"] = false;
+ }
+ if (index == result->size() - 1) {
+ (*current_loop_data)["is_last"] = true;
+ }
- int result;
- if (val.is_string()) {
- result = val.get_ref<const std::string&>().length();
- } else {
- result = val.size();
- }
+ node.body.accept(*this);
+ ++index;
+ }
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::Sort: {
- auto result = get_args(bc)[0]->get<std::vector<json>>();
- std::sort(result.begin(), result.end());
- pop_args(bc);
- m_stack.emplace_back(std::move(result));
- break;
- }
- case Bytecode::Op::At: {
- auto args = get_args(bc);
- auto result = args[0]->at(args[1]->get<int>());
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::First: {
- auto result = get_args(bc)[0]->front();
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::Last: {
- auto result = get_args(bc)[0]->back();
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::Round: {
- auto args = get_args(bc);
- double number = args[0]->get<double>();
- int precision = args[1]->get<int>();
- pop_args(bc);
- m_stack.emplace_back(std::round(number * std::pow(10.0, precision)) / std::pow(10.0, precision));
- break;
- }
- case Bytecode::Op::DivisibleBy: {
- auto args = get_args(bc);
- int number = args[0]->get<int>();
- int divisor = args[1]->get<int>();
- pop_args(bc);
- m_stack.emplace_back((divisor != 0) && (number % divisor == 0));
- break;
- }
- case Bytecode::Op::Odd: {
- int number = get_args(bc)[0]->get<int>();
- pop_args(bc);
- m_stack.emplace_back(number % 2 != 0);
- break;
- }
- case Bytecode::Op::Even: {
- int number = get_args(bc)[0]->get<int>();
- pop_args(bc);
- m_stack.emplace_back(number % 2 == 0);
- break;
- }
- case Bytecode::Op::Max: {
- auto args = get_args(bc);
- auto result = *std::max_element(args[0]->begin(), args[0]->end());
- pop_args(bc);
- m_stack.emplace_back(std::move(result));
- break;
- }
- case Bytecode::Op::Min: {
- auto args = get_args(bc);
- auto result = *std::min_element(args[0]->begin(), args[0]->end());
- pop_args(bc);
- m_stack.emplace_back(std::move(result));
- break;
- }
- case Bytecode::Op::Not: {
- bool result = !truthy(*get_args(bc)[0]);
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::And: {
- auto args = get_args(bc);
- bool result = truthy(*args[0]) && truthy(*args[1]);
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::Or: {
- auto args = get_args(bc);
- bool result = truthy(*args[0]) || truthy(*args[1]);
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::In: {
- auto args = get_args(bc);
- bool result = std::find(args[1]->begin(), args[1]->end(), *args[0]) !=
- args[1]->end();
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::Equal: {
- auto args = get_args(bc);
- bool result = (*args[0] == *args[1]);
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::Greater: {
- auto args = get_args(bc);
- bool result = (*args[0] > *args[1]);
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::Less: {
- auto args = get_args(bc);
- bool result = (*args[0] < *args[1]);
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::GreaterEqual: {
- auto args = get_args(bc);
- bool result = (*args[0] >= *args[1]);
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::LessEqual: {
- auto args = get_args(bc);
- bool result = (*args[0] <= *args[1]);
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::Different: {
- auto args = get_args(bc);
- bool result = (*args[0] != *args[1]);
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::Float: {
- double result =
- std::stod(get_args(bc)[0]->get_ref<const std::string&>());
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::Int: {
- int result = std::stoi(get_args(bc)[0]->get_ref<const std::string&>());
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::Exists: {
- auto&& name = get_args(bc)[0]->get_ref<const std::string&>();
- bool result = (data.find(name) != data.end());
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::ExistsInObject: {
- auto args = get_args(bc);
- auto&& name = args[1]->get_ref<const std::string&>();
- bool result = (args[0]->find(name) != args[0]->end());
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::IsBoolean: {
- bool result = get_args(bc)[0]->is_boolean();
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::IsNumber: {
- bool result = get_args(bc)[0]->is_number();
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::IsInteger: {
- bool result = get_args(bc)[0]->is_number_integer();
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::IsFloat: {
- bool result = get_args(bc)[0]->is_number_float();
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::IsObject: {
- bool result = get_args(bc)[0]->is_object();
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::IsArray: {
- bool result = get_args(bc)[0]->is_array();
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::IsString: {
- bool result = get_args(bc)[0]->is_string();
- pop_args(bc);
- m_stack.emplace_back(result);
- break;
- }
- case Bytecode::Op::Default: {
- // default needs to be a bit "magic"; we can't evaluate the first
- // argument during the push operation, so we swap the arguments during
- // the parse phase so the second argument is pushed on the stack and
- // the first argument is in the immediate
- try {
- const json* imm = get_imm(bc);
- // if no exception was raised, replace the stack value with it
- m_stack.back() = *imm;
- } catch (std::exception&) {
- // couldn't read immediate, just leave the stack as is
- }
- break;
- }
- case Bytecode::Op::Include:
- Renderer(m_included_templates, m_callbacks).render_to(os, m_included_templates.find(get_imm(bc)->get_ref<const std::string&>())->second, *m_data);
- break;
- case Bytecode::Op::Callback: {
- auto callback = m_callbacks.find_callback(bc.str, bc.args);
- if (!callback) {
- inja_throw("render_error", "function '" + static_cast<std::string>(bc.str) + "' (" + std::to_string(static_cast<unsigned int>(bc.args)) + ") not found");
- }
- json result = callback(get_args(bc));
- pop_args(bc);
- m_stack.emplace_back(std::move(result));
- break;
- }
- case Bytecode::Op::Jump: {
- i = bc.args - 1; // -1 due to ++i in loop
- break;
- }
- case Bytecode::Op::ConditionalJump: {
- if (!truthy(m_stack.back())) {
- i = bc.args - 1; // -1 due to ++i in loop
- }
- m_stack.pop_back();
- break;
- }
- case Bytecode::Op::StartLoop: {
- // jump past loop body if empty
- if (m_stack.back().empty()) {
- m_stack.pop_back();
- i = bc.args; // ++i in loop will take it past EndLoop
- break;
- }
+ json_additional_data[static_cast<std::string>(node.key)].clear();
+ json_additional_data[static_cast<std::string>(node.value)].clear();
+ if (!(*current_loop_data)["parent"].empty()) {
+ *current_loop_data = std::move((*current_loop_data)["parent"]);
+ } else {
+ current_loop_data = &json_additional_data["loop"];
+ }
+ }
- m_loop_stack.emplace_back();
- LoopLevel& level = m_loop_stack.back();
- level.value_name = bc.str;
- level.values = std::move(m_stack.back());
- level.data = (*m_data);
- m_stack.pop_back();
-
- if (bc.value.is_string()) {
- // map iterator
- if (!level.values.is_object()) {
- m_loop_stack.pop_back();
- inja_throw("render_error", "for key, value requires object");
- }
- level.loop_type = LoopLevel::Type::Map;
- level.key_name = bc.value.get_ref<const std::string&>();
-
- // sort by key
- for (auto it = level.values.begin(), end = level.values.end(); it != end; ++it) {
- level.map_values.emplace_back(it.key(), &it.value());
- }
- std::sort(level.map_values.begin(), level.map_values.end(), [](const LoopLevel::KeyValue& a, const LoopLevel::KeyValue& b) { return a.first < b.first; });
- level.map_it = level.map_values.begin();
- } else {
- if (!level.values.is_array()) {
- m_loop_stack.pop_back();
- inja_throw("render_error", "type must be array");
- }
-
- // list iterator
- level.loop_type = LoopLevel::Type::Array;
- level.index = 0;
- level.size = level.values.size();
- }
+ void visit(const IfStatementNode& node) {
+ auto result = eval_expression_list(node.condition);
+ if (truthy(result.get())) {
+ node.true_statement.accept(*this);
+ } else if (node.has_false_statement) {
+ node.false_statement.accept(*this);
+ }
+ }
- // provide parent access in nested loop
- auto parent_loop_it = level.data.find("loop");
- if (parent_loop_it != level.data.end()) {
- json loop_copy = *parent_loop_it;
- (*parent_loop_it)["parent"] = std::move(loop_copy);
- }
+ void visit(const IncludeStatementNode& node) {
+ auto sub_renderer = Renderer(config, template_storage, function_storage);
+ auto included_template_it = template_storage.find(node.file);
- // set "current" data to loop data
- m_data = &level.data;
- update_loop_data();
- break;
- }
- case Bytecode::Op::EndLoop: {
- if (m_loop_stack.empty()) {
- inja_throw("render_error", "unexpected state in renderer");
- }
- LoopLevel& level = m_loop_stack.back();
+ if (included_template_it != template_storage.end()) {
+ sub_renderer.render_to(*output_stream, included_template_it->second, *json_input, &json_additional_data);
+ } else if (config.throw_at_missing_includes) {
+ throw_renderer_error("include '" + node.file + "' not found", node);
+ }
+ }
- bool done;
- if (level.loop_type == LoopLevel::Type::Array) {
- level.index += 1;
- done = (level.index == level.values.size());
- } else {
- level.map_it += 1;
- done = (level.map_it == level.map_values.end());
- }
+ void visit(const SetStatementNode& node) {
+ json_additional_data[node.key] = *eval_expression_list(node.expression);
+ }
- if (done) {
- m_loop_stack.pop_back();
- // set "current" data to outer loop data or main data as appropriate
- if (!m_loop_stack.empty()) {
- m_data = &m_loop_stack.back().data;
- } else {
- m_data = &data;
- }
- break;
- }
+public:
+ Renderer(const RenderConfig& config, const TemplateStorage &template_storage, const FunctionStorage &function_storage)
+ : config(config), template_storage(template_storage), function_storage(function_storage) { }
+
+ void render_to(std::ostream &os, const Template &tmpl, const json &data, json *loop_data = nullptr) {
+ output_stream = &os;
+ current_template = &tmpl;
+ json_input = &data;
+ if (loop_data) {
+ json_additional_data = *loop_data;
+ current_loop_data = &json_additional_data["loop"];
+ }
- update_loop_data();
+ current_template->root.accept(*this);
- // jump back to start of loop
- i = bc.args - 1; // -1 due to ++i in loop
- break;
- }
- default: {
- inja_throw("render_error", "unknown op in renderer: " + std::to_string(static_cast<unsigned int>(bc.op)));
- }
- }
- }
+ json_tmp_stack.clear();
}
};
-} // namespace inja
+} // namespace inja
-#endif // PANTOR_INJA_RENDERER_HPP
+#endif // INCLUDE_INJA_RENDERER_HPP_
// #include "string_view.hpp"
@@ -3337,193 +3929,223 @@ class Renderer {
// #include "utils.hpp"
-
namespace inja {
-using namespace nlohmann;
+using json = nlohmann::json;
/*!
* \brief Class for changing the configuration.
*/
class Environment {
- class Impl {
- public:
- std::string input_path;
- std::string output_path;
+ std::string input_path;
+ std::string output_path;
- LexerConfig lexer_config;
- ParserConfig parser_config;
+ LexerConfig lexer_config;
+ ParserConfig parser_config;
+ RenderConfig render_config;
- FunctionStorage callbacks;
- TemplateStorage included_templates;
- };
-
- std::unique_ptr<Impl> m_impl;
+ FunctionStorage function_storage;
+ TemplateStorage template_storage;
- public:
- Environment(): Environment("") { }
+public:
+ Environment() : Environment("") {}
- explicit Environment(const std::string& global_path): m_impl(stdinja::make_unique<Impl>()) {
- m_impl->input_path = global_path;
- m_impl->output_path = global_path;
- }
+ explicit Environment(const std::string &global_path) : input_path(global_path), output_path(global_path) {}
- explicit Environment(const std::string& input_path, const std::string& output_path): m_impl(stdinja::make_unique<Impl>()) {
- m_impl->input_path = input_path;
- m_impl->output_path = output_path;
- }
+ Environment(const std::string &input_path, const std::string &output_path)
+ : input_path(input_path), output_path(output_path) {}
/// Sets the opener and closer for template statements
- void set_statement(const std::string& open, const std::string& close) {
- m_impl->lexer_config.statement_open = open;
- m_impl->lexer_config.statement_close = close;
- m_impl->lexer_config.update_open_chars();
+ void set_statement(const std::string &open, const std::string &close) {
+ lexer_config.statement_open = open;
+ lexer_config.statement_open_no_lstrip = open + "+";
+ lexer_config.statement_open_force_lstrip = open + "-";
+ lexer_config.statement_close = close;
+ lexer_config.statement_close_force_rstrip = "-" + close;
+ lexer_config.update_open_chars();
}
/// Sets the opener for template line statements
- void set_line_statement(const std::string& open) {
- m_impl->lexer_config.line_statement = open;
- m_impl->lexer_config.update_open_chars();
+ void set_line_statement(const std::string &open) {
+ lexer_config.line_statement = open;
+ lexer_config.update_open_chars();
}
/// Sets the opener and closer for template expressions
- void set_expression(const std::string& open, const std::string& close) {
- m_impl->lexer_config.expression_open = open;
- m_impl->lexer_config.expression_close = close;
- m_impl->lexer_config.update_open_chars();
+ void set_expression(const std::string &open, const std::string &close) {
+ lexer_config.expression_open = open;
+ lexer_config.expression_open_force_lstrip = open + "-";
+ lexer_config.expression_close = close;
+ lexer_config.expression_close_force_rstrip = "-" + close;
+ lexer_config.update_open_chars();
}
/// Sets the opener and closer for template comments
- void set_comment(const std::string& open, const std::string& close) {
- m_impl->lexer_config.comment_open = open;
- m_impl->lexer_config.comment_close = close;
- m_impl->lexer_config.update_open_chars();
+ void set_comment(const std::string &open, const std::string &close) {
+ lexer_config.comment_open = open;
+ lexer_config.comment_close = close;
+ lexer_config.update_open_chars();
}
/// Sets whether to remove the first newline after a block
void set_trim_blocks(bool trim_blocks) {
- m_impl->lexer_config.trim_blocks = trim_blocks;
+ lexer_config.trim_blocks = trim_blocks;
}
/// Sets whether to strip the spaces and tabs from the start of a line to a block
void set_lstrip_blocks(bool lstrip_blocks) {
- m_impl->lexer_config.lstrip_blocks = lstrip_blocks;
+ lexer_config.lstrip_blocks = lstrip_blocks;
}
/// Sets the element notation syntax
- void set_element_notation(ElementNotation notation) {
- m_impl->parser_config.notation = notation;
+ void set_search_included_templates_in_files(bool search_in_files) {
+ parser_config.search_included_templates_in_files = search_in_files;
}
+ /// Sets whether a missing include will throw an error
+ void set_throw_at_missing_includes(bool will_throw) {
+ render_config.throw_at_missing_includes = will_throw;
+ }
Template parse(nonstd::string_view input) {
- Parser parser(m_impl->parser_config, m_impl->lexer_config, m_impl->included_templates);
+ Parser parser(parser_config, lexer_config, template_storage, function_storage);
return parser.parse(input);
}
- Template parse_template(const std::string& filename) {
- Parser parser(m_impl->parser_config, m_impl->lexer_config, m_impl->included_templates);
- return parser.parse_template(m_impl->input_path + static_cast<std::string>(filename));
- }
+ Template parse_template(const std::string &filename) {
+ Parser parser(parser_config, lexer_config, template_storage, function_storage);
+ auto result = Template(parser.load_file(input_path + static_cast<std::string>(filename)));
+ parser.parse_into_template(result, input_path + static_cast<std::string>(filename));
+ return result;
+ }
- std::string render(nonstd::string_view input, const json& data) {
- return render(parse(input), data);
+ Template parse_file(const std::string &filename) {
+ return parse_template(filename);
}
- std::string render(const Template& tmpl, const json& data) {
+ std::string render(nonstd::string_view input, const json &data) { return render(parse(input), data); }
+
+ std::string render(const Template &tmpl, const json &data) {
std::stringstream os;
render_to(os, tmpl, data);
return os.str();
}
- std::string render_file(const std::string& filename, const json& data) {
- return render(parse_template(filename), data);
- }
+ std::string render_file(const std::string &filename, const json &data) {
+ return render(parse_template(filename), data);
+ }
- std::string render_file_with_json_file(const std::string& filename, const std::string& filename_data) {
- const json data = load_json(filename_data);
- return render_file(filename, data);
- }
+ std::string render_file_with_json_file(const std::string &filename, const std::string &filename_data) {
+ const json data = load_json(filename_data);
+ return render_file(filename, data);
+ }
- void write(const std::string& filename, const json& data, const std::string& filename_out) {
- std::ofstream file(m_impl->output_path + filename_out);
- file << render_file(filename, data);
- file.close();
- }
+ void write(const std::string &filename, const json &data, const std::string &filename_out) {
+ std::ofstream file(output_path + filename_out);
+ file << render_file(filename, data);
+ file.close();
+ }
- void write(const Template& temp, const json& data, const std::string& filename_out) {
- std::ofstream file(m_impl->output_path + filename_out);
- file << render(temp, data);
- file.close();
- }
+ void write(const Template &temp, const json &data, const std::string &filename_out) {
+ std::ofstream file(output_path + filename_out);
+ file << render(temp, data);
+ file.close();
+ }
- void write_with_json_file(const std::string& filename, const std::string& filename_data, const std::string& filename_out) {
- const json data = load_json(filename_data);
- write(filename, data, filename_out);
- }
+ void write_with_json_file(const std::string &filename, const std::string &filename_data,
+ const std::string &filename_out) {
+ const json data = load_json(filename_data);
+ write(filename, data, filename_out);
+ }
- void write_with_json_file(const Template& temp, const std::string& filename_data, const std::string& filename_out) {
- const json data = load_json(filename_data);
- write(temp, data, filename_out);
- }
+ void write_with_json_file(const Template &temp, const std::string &filename_data, const std::string &filename_out) {
+ const json data = load_json(filename_data);
+ write(temp, data, filename_out);
+ }
- std::ostream& render_to(std::ostream& os, const Template& tmpl, const json& data) {
- Renderer(m_impl->included_templates, m_impl->callbacks).render_to(os, tmpl, data);
+ std::ostream &render_to(std::ostream &os, const Template &tmpl, const json &data) {
+ Renderer(render_config, template_storage, function_storage).render_to(os, tmpl, data);
return os;
}
- std::string load_file(const std::string& filename) {
- Parser parser(m_impl->parser_config, m_impl->lexer_config, m_impl->included_templates);
- return parser.load_file(m_impl->input_path + filename);
- }
+ std::string load_file(const std::string &filename) {
+ Parser parser(parser_config, lexer_config, template_storage, function_storage);
+ return parser.load_file(input_path + filename);
+ }
- json load_json(const std::string& filename) {
- std::ifstream file = open_file_or_throw(m_impl->input_path + filename);
- json j;
- file >> j;
- return j;
- }
+ json load_json(const std::string &filename) {
+ std::ifstream file;
+ open_file_or_throw(input_path + filename, file);
+ json j;
+ file >> j;
+ return j;
+ }
+
+ /*!
+ @brief Adds a variadic callback
+ */
+ void add_callback(const std::string &name, const CallbackFunction &callback) {
+ add_callback(name, -1, callback);
+ }
+
+ /*!
+ @brief Adds a variadic void callback
+ */
+ void add_void_callback(const std::string &name, const VoidCallbackFunction &callback) {
+ add_void_callback(name, -1, callback);
+ }
+
+ /*!
+ @brief Adds a callback with given number or arguments
+ */
+ void add_callback(const std::string &name, int num_args, const CallbackFunction &callback) {
+ function_storage.add_callback(name, num_args, callback);
+ }
- void add_callback(const std::string& name, unsigned int numArgs, const CallbackFunction& callback) {
- m_impl->callbacks.add_callback(name, numArgs, callback);
+ /*!
+ @brief Adds a void callback with given number or arguments
+ */
+ void add_void_callback(const std::string &name, int num_args, const VoidCallbackFunction &callback) {
+ function_storage.add_callback(name, num_args, [callback](Arguments& args) { callback(args); return json(); });
}
/** Includes a template with a given name into the environment.
* Then, a template can be rendered in another template using the
* include "<name>" syntax.
*/
- void include_template(const std::string& name, const Template& tmpl) {
- m_impl->included_templates[name] = tmpl;
+ void include_template(const std::string &name, const Template &tmpl) {
+ template_storage[name] = tmpl;
}
};
/*!
@brief render with default settings to a string
*/
-inline std::string render(nonstd::string_view input, const json& data) {
+inline std::string render(nonstd::string_view input, const json &data) {
return Environment().render(input, data);
}
/*!
@brief render with default settings to the given output stream
*/
-inline void render_to(std::ostream& os, nonstd::string_view input, const json& data) {
+inline void render_to(std::ostream &os, nonstd::string_view input, const json &data) {
Environment env;
env.render_to(os, env.parse(input), data);
}
-}
-
-#endif // PANTOR_INJA_ENVIRONMENT_HPP
+} // namespace inja
-// #include "string_view.hpp"
+#endif // INCLUDE_INJA_ENVIRONMENT_HPP_
-// #include "template.hpp"
+// #include "exceptions.hpp"
// #include "parser.hpp"
// #include "renderer.hpp"
+// #include "string_view.hpp"
+
+// #include "template.hpp"
-#endif // PANTOR_INJA_HPP
+#endif // INCLUDE_INJA_INJA_HPP_
diff --git a/tools/jsonproc/jsonproc.cpp b/tools/jsonproc/jsonproc.cpp
index bcbe53e4..48905da4 100644
--- a/tools/jsonproc/jsonproc.cpp
+++ b/tools/jsonproc/jsonproc.cpp
@@ -128,6 +128,10 @@ int main(int argc, char *argv[])
return args.at(0)->empty();
});
+ env.add_void_callback("log", 1, [](Arguments& args) {
+ std::cout << args.at(0)->get<int>() << std::endl;
+ });
+
try
{
env.write_with_json_file(templateFilepath, jsonfilepath, outputFilepath);
diff --git a/tools/jsonproc/nlohmann/json.hpp b/tools/jsonproc/nlohmann/json.hpp
index 5003a4fa..cc822a54 100644
--- a/tools/jsonproc/nlohmann/json.hpp
+++ b/tools/jsonproc/nlohmann/json.hpp
@@ -1,7 +1,7 @@
/*
__ _____ _____ _____
__| | __| | | | JSON for Modern C++
-| | |__ | | | | | | version 3.6.1
+| | |__ | | | | | | version 3.8.0
|_____|_____|_____|_|___| https://github.com/nlohmann/json
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
@@ -31,12 +31,11 @@ SOFTWARE.
#define INCLUDE_NLOHMANN_JSON_HPP_
#define NLOHMANN_JSON_VERSION_MAJOR 3
-#define NLOHMANN_JSON_VERSION_MINOR 6
-#define NLOHMANN_JSON_VERSION_PATCH 1
+#define NLOHMANN_JSON_VERSION_MINOR 8
+#define NLOHMANN_JSON_VERSION_PATCH 0
#include <algorithm> // all_of, find, for_each
#include <cassert> // assert
-#include <ciso646> // and, not, or
#include <cstddef> // nullptr_t, ptrdiff_t, size_t
#include <functional> // hash, less
#include <initializer_list> // initializer_list
@@ -58,7 +57,6 @@ SOFTWARE.
#include <algorithm> // transform
#include <array> // array
-#include <ciso646> // and, not
#include <forward_list> // forward_list
#include <iterator> // inserter, front_inserter, end
#include <map> // map
@@ -69,6 +67,16 @@ SOFTWARE.
#include <utility> // pair, declval
#include <valarray> // valarray
+// #include <nlohmann/detail/boolean_operators.hpp>
+
+
+// Header <ciso646> is removed in C++20.
+// See <https://github.com/nlohmann/json/issues/2089> for more information.
+
+#if __cplusplus <= 201703L
+ #include <ciso646> // and, not, or
+#endif
+
// #include <nlohmann/detail/exceptions.hpp>
@@ -105,6 +113,2042 @@ struct position_t
} // namespace detail
} // namespace nlohmann
+// #include <nlohmann/detail/macro_scope.hpp>
+
+
+#include <utility> // pair
+// #include <nlohmann/thirdparty/hedley/hedley.hpp>
+/* Hedley - https://nemequ.github.io/hedley
+ * Created by Evan Nemerson <evan@nemerson.com>
+ *
+ * To the extent possible under law, the author(s) have dedicated all
+ * copyright and related and neighboring rights to this software to
+ * the public domain worldwide. This software is distributed without
+ * any warranty.
+ *
+ * For details, see <http://creativecommons.org/publicdomain/zero/1.0/>.
+ * SPDX-License-Identifier: CC0-1.0
+ */
+
+#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 13)
+#if defined(JSON_HEDLEY_VERSION)
+ #undef JSON_HEDLEY_VERSION
+#endif
+#define JSON_HEDLEY_VERSION 13
+
+#if defined(JSON_HEDLEY_STRINGIFY_EX)
+ #undef JSON_HEDLEY_STRINGIFY_EX
+#endif
+#define JSON_HEDLEY_STRINGIFY_EX(x) #x
+
+#if defined(JSON_HEDLEY_STRINGIFY)
+ #undef JSON_HEDLEY_STRINGIFY
+#endif
+#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x)
+
+#if defined(JSON_HEDLEY_CONCAT_EX)
+ #undef JSON_HEDLEY_CONCAT_EX
+#endif
+#define JSON_HEDLEY_CONCAT_EX(a,b) a##b
+
+#if defined(JSON_HEDLEY_CONCAT)
+ #undef JSON_HEDLEY_CONCAT
+#endif
+#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b)
+
+#if defined(JSON_HEDLEY_CONCAT3_EX)
+ #undef JSON_HEDLEY_CONCAT3_EX
+#endif
+#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c
+
+#if defined(JSON_HEDLEY_CONCAT3)
+ #undef JSON_HEDLEY_CONCAT3
+#endif
+#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c)
+
+#if defined(JSON_HEDLEY_VERSION_ENCODE)
+ #undef JSON_HEDLEY_VERSION_ENCODE
+#endif
+#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision))
+
+#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR)
+ #undef JSON_HEDLEY_VERSION_DECODE_MAJOR
+#endif
+#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000)
+
+#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR)
+ #undef JSON_HEDLEY_VERSION_DECODE_MINOR
+#endif
+#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000)
+
+#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION)
+ #undef JSON_HEDLEY_VERSION_DECODE_REVISION
+#endif
+#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000)
+
+#if defined(JSON_HEDLEY_GNUC_VERSION)
+ #undef JSON_HEDLEY_GNUC_VERSION
+#endif
+#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__)
+ #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
+#elif defined(__GNUC__)
+ #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0)
+#endif
+
+#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK)
+ #undef JSON_HEDLEY_GNUC_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_GNUC_VERSION)
+ #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_MSVC_VERSION)
+ #undef JSON_HEDLEY_MSVC_VERSION
+#endif
+#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000)
+ #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100)
+#elif defined(_MSC_FULL_VER)
+ #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10)
+#elif defined(_MSC_VER)
+ #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0)
+#endif
+
+#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK)
+ #undef JSON_HEDLEY_MSVC_VERSION_CHECK
+#endif
+#if !defined(_MSC_VER)
+ #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0)
+#elif defined(_MSC_VER) && (_MSC_VER >= 1400)
+ #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch)))
+#elif defined(_MSC_VER) && (_MSC_VER >= 1200)
+ #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch)))
+#else
+ #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor)))
+#endif
+
+#if defined(JSON_HEDLEY_INTEL_VERSION)
+ #undef JSON_HEDLEY_INTEL_VERSION
+#endif
+#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE)
+ #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE)
+#elif defined(__INTEL_COMPILER)
+ #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0)
+#endif
+
+#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK)
+ #undef JSON_HEDLEY_INTEL_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_INTEL_VERSION)
+ #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_PGI_VERSION)
+ #undef JSON_HEDLEY_PGI_VERSION
+#endif
+#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__)
+ #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__)
+#endif
+
+#if defined(JSON_HEDLEY_PGI_VERSION_CHECK)
+ #undef JSON_HEDLEY_PGI_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_PGI_VERSION)
+ #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_SUNPRO_VERSION)
+ #undef JSON_HEDLEY_SUNPRO_VERSION
+#endif
+#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000)
+ #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10)
+#elif defined(__SUNPRO_C)
+ #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf)
+#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000)
+ #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10)
+#elif defined(__SUNPRO_CC)
+ #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf)
+#endif
+
+#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK)
+ #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_SUNPRO_VERSION)
+ #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION)
+ #undef JSON_HEDLEY_EMSCRIPTEN_VERSION
+#endif
+#if defined(__EMSCRIPTEN__)
+ #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__)
+#endif
+
+#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK)
+ #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION)
+ #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_ARM_VERSION)
+ #undef JSON_HEDLEY_ARM_VERSION
+#endif
+#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION)
+ #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100)
+#elif defined(__CC_ARM) && defined(__ARMCC_VERSION)
+ #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100)
+#endif
+
+#if defined(JSON_HEDLEY_ARM_VERSION_CHECK)
+ #undef JSON_HEDLEY_ARM_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_ARM_VERSION)
+ #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_IBM_VERSION)
+ #undef JSON_HEDLEY_IBM_VERSION
+#endif
+#if defined(__ibmxl__)
+ #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__)
+#elif defined(__xlC__) && defined(__xlC_ver__)
+ #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff)
+#elif defined(__xlC__)
+ #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0)
+#endif
+
+#if defined(JSON_HEDLEY_IBM_VERSION_CHECK)
+ #undef JSON_HEDLEY_IBM_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_IBM_VERSION)
+ #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_TI_VERSION)
+ #undef JSON_HEDLEY_TI_VERSION
+#endif
+#if \
+ defined(__TI_COMPILER_VERSION__) && \
+ ( \
+ defined(__TMS470__) || defined(__TI_ARM__) || \
+ defined(__MSP430__) || \
+ defined(__TMS320C2000__) \
+ )
+#if (__TI_COMPILER_VERSION__ >= 16000000)
+ #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
+#endif
+#endif
+
+#if defined(JSON_HEDLEY_TI_VERSION_CHECK)
+ #undef JSON_HEDLEY_TI_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_TI_VERSION)
+ #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_TI_CL2000_VERSION)
+ #undef JSON_HEDLEY_TI_CL2000_VERSION
+#endif
+#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__)
+ #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
+#endif
+
+#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK)
+ #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_TI_CL2000_VERSION)
+ #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_TI_CL430_VERSION)
+ #undef JSON_HEDLEY_TI_CL430_VERSION
+#endif
+#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__)
+ #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
+#endif
+
+#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK)
+ #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_TI_CL430_VERSION)
+ #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_TI_ARMCL_VERSION)
+ #undef JSON_HEDLEY_TI_ARMCL_VERSION
+#endif
+#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__))
+ #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
+#endif
+
+#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK)
+ #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_TI_ARMCL_VERSION)
+ #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_TI_CL6X_VERSION)
+ #undef JSON_HEDLEY_TI_CL6X_VERSION
+#endif
+#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__)
+ #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
+#endif
+
+#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK)
+ #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_TI_CL6X_VERSION)
+ #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_TI_CL7X_VERSION)
+ #undef JSON_HEDLEY_TI_CL7X_VERSION
+#endif
+#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__)
+ #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
+#endif
+
+#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK)
+ #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_TI_CL7X_VERSION)
+ #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_TI_CLPRU_VERSION)
+ #undef JSON_HEDLEY_TI_CLPRU_VERSION
+#endif
+#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__)
+ #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000))
+#endif
+
+#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK)
+ #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_TI_CLPRU_VERSION)
+ #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_CRAY_VERSION)
+ #undef JSON_HEDLEY_CRAY_VERSION
+#endif
+#if defined(_CRAYC)
+ #if defined(_RELEASE_PATCHLEVEL)
+ #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL)
+ #else
+ #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0)
+ #endif
+#endif
+
+#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK)
+ #undef JSON_HEDLEY_CRAY_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_CRAY_VERSION)
+ #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_IAR_VERSION)
+ #undef JSON_HEDLEY_IAR_VERSION
+#endif
+#if defined(__IAR_SYSTEMS_ICC__)
+ #if __VER__ > 1000
+ #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000))
+ #else
+ #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(VER / 100, __VER__ % 100, 0)
+ #endif
+#endif
+
+#if defined(JSON_HEDLEY_IAR_VERSION_CHECK)
+ #undef JSON_HEDLEY_IAR_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_IAR_VERSION)
+ #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_TINYC_VERSION)
+ #undef JSON_HEDLEY_TINYC_VERSION
+#endif
+#if defined(__TINYC__)
+ #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100)
+#endif
+
+#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK)
+ #undef JSON_HEDLEY_TINYC_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_TINYC_VERSION)
+ #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_DMC_VERSION)
+ #undef JSON_HEDLEY_DMC_VERSION
+#endif
+#if defined(__DMC__)
+ #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf)
+#endif
+
+#if defined(JSON_HEDLEY_DMC_VERSION_CHECK)
+ #undef JSON_HEDLEY_DMC_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_DMC_VERSION)
+ #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_COMPCERT_VERSION)
+ #undef JSON_HEDLEY_COMPCERT_VERSION
+#endif
+#if defined(__COMPCERT_VERSION__)
+ #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100)
+#endif
+
+#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK)
+ #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_COMPCERT_VERSION)
+ #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_PELLES_VERSION)
+ #undef JSON_HEDLEY_PELLES_VERSION
+#endif
+#if defined(__POCC__)
+ #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0)
+#endif
+
+#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK)
+ #undef JSON_HEDLEY_PELLES_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_PELLES_VERSION)
+ #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_GCC_VERSION)
+ #undef JSON_HEDLEY_GCC_VERSION
+#endif
+#if \
+ defined(JSON_HEDLEY_GNUC_VERSION) && \
+ !defined(__clang__) && \
+ !defined(JSON_HEDLEY_INTEL_VERSION) && \
+ !defined(JSON_HEDLEY_PGI_VERSION) && \
+ !defined(JSON_HEDLEY_ARM_VERSION) && \
+ !defined(JSON_HEDLEY_TI_VERSION) && \
+ !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \
+ !defined(JSON_HEDLEY_TI_CL430_VERSION) && \
+ !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \
+ !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \
+ !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \
+ !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \
+ !defined(__COMPCERT__)
+ #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION
+#endif
+
+#if defined(JSON_HEDLEY_GCC_VERSION_CHECK)
+ #undef JSON_HEDLEY_GCC_VERSION_CHECK
+#endif
+#if defined(JSON_HEDLEY_GCC_VERSION)
+ #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch))
+#else
+ #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0)
+#endif
+
+#if defined(JSON_HEDLEY_HAS_ATTRIBUTE)
+ #undef JSON_HEDLEY_HAS_ATTRIBUTE
+#endif
+#if defined(__has_attribute)
+ #define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute)
+#else
+ #define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0)
+#endif
+
+#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE)
+ #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE
+#endif
+#if defined(__has_attribute)
+ #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) __has_attribute(attribute)
+#else
+ #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
+#endif
+
+#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE)
+ #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE
+#endif
+#if defined(__has_attribute)
+ #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) __has_attribute(attribute)
+#else
+ #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+#endif
+
+#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE)
+ #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE
+#endif
+#if \
+ defined(__has_cpp_attribute) && \
+ defined(__cplusplus) && \
+ (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0))
+ #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute)
+#else
+ #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0)
+#endif
+
+#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS)
+ #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS
+#endif
+#if !defined(__cplusplus) || !defined(__has_cpp_attribute)
+ #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0)
+#elif \
+ !defined(JSON_HEDLEY_PGI_VERSION) && \
+ !defined(JSON_HEDLEY_IAR_VERSION) && \
+ (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \
+ (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0))
+ #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute)
+#else
+ #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0)
+#endif
+
+#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE)
+ #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE
+#endif
+#if defined(__has_cpp_attribute) && defined(__cplusplus)
+ #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute)
+#else
+ #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
+#endif
+
+#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE)
+ #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE
+#endif
+#if defined(__has_cpp_attribute) && defined(__cplusplus)
+ #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute)
+#else
+ #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+#endif
+
+#if defined(JSON_HEDLEY_HAS_BUILTIN)
+ #undef JSON_HEDLEY_HAS_BUILTIN
+#endif
+#if defined(__has_builtin)
+ #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin)
+#else
+ #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0)
+#endif
+
+#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN)
+ #undef JSON_HEDLEY_GNUC_HAS_BUILTIN
+#endif
+#if defined(__has_builtin)
+ #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin)
+#else
+ #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
+#endif
+
+#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN)
+ #undef JSON_HEDLEY_GCC_HAS_BUILTIN
+#endif
+#if defined(__has_builtin)
+ #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin)
+#else
+ #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+#endif
+
+#if defined(JSON_HEDLEY_HAS_FEATURE)
+ #undef JSON_HEDLEY_HAS_FEATURE
+#endif
+#if defined(__has_feature)
+ #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature)
+#else
+ #define JSON_HEDLEY_HAS_FEATURE(feature) (0)
+#endif
+
+#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE)
+ #undef JSON_HEDLEY_GNUC_HAS_FEATURE
+#endif
+#if defined(__has_feature)
+ #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature)
+#else
+ #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
+#endif
+
+#if defined(JSON_HEDLEY_GCC_HAS_FEATURE)
+ #undef JSON_HEDLEY_GCC_HAS_FEATURE
+#endif
+#if defined(__has_feature)
+ #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature)
+#else
+ #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+#endif
+
+#if defined(JSON_HEDLEY_HAS_EXTENSION)
+ #undef JSON_HEDLEY_HAS_EXTENSION
+#endif
+#if defined(__has_extension)
+ #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension)
+#else
+ #define JSON_HEDLEY_HAS_EXTENSION(extension) (0)
+#endif
+
+#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION)
+ #undef JSON_HEDLEY_GNUC_HAS_EXTENSION
+#endif
+#if defined(__has_extension)
+ #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension)
+#else
+ #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
+#endif
+
+#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION)
+ #undef JSON_HEDLEY_GCC_HAS_EXTENSION
+#endif
+#if defined(__has_extension)
+ #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension)
+#else
+ #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+#endif
+
+#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE)
+ #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE
+#endif
+#if defined(__has_declspec_attribute)
+ #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute)
+#else
+ #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0)
+#endif
+
+#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE)
+ #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE
+#endif
+#if defined(__has_declspec_attribute)
+ #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute)
+#else
+ #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
+#endif
+
+#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE)
+ #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE
+#endif
+#if defined(__has_declspec_attribute)
+ #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute)
+#else
+ #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+#endif
+
+#if defined(JSON_HEDLEY_HAS_WARNING)
+ #undef JSON_HEDLEY_HAS_WARNING
+#endif
+#if defined(__has_warning)
+ #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning)
+#else
+ #define JSON_HEDLEY_HAS_WARNING(warning) (0)
+#endif
+
+#if defined(JSON_HEDLEY_GNUC_HAS_WARNING)
+ #undef JSON_HEDLEY_GNUC_HAS_WARNING
+#endif
+#if defined(__has_warning)
+ #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning)
+#else
+ #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch)
+#endif
+
+#if defined(JSON_HEDLEY_GCC_HAS_WARNING)
+ #undef JSON_HEDLEY_GCC_HAS_WARNING
+#endif
+#if defined(__has_warning)
+ #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning)
+#else
+ #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+#endif
+
+/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for
+ HEDLEY INTERNAL USE ONLY. API subject to change without notice. */
+#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)
+ #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_
+#endif
+#if defined(__cplusplus)
+# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat")
+# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions")
+# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \
+ JSON_HEDLEY_DIAGNOSTIC_PUSH \
+ _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \
+ _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \
+ xpr \
+ JSON_HEDLEY_DIAGNOSTIC_POP
+# else
+# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \
+ JSON_HEDLEY_DIAGNOSTIC_PUSH \
+ _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \
+ xpr \
+ JSON_HEDLEY_DIAGNOSTIC_POP
+# endif
+# endif
+#endif
+#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x
+#endif
+
+#if defined(JSON_HEDLEY_CONST_CAST)
+ #undef JSON_HEDLEY_CONST_CAST
+#endif
+#if defined(__cplusplus)
+# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast<T>(expr))
+#elif \
+ JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \
+ JSON_HEDLEY_DIAGNOSTIC_PUSH \
+ JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \
+ ((T) (expr)); \
+ JSON_HEDLEY_DIAGNOSTIC_POP \
+ }))
+#else
+# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr))
+#endif
+
+#if defined(JSON_HEDLEY_REINTERPRET_CAST)
+ #undef JSON_HEDLEY_REINTERPRET_CAST
+#endif
+#if defined(__cplusplus)
+ #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast<T>(expr))
+#else
+ #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr))
+#endif
+
+#if defined(JSON_HEDLEY_STATIC_CAST)
+ #undef JSON_HEDLEY_STATIC_CAST
+#endif
+#if defined(__cplusplus)
+ #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast<T>(expr))
+#else
+ #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr))
+#endif
+
+#if defined(JSON_HEDLEY_CPP_CAST)
+ #undef JSON_HEDLEY_CPP_CAST
+#endif
+#if defined(__cplusplus)
+# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast")
+# define JSON_HEDLEY_CPP_CAST(T, expr) \
+ JSON_HEDLEY_DIAGNOSTIC_PUSH \
+ _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \
+ ((T) (expr)) \
+ JSON_HEDLEY_DIAGNOSTIC_POP
+# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0)
+# define JSON_HEDLEY_CPP_CAST(T, expr) \
+ JSON_HEDLEY_DIAGNOSTIC_PUSH \
+ _Pragma("diag_suppress=Pe137") \
+ JSON_HEDLEY_DIAGNOSTIC_POP \
+# else
+# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr))
+# endif
+#else
+# define JSON_HEDLEY_CPP_CAST(T, expr) (expr)
+#endif
+
+#if \
+ (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \
+ defined(__clang__) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \
+ JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+ JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+ JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \
+ JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \
+ JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \
+ (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR))
+ #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value)
+#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
+ #define JSON_HEDLEY_PRAGMA(value) __pragma(value)
+#else
+ #define JSON_HEDLEY_PRAGMA(value)
+#endif
+
+#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH)
+ #undef JSON_HEDLEY_DIAGNOSTIC_PUSH
+#endif
+#if defined(JSON_HEDLEY_DIAGNOSTIC_POP)
+ #undef JSON_HEDLEY_DIAGNOSTIC_POP
+#endif
+#if defined(__clang__)
+ #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push")
+ #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop")
+#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)")
+ #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)")
+#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")
+ #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
+#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push))
+ #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop))
+#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push")
+ #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop")
+#elif \
+ JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push")
+ #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop")
+#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)")
+ #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)")
+#else
+ #define JSON_HEDLEY_DIAGNOSTIC_PUSH
+ #define JSON_HEDLEY_DIAGNOSTIC_POP
+#endif
+
+#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED)
+ #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
+#endif
+#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations")
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")
+#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)")
+#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444")
+#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
+#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996))
+#elif \
+ JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+ (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+ (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+ (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+ (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718")
+#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)")
+#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)")
+#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215")
+#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)")
+#else
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
+#endif
+
+#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS)
+ #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
+#endif
+#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas")
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"")
+#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)")
+#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675")
+#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"")
+#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068))
+#elif \
+ JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163")
+#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163")
+#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161")
+#else
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
+#endif
+
+#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES)
+ #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES
+#endif
+#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes")
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"")
+#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
+#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)")
+#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030))
+#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097")
+#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)")
+#elif \
+ JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173")
+#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097")
+#else
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES
+#endif
+
+#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL)
+ #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL
+#endif
+#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual")
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"")
+#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)")
+#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0)
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"")
+#else
+ #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL
+#endif
+
+#if defined(JSON_HEDLEY_DEPRECATED)
+ #undef JSON_HEDLEY_DEPRECATED
+#endif
+#if defined(JSON_HEDLEY_DEPRECATED_FOR)
+ #undef JSON_HEDLEY_DEPRECATED_FOR
+#endif
+#if JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0)
+ #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since))
+ #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement))
+#elif defined(__cplusplus) && (__cplusplus >= 201402L)
+ #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]])
+ #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]])
+#elif \
+ JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \
+ JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \
+ JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \
+ JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0)
+ #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since)))
+ #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement)))
+#elif \
+ JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+ JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+ (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+ (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+ (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+ (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
+ #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__))
+ #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__))
+#elif \
+ JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \
+ JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0)
+ #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated)
+ #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated)
+#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+ #define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated")
+ #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated")
+#else
+ #define JSON_HEDLEY_DEPRECATED(since)
+ #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement)
+#endif
+
+#if defined(JSON_HEDLEY_UNAVAILABLE)
+ #undef JSON_HEDLEY_UNAVAILABLE
+#endif
+#if \
+ JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+ #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since)))
+#else
+ #define JSON_HEDLEY_UNAVAILABLE(available_since)
+#endif
+
+#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT)
+ #undef JSON_HEDLEY_WARN_UNUSED_RESULT
+#endif
+#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG)
+ #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG
+#endif
+#if (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L)
+ #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])
+ #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]])
+#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard)
+ #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])
+ #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]])
+#elif \
+ JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+ (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+ (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+ (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+ (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+ (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \
+ JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
+ #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))
+ #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__))
+#elif defined(_Check_return_) /* SAL */
+ #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_
+ #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_
+#else
+ #define JSON_HEDLEY_WARN_UNUSED_RESULT
+ #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg)
+#endif
+
+#if defined(JSON_HEDLEY_SENTINEL)
+ #undef JSON_HEDLEY_SENTINEL
+#endif
+#if \
+ JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0)
+ #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position)))
+#else
+ #define JSON_HEDLEY_SENTINEL(position)
+#endif
+
+#if defined(JSON_HEDLEY_NO_RETURN)
+ #undef JSON_HEDLEY_NO_RETURN
+#endif
+#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+ #define JSON_HEDLEY_NO_RETURN __noreturn
+#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+ #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__))
+#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
+ #define JSON_HEDLEY_NO_RETURN _Noreturn
+#elif defined(__cplusplus) && (__cplusplus >= 201103L)
+ #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]])
+#elif \
+ JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \
+ JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+ JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+ JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+ (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+ (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+ (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+ (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
+ #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__))
+#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
+ #define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return")
+#elif JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0)
+ #define JSON_HEDLEY_NO_RETURN __declspec(noreturn)
+#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus)
+ #define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;")
+#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0)
+ #define JSON_HEDLEY_NO_RETURN __attribute((noreturn))
+#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0)
+ #define JSON_HEDLEY_NO_RETURN __declspec(noreturn)
+#else
+ #define JSON_HEDLEY_NO_RETURN
+#endif
+
+#if defined(JSON_HEDLEY_NO_ESCAPE)
+ #undef JSON_HEDLEY_NO_ESCAPE
+#endif
+#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape)
+ #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__))
+#else
+ #define JSON_HEDLEY_NO_ESCAPE
+#endif
+
+#if defined(JSON_HEDLEY_UNREACHABLE)
+ #undef JSON_HEDLEY_UNREACHABLE
+#endif
+#if defined(JSON_HEDLEY_UNREACHABLE_RETURN)
+ #undef JSON_HEDLEY_UNREACHABLE_RETURN
+#endif
+#if defined(JSON_HEDLEY_ASSUME)
+ #undef JSON_HEDLEY_ASSUME
+#endif
+#if \
+ JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+ #define JSON_HEDLEY_ASSUME(expr) __assume(expr)
+#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume)
+ #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr)
+#elif \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0)
+ #if defined(__cplusplus)
+ #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr)
+ #else
+ #define JSON_HEDLEY_ASSUME(expr) _nassert(expr)
+ #endif
+#endif
+#if \
+ (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \
+ JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5)
+ #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable()
+#elif defined(JSON_HEDLEY_ASSUME)
+ #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0)
+#endif
+#if !defined(JSON_HEDLEY_ASSUME)
+ #if defined(JSON_HEDLEY_UNREACHABLE)
+ #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1)))
+ #else
+ #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr)
+ #endif
+#endif
+#if defined(JSON_HEDLEY_UNREACHABLE)
+ #if \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0)
+ #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value))
+ #else
+ #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE()
+ #endif
+#else
+ #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value)
+#endif
+#if !defined(JSON_HEDLEY_UNREACHABLE)
+ #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0)
+#endif
+
+JSON_HEDLEY_DIAGNOSTIC_PUSH
+#if JSON_HEDLEY_HAS_WARNING("-Wpedantic")
+ #pragma clang diagnostic ignored "-Wpedantic"
+#endif
+#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus)
+ #pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
+#endif
+#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0)
+ #if defined(__clang__)
+ #pragma clang diagnostic ignored "-Wvariadic-macros"
+ #elif defined(JSON_HEDLEY_GCC_VERSION)
+ #pragma GCC diagnostic ignored "-Wvariadic-macros"
+ #endif
+#endif
+#if defined(JSON_HEDLEY_NON_NULL)
+ #undef JSON_HEDLEY_NON_NULL
+#endif
+#if \
+ JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0)
+ #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__)))
+#else
+ #define JSON_HEDLEY_NON_NULL(...)
+#endif
+JSON_HEDLEY_DIAGNOSTIC_POP
+
+#if defined(JSON_HEDLEY_PRINTF_FORMAT)
+ #undef JSON_HEDLEY_PRINTF_FORMAT
+#endif
+#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO)
+ #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check)))
+#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO)
+ #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check)))
+#elif \
+ JSON_HEDLEY_HAS_ATTRIBUTE(format) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \
+ JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+ JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+ (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+ (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+ (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+ (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
+ #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check)))
+#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0)
+ #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check))
+#else
+ #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check)
+#endif
+
+#if defined(JSON_HEDLEY_CONSTEXPR)
+ #undef JSON_HEDLEY_CONSTEXPR
+#endif
+#if defined(__cplusplus)
+ #if __cplusplus >= 201103L
+ #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr)
+ #endif
+#endif
+#if !defined(JSON_HEDLEY_CONSTEXPR)
+ #define JSON_HEDLEY_CONSTEXPR
+#endif
+
+#if defined(JSON_HEDLEY_PREDICT)
+ #undef JSON_HEDLEY_PREDICT
+#endif
+#if defined(JSON_HEDLEY_LIKELY)
+ #undef JSON_HEDLEY_LIKELY
+#endif
+#if defined(JSON_HEDLEY_UNLIKELY)
+ #undef JSON_HEDLEY_UNLIKELY
+#endif
+#if defined(JSON_HEDLEY_UNPREDICTABLE)
+ #undef JSON_HEDLEY_UNPREDICTABLE
+#endif
+#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable)
+ #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr))
+#endif
+#if \
+ JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0)
+# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability))
+# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability))
+# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability))
+# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 )
+# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 )
+#elif \
+ JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+ JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+ JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+ JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \
+ JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0)
+# define JSON_HEDLEY_PREDICT(expr, expected, probability) \
+ (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)))
+# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \
+ (__extension__ ({ \
+ double hedley_probability_ = (probability); \
+ ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \
+ }))
+# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \
+ (__extension__ ({ \
+ double hedley_probability_ = (probability); \
+ ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \
+ }))
+# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1)
+# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0)
+#else
+# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))
+# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr))
+# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr))
+# define JSON_HEDLEY_LIKELY(expr) (!!(expr))
+# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr))
+#endif
+#if !defined(JSON_HEDLEY_UNPREDICTABLE)
+ #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5)
+#endif
+
+#if defined(JSON_HEDLEY_MALLOC)
+ #undef JSON_HEDLEY_MALLOC
+#endif
+#if \
+ JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+ JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \
+ JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+ (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+ (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+ (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+ (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
+ #define JSON_HEDLEY_MALLOC __attribute__((__malloc__))
+#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
+ #define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory")
+#elif JSON_HEDLEY_MSVC_VERSION_CHECK(14, 0, 0)
+ #define JSON_HEDLEY_MALLOC __declspec(restrict)
+#else
+ #define JSON_HEDLEY_MALLOC
+#endif
+
+#if defined(JSON_HEDLEY_PURE)
+ #undef JSON_HEDLEY_PURE
+#endif
+#if \
+ JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+ JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+ JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+ (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+ (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+ (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+ (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+ JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
+# define JSON_HEDLEY_PURE __attribute__((__pure__))
+#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
+# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data")
+#elif defined(__cplusplus) && \
+ ( \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \
+ )
+# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;")
+#else
+# define JSON_HEDLEY_PURE
+#endif
+
+#if defined(JSON_HEDLEY_CONST)
+ #undef JSON_HEDLEY_CONST
+#endif
+#if \
+ JSON_HEDLEY_HAS_ATTRIBUTE(const) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+ JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+ JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+ (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+ (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+ (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+ (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \
+ JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0)
+ #define JSON_HEDLEY_CONST __attribute__((__const__))
+#elif \
+ JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0)
+ #define JSON_HEDLEY_CONST _Pragma("no_side_effect")
+#else
+ #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE
+#endif
+
+#if defined(JSON_HEDLEY_RESTRICT)
+ #undef JSON_HEDLEY_RESTRICT
+#endif
+#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus)
+ #define JSON_HEDLEY_RESTRICT restrict
+#elif \
+ JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \
+ JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+ JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+ JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \
+ JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \
+ defined(__clang__)
+ #define JSON_HEDLEY_RESTRICT __restrict
+#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus)
+ #define JSON_HEDLEY_RESTRICT _Restrict
+#else
+ #define JSON_HEDLEY_RESTRICT
+#endif
+
+#if defined(JSON_HEDLEY_INLINE)
+ #undef JSON_HEDLEY_INLINE
+#endif
+#if \
+ (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \
+ (defined(__cplusplus) && (__cplusplus >= 199711L))
+ #define JSON_HEDLEY_INLINE inline
+#elif \
+ defined(JSON_HEDLEY_GCC_VERSION) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0)
+ #define JSON_HEDLEY_INLINE __inline__
+#elif \
+ JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
+ #define JSON_HEDLEY_INLINE __inline
+#else
+ #define JSON_HEDLEY_INLINE
+#endif
+
+#if defined(JSON_HEDLEY_ALWAYS_INLINE)
+ #undef JSON_HEDLEY_ALWAYS_INLINE
+#endif
+#if \
+ JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+ JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+ JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+ (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+ (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+ (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+ (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
+# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE
+#elif JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0)
+# define JSON_HEDLEY_ALWAYS_INLINE __forceinline
+#elif defined(__cplusplus) && \
+ ( \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \
+ )
+# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;")
+#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced")
+#else
+# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE
+#endif
+
+#if defined(JSON_HEDLEY_NEVER_INLINE)
+ #undef JSON_HEDLEY_NEVER_INLINE
+#endif
+#if \
+ JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+ JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \
+ JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \
+ (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \
+ (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \
+ (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \
+ (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \
+ JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \
+ JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0)
+ #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__))
+#elif JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0)
+ #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline)
+#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0)
+ #define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline")
+#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus)
+ #define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;")
+#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+ #define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never")
+#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0)
+ #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline))
+#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0)
+ #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline)
+#else
+ #define JSON_HEDLEY_NEVER_INLINE
+#endif
+
+#if defined(JSON_HEDLEY_PRIVATE)
+ #undef JSON_HEDLEY_PRIVATE
+#endif
+#if defined(JSON_HEDLEY_PUBLIC)
+ #undef JSON_HEDLEY_PUBLIC
+#endif
+#if defined(JSON_HEDLEY_IMPORT)
+ #undef JSON_HEDLEY_IMPORT
+#endif
+#if defined(_WIN32) || defined(__CYGWIN__)
+# define JSON_HEDLEY_PRIVATE
+# define JSON_HEDLEY_PUBLIC __declspec(dllexport)
+# define JSON_HEDLEY_IMPORT __declspec(dllimport)
+#else
+# if \
+ JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \
+ JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+ JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \
+ ( \
+ defined(__TI_EABI__) && \
+ ( \
+ (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \
+ ) \
+ )
+# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden")))
+# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default")))
+# else
+# define JSON_HEDLEY_PRIVATE
+# define JSON_HEDLEY_PUBLIC
+# endif
+# define JSON_HEDLEY_IMPORT extern
+#endif
+
+#if defined(JSON_HEDLEY_NO_THROW)
+ #undef JSON_HEDLEY_NO_THROW
+#endif
+#if \
+ JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+ #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__))
+#elif \
+ JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0)
+ #define JSON_HEDLEY_NO_THROW __declspec(nothrow)
+#else
+ #define JSON_HEDLEY_NO_THROW
+#endif
+
+#if defined(JSON_HEDLEY_FALL_THROUGH)
+ #undef JSON_HEDLEY_FALL_THROUGH
+#endif
+#if \
+ JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0)
+ #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__))
+#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough)
+ #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]])
+#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough)
+ #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]])
+#elif defined(__fallthrough) /* SAL */
+ #define JSON_HEDLEY_FALL_THROUGH __fallthrough
+#else
+ #define JSON_HEDLEY_FALL_THROUGH
+#endif
+
+#if defined(JSON_HEDLEY_RETURNS_NON_NULL)
+ #undef JSON_HEDLEY_RETURNS_NON_NULL
+#endif
+#if \
+ JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0)
+ #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__))
+#elif defined(_Ret_notnull_) /* SAL */
+ #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_
+#else
+ #define JSON_HEDLEY_RETURNS_NON_NULL
+#endif
+
+#if defined(JSON_HEDLEY_ARRAY_PARAM)
+ #undef JSON_HEDLEY_ARRAY_PARAM
+#endif
+#if \
+ defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \
+ !defined(__STDC_NO_VLA__) && \
+ !defined(__cplusplus) && \
+ !defined(JSON_HEDLEY_PGI_VERSION) && \
+ !defined(JSON_HEDLEY_TINYC_VERSION)
+ #define JSON_HEDLEY_ARRAY_PARAM(name) (name)
+#else
+ #define JSON_HEDLEY_ARRAY_PARAM(name)
+#endif
+
+#if defined(JSON_HEDLEY_IS_CONSTANT)
+ #undef JSON_HEDLEY_IS_CONSTANT
+#endif
+#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR)
+ #undef JSON_HEDLEY_REQUIRE_CONSTEXPR
+#endif
+/* JSON_HEDLEY_IS_CONSTEXPR_ is for
+ HEDLEY INTERNAL USE ONLY. API subject to change without notice. */
+#if defined(JSON_HEDLEY_IS_CONSTEXPR_)
+ #undef JSON_HEDLEY_IS_CONSTEXPR_
+#endif
+#if \
+ JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \
+ JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \
+ JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \
+ (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \
+ JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0)
+ #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr)
+#endif
+#if !defined(__cplusplus)
+# if \
+ JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \
+ JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \
+ JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24)
+#if defined(__INTPTR_TYPE__)
+ #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*)
+#else
+ #include <stdint.h>
+ #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*)
+#endif
+# elif \
+ ( \
+ defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \
+ !defined(JSON_HEDLEY_SUNPRO_VERSION) && \
+ !defined(JSON_HEDLEY_PGI_VERSION) && \
+ !defined(JSON_HEDLEY_IAR_VERSION)) || \
+ JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \
+ JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \
+ JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0)
+#if defined(__INTPTR_TYPE__)
+ #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0)
+#else
+ #include <stdint.h>
+ #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0)
+#endif
+# elif \
+ defined(JSON_HEDLEY_GCC_VERSION) || \
+ defined(JSON_HEDLEY_INTEL_VERSION) || \
+ defined(JSON_HEDLEY_TINYC_VERSION) || \
+ defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \
+ JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \
+ defined(JSON_HEDLEY_TI_CL2000_VERSION) || \
+ defined(JSON_HEDLEY_TI_CL6X_VERSION) || \
+ defined(JSON_HEDLEY_TI_CL7X_VERSION) || \
+ defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \
+ defined(__clang__)
+# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \
+ sizeof(void) != \
+ sizeof(*( \
+ 1 ? \
+ ((void*) ((expr) * 0L) ) : \
+((struct { char v[sizeof(void) * 2]; } *) 1) \
+ ) \
+ ) \
+ )
+# endif
+#endif
+#if defined(JSON_HEDLEY_IS_CONSTEXPR_)
+ #if !defined(JSON_HEDLEY_IS_CONSTANT)
+ #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr)
+ #endif
+ #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1))
+#else
+ #if !defined(JSON_HEDLEY_IS_CONSTANT)
+ #define JSON_HEDLEY_IS_CONSTANT(expr) (0)
+ #endif
+ #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr)
+#endif
+
+#if defined(JSON_HEDLEY_BEGIN_C_DECLS)
+ #undef JSON_HEDLEY_BEGIN_C_DECLS
+#endif
+#if defined(JSON_HEDLEY_END_C_DECLS)
+ #undef JSON_HEDLEY_END_C_DECLS
+#endif
+#if defined(JSON_HEDLEY_C_DECL)
+ #undef JSON_HEDLEY_C_DECL
+#endif
+#if defined(__cplusplus)
+ #define JSON_HEDLEY_BEGIN_C_DECLS extern "C" {
+ #define JSON_HEDLEY_END_C_DECLS }
+ #define JSON_HEDLEY_C_DECL extern "C"
+#else
+ #define JSON_HEDLEY_BEGIN_C_DECLS
+ #define JSON_HEDLEY_END_C_DECLS
+ #define JSON_HEDLEY_C_DECL
+#endif
+
+#if defined(JSON_HEDLEY_STATIC_ASSERT)
+ #undef JSON_HEDLEY_STATIC_ASSERT
+#endif
+#if \
+ !defined(__cplusplus) && ( \
+ (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \
+ JSON_HEDLEY_HAS_FEATURE(c_static_assert) || \
+ JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \
+ defined(_Static_assert) \
+ )
+# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message)
+#elif \
+ (defined(__cplusplus) && (__cplusplus >= 201103L)) || \
+ JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0)
+# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message))
+#else
+# define JSON_HEDLEY_STATIC_ASSERT(expr, message)
+#endif
+
+#if defined(JSON_HEDLEY_NULL)
+ #undef JSON_HEDLEY_NULL
+#endif
+#if defined(__cplusplus)
+ #if __cplusplus >= 201103L
+ #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr)
+ #elif defined(NULL)
+ #define JSON_HEDLEY_NULL NULL
+ #else
+ #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0)
+ #endif
+#elif defined(NULL)
+ #define JSON_HEDLEY_NULL NULL
+#else
+ #define JSON_HEDLEY_NULL ((void*) 0)
+#endif
+
+#if defined(JSON_HEDLEY_MESSAGE)
+ #undef JSON_HEDLEY_MESSAGE
+#endif
+#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas")
+# define JSON_HEDLEY_MESSAGE(msg) \
+ JSON_HEDLEY_DIAGNOSTIC_PUSH \
+ JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \
+ JSON_HEDLEY_PRAGMA(message msg) \
+ JSON_HEDLEY_DIAGNOSTIC_POP
+#elif \
+ JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg)
+#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0)
+# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg)
+#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0)
+# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg))
+#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0)
+# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg))
+#else
+# define JSON_HEDLEY_MESSAGE(msg)
+#endif
+
+#if defined(JSON_HEDLEY_WARNING)
+ #undef JSON_HEDLEY_WARNING
+#endif
+#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas")
+# define JSON_HEDLEY_WARNING(msg) \
+ JSON_HEDLEY_DIAGNOSTIC_PUSH \
+ JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \
+ JSON_HEDLEY_PRAGMA(clang warning msg) \
+ JSON_HEDLEY_DIAGNOSTIC_POP
+#elif \
+ JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \
+ JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \
+ JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0)
+# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg)
+#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0)
+# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg))
+#else
+# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg)
+#endif
+
+#if defined(JSON_HEDLEY_REQUIRE)
+ #undef JSON_HEDLEY_REQUIRE
+#endif
+#if defined(JSON_HEDLEY_REQUIRE_MSG)
+ #undef JSON_HEDLEY_REQUIRE_MSG
+#endif
+#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if)
+# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat")
+# define JSON_HEDLEY_REQUIRE(expr) \
+ JSON_HEDLEY_DIAGNOSTIC_PUSH \
+ _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \
+ __attribute__((diagnose_if(!(expr), #expr, "error"))) \
+ JSON_HEDLEY_DIAGNOSTIC_POP
+# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \
+ JSON_HEDLEY_DIAGNOSTIC_PUSH \
+ _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \
+ __attribute__((diagnose_if(!(expr), msg, "error"))) \
+ JSON_HEDLEY_DIAGNOSTIC_POP
+# else
+# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error")))
+# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error")))
+# endif
+#else
+# define JSON_HEDLEY_REQUIRE(expr)
+# define JSON_HEDLEY_REQUIRE_MSG(expr,msg)
+#endif
+
+#if defined(JSON_HEDLEY_FLAGS)
+ #undef JSON_HEDLEY_FLAGS
+#endif
+#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum)
+ #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__))
+#endif
+
+#if defined(JSON_HEDLEY_FLAGS_CAST)
+ #undef JSON_HEDLEY_FLAGS_CAST
+#endif
+#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0)
+# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \
+ JSON_HEDLEY_DIAGNOSTIC_PUSH \
+ _Pragma("warning(disable:188)") \
+ ((T) (expr)); \
+ JSON_HEDLEY_DIAGNOSTIC_POP \
+ }))
+#else
+# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr)
+#endif
+
+#if defined(JSON_HEDLEY_EMPTY_BASES)
+ #undef JSON_HEDLEY_EMPTY_BASES
+#endif
+#if JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)
+ #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases)
+#else
+ #define JSON_HEDLEY_EMPTY_BASES
+#endif
+
+/* Remaining macros are deprecated. */
+
+#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK)
+ #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK
+#endif
+#if defined(__clang__)
+ #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0)
+#else
+ #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch)
+#endif
+
+#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE)
+ #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE
+#endif
+#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute)
+
+#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE)
+ #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE
+#endif
+#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute)
+
+#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN)
+ #undef JSON_HEDLEY_CLANG_HAS_BUILTIN
+#endif
+#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin)
+
+#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE)
+ #undef JSON_HEDLEY_CLANG_HAS_FEATURE
+#endif
+#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature)
+
+#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION)
+ #undef JSON_HEDLEY_CLANG_HAS_EXTENSION
+#endif
+#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension)
+
+#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE)
+ #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE
+#endif
+#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute)
+
+#if defined(JSON_HEDLEY_CLANG_HAS_WARNING)
+ #undef JSON_HEDLEY_CLANG_HAS_WARNING
+#endif
+#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning)
+
+#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */
+
+
+// This file contains all internal macro definitions
+// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them
+
+// exclude unsupported compilers
+#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK)
+ #if defined(__clang__)
+ #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400
+ #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers"
+ #endif
+ #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER))
+ #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800
+ #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers"
+ #endif
+ #endif
+#endif
+
+// C++ language standard detection
+#if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464
+ #define JSON_HAS_CPP_17
+ #define JSON_HAS_CPP_14
+#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)
+ #define JSON_HAS_CPP_14
+#endif
+
+// disable float-equal warnings on GCC/clang
+#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wfloat-equal"
+#endif
+
+// disable documentation warnings on clang
+#if defined(__clang__)
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wdocumentation"
+#endif
+
+// allow to disable exceptions
+#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION)
+ #define JSON_THROW(exception) throw exception
+ #define JSON_TRY try
+ #define JSON_CATCH(exception) catch(exception)
+ #define JSON_INTERNAL_CATCH(exception) catch(exception)
+#else
+ #include <cstdlib>
+ #define JSON_THROW(exception) std::abort()
+ #define JSON_TRY if(true)
+ #define JSON_CATCH(exception) if(false)
+ #define JSON_INTERNAL_CATCH(exception) if(false)
+#endif
+
+// override exception macros
+#if defined(JSON_THROW_USER)
+ #undef JSON_THROW
+ #define JSON_THROW JSON_THROW_USER
+#endif
+#if defined(JSON_TRY_USER)
+ #undef JSON_TRY
+ #define JSON_TRY JSON_TRY_USER
+#endif
+#if defined(JSON_CATCH_USER)
+ #undef JSON_CATCH
+ #define JSON_CATCH JSON_CATCH_USER
+ #undef JSON_INTERNAL_CATCH
+ #define JSON_INTERNAL_CATCH JSON_CATCH_USER
+#endif
+#if defined(JSON_INTERNAL_CATCH_USER)
+ #undef JSON_INTERNAL_CATCH
+ #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER
+#endif
+
+/*!
+@brief macro to briefly define a mapping between an enum and JSON
+@def NLOHMANN_JSON_SERIALIZE_ENUM
+@since version 3.4.0
+*/
+#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \
+ template<typename BasicJsonType> \
+ inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \
+ { \
+ static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \
+ static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \
+ auto it = std::find_if(std::begin(m), std::end(m), \
+ [e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
+ { \
+ return ej_pair.first == e; \
+ }); \
+ j = ((it != std::end(m)) ? it : std::begin(m))->second; \
+ } \
+ template<typename BasicJsonType> \
+ inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \
+ { \
+ static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \
+ static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \
+ auto it = std::find_if(std::begin(m), std::end(m), \
+ [&j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
+ { \
+ return ej_pair.second == j; \
+ }); \
+ e = ((it != std::end(m)) ? it : std::begin(m))->first; \
+ }
+
+// Ugly macros to avoid uglier copy-paste when specializing basic_json. They
+// may be removed in the future once the class is split.
+
+#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \
+ template<template<typename, typename, typename...> class ObjectType, \
+ template<typename, typename...> class ArrayType, \
+ class StringType, class BooleanType, class NumberIntegerType, \
+ class NumberUnsignedType, class NumberFloatType, \
+ template<typename> class AllocatorType, \
+ template<typename, typename = void> class JSONSerializer, \
+ class BinaryType>
+
+#define NLOHMANN_BASIC_JSON_TPL \
+ basic_json<ObjectType, ArrayType, StringType, BooleanType, \
+ NumberIntegerType, NumberUnsignedType, NumberFloatType, \
+ AllocatorType, JSONSerializer, BinaryType>
+
namespace nlohmann
{
@@ -146,6 +2190,7 @@ class exception : public std::exception
{
public:
/// returns the explanatory string
+ JSON_HEDLEY_RETURNS_NON_NULL
const char* what() const noexcept override
{
return m.what();
@@ -155,6 +2200,7 @@ class exception : public std::exception
const int id;
protected:
+ JSON_HEDLEY_NON_NULL(3)
exception(int id_, const char* what_arg) : id(id_), m(what_arg) {}
static std::string name(const std::string& ename, int id_)
@@ -307,6 +2353,7 @@ class invalid_iterator : public exception
}
private:
+ JSON_HEDLEY_NON_NULL(3)
invalid_iterator(int id_, const char* what_arg)
: exception(id_, what_arg) {}
};
@@ -360,6 +2407,7 @@ class type_error : public exception
}
private:
+ JSON_HEDLEY_NON_NULL(3)
type_error(int id_, const char* what_arg) : exception(id_, what_arg) {}
};
@@ -406,6 +2454,7 @@ class out_of_range : public exception
}
private:
+ JSON_HEDLEY_NON_NULL(3)
out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {}
};
@@ -443,6 +2492,7 @@ class other_error : public exception
}
private:
+ JSON_HEDLEY_NON_NULL(3)
other_error(int id_, const char* what_arg) : exception(id_, what_arg) {}
};
} // namespace detail
@@ -450,164 +2500,15 @@ class other_error : public exception
// #include <nlohmann/detail/macro_scope.hpp>
-
-#include <utility> // pair
-
-// This file contains all internal macro definitions
-// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them
-
-// exclude unsupported compilers
-#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK)
- #if defined(__clang__)
- #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400
- #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers"
- #endif
- #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER))
- #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800
- #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers"
- #endif
- #endif
-#endif
-
-// disable float-equal warnings on GCC/clang
-#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wfloat-equal"
-#endif
-
-// disable documentation warnings on clang
-#if defined(__clang__)
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wdocumentation"
-#endif
-
-// allow for portable deprecation warnings
-#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
- #define JSON_DEPRECATED __attribute__((deprecated))
-#elif defined(_MSC_VER)
- #define JSON_DEPRECATED __declspec(deprecated)
-#else
- #define JSON_DEPRECATED
-#endif
-
-// allow for portable nodiscard warnings
-#if defined(__has_cpp_attribute)
- #if __has_cpp_attribute(nodiscard)
- #define JSON_NODISCARD [[nodiscard]]
- #elif __has_cpp_attribute(gnu::warn_unused_result)
- #define JSON_NODISCARD [[gnu::warn_unused_result]]
- #else
- #define JSON_NODISCARD
- #endif
-#else
- #define JSON_NODISCARD
-#endif
-
-// allow to disable exceptions
-#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION)
- #define JSON_THROW(exception) throw exception
- #define JSON_TRY try
- #define JSON_CATCH(exception) catch(exception)
- #define JSON_INTERNAL_CATCH(exception) catch(exception)
-#else
- #include <cstdlib>
- #define JSON_THROW(exception) std::abort()
- #define JSON_TRY if(true)
- #define JSON_CATCH(exception) if(false)
- #define JSON_INTERNAL_CATCH(exception) if(false)
-#endif
-
-// override exception macros
-#if defined(JSON_THROW_USER)
- #undef JSON_THROW
- #define JSON_THROW JSON_THROW_USER
-#endif
-#if defined(JSON_TRY_USER)
- #undef JSON_TRY
- #define JSON_TRY JSON_TRY_USER
-#endif
-#if defined(JSON_CATCH_USER)
- #undef JSON_CATCH
- #define JSON_CATCH JSON_CATCH_USER
- #undef JSON_INTERNAL_CATCH
- #define JSON_INTERNAL_CATCH JSON_CATCH_USER
-#endif
-#if defined(JSON_INTERNAL_CATCH_USER)
- #undef JSON_INTERNAL_CATCH
- #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER
-#endif
-
-// manual branch prediction
-#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)
- #define JSON_LIKELY(x) __builtin_expect(x, 1)
- #define JSON_UNLIKELY(x) __builtin_expect(x, 0)
-#else
- #define JSON_LIKELY(x) x
- #define JSON_UNLIKELY(x) x
-#endif
-
-// C++ language standard detection
-#if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464
- #define JSON_HAS_CPP_17
- #define JSON_HAS_CPP_14
-#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1)
- #define JSON_HAS_CPP_14
-#endif
-
-/*!
-@brief macro to briefly define a mapping between an enum and JSON
-@def NLOHMANN_JSON_SERIALIZE_ENUM
-@since version 3.4.0
-*/
-#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \
- template<typename BasicJsonType> \
- inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \
- { \
- static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \
- static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \
- auto it = std::find_if(std::begin(m), std::end(m), \
- [e](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
- { \
- return ej_pair.first == e; \
- }); \
- j = ((it != std::end(m)) ? it : std::begin(m))->second; \
- } \
- template<typename BasicJsonType> \
- inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \
- { \
- static_assert(std::is_enum<ENUM_TYPE>::value, #ENUM_TYPE " must be an enum!"); \
- static const std::pair<ENUM_TYPE, BasicJsonType> m[] = __VA_ARGS__; \
- auto it = std::find_if(std::begin(m), std::end(m), \
- [j](const std::pair<ENUM_TYPE, BasicJsonType>& ej_pair) -> bool \
- { \
- return ej_pair.second == j; \
- }); \
- e = ((it != std::end(m)) ? it : std::begin(m))->first; \
- }
-
-// Ugly macros to avoid uglier copy-paste when specializing basic_json. They
-// may be removed in the future once the class is split.
-
-#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \
- template<template<typename, typename, typename...> class ObjectType, \
- template<typename, typename...> class ArrayType, \
- class StringType, class BooleanType, class NumberIntegerType, \
- class NumberUnsignedType, class NumberFloatType, \
- template<typename> class AllocatorType, \
- template<typename, typename = void> class JSONSerializer>
-
-#define NLOHMANN_BASIC_JSON_TPL \
- basic_json<ObjectType, ArrayType, StringType, BooleanType, \
- NumberIntegerType, NumberUnsignedType, NumberFloatType, \
- AllocatorType, JSONSerializer>
-
// #include <nlohmann/detail/meta/cpp_future.hpp>
-#include <ciso646> // not
#include <cstddef> // size_t
#include <type_traits> // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type
+// #include <nlohmann/detail/boolean_operators.hpp>
+
+
namespace nlohmann
{
namespace detail
@@ -669,11 +2570,12 @@ constexpr T static_const<T>::value;
// #include <nlohmann/detail/meta/type_traits.hpp>
-#include <ciso646> // not
#include <limits> // numeric_limits
#include <type_traits> // false_type, is_constructible, is_integral, is_same, true_type
#include <utility> // declval
+// #include <nlohmann/detail/boolean_operators.hpp>
+
// #include <nlohmann/detail/iterators/iterator_traits.hpp>
@@ -754,7 +2656,7 @@ struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>
// #include <nlohmann/detail/meta/void_t.hpp>
-// http://en.cppreference.com/w/cpp/experimental/is_detected
+// https://en.cppreference.com/w/cpp/experimental/is_detected
namespace nlohmann
{
namespace detail
@@ -843,7 +2745,8 @@ template<template<typename U, typename V, typename... Args> class ObjectType =
class NumberFloatType = double,
template<typename U> class AllocatorType = std::allocator,
template<typename T, typename SFINAE = void> class JSONSerializer =
- adl_serializer>
+ adl_serializer,
+ class BinaryType = std::vector<std::uint8_t>>
class basic_json;
/*!
@@ -904,6 +2807,19 @@ template<typename> struct is_basic_json : std::false_type {};
NLOHMANN_BASIC_JSON_TPL_DECLARATION
struct is_basic_json<NLOHMANN_BASIC_JSON_TPL> : std::true_type {};
+//////////////////////
+// json_ref helpers //
+//////////////////////
+
+template <typename>
+class json_ref;
+
+template<typename>
+struct is_json_ref : std::false_type {};
+
+template <typename T>
+struct is_json_ref<json_ref<T>> : std::true_type {};
+
//////////////////////////
// aliases for detected //
//////////////////////////
@@ -1055,10 +2971,19 @@ struct is_constructible_object_type_impl <
using object_t = typename BasicJsonType::object_t;
static constexpr bool value =
- (std::is_constructible<typename ConstructibleObjectType::key_type, typename object_t::key_type>::value and
- std::is_same<typename object_t::mapped_type, typename ConstructibleObjectType::mapped_type>::value) or
- (has_from_json<BasicJsonType, typename ConstructibleObjectType::mapped_type>::value or
- has_non_default_from_json<BasicJsonType, typename ConstructibleObjectType::mapped_type >::value);
+ (std::is_default_constructible<ConstructibleObjectType>::value and
+ (std::is_move_assignable<ConstructibleObjectType>::value or
+ std::is_copy_assignable<ConstructibleObjectType>::value) and
+ (std::is_constructible<typename ConstructibleObjectType::key_type,
+ typename object_t::key_type>::value and
+ std::is_same <
+ typename object_t::mapped_type,
+ typename ConstructibleObjectType::mapped_type >::value)) or
+ (has_from_json<BasicJsonType,
+ typename ConstructibleObjectType::mapped_type>::value or
+ has_non_default_from_json <
+ BasicJsonType,
+ typename ConstructibleObjectType::mapped_type >::value);
};
template <typename BasicJsonType, typename ConstructibleObjectType>
@@ -1141,20 +3066,24 @@ struct is_constructible_array_type_impl <
BasicJsonType, ConstructibleArrayType,
enable_if_t<not std::is_same<ConstructibleArrayType,
typename BasicJsonType::value_type>::value and
- is_detected<value_type_t, ConstructibleArrayType>::value and
- is_detected<iterator_t, ConstructibleArrayType>::value and
- is_complete_type<
- detected_t<value_type_t, ConstructibleArrayType>>::value >>
+ std::is_default_constructible<ConstructibleArrayType>::value and
+(std::is_move_assignable<ConstructibleArrayType>::value or
+ std::is_copy_assignable<ConstructibleArrayType>::value) and
+is_detected<value_type_t, ConstructibleArrayType>::value and
+is_detected<iterator_t, ConstructibleArrayType>::value and
+is_complete_type<
+detected_t<value_type_t, ConstructibleArrayType>>::value >>
{
static constexpr bool value =
// This is needed because json_reverse_iterator has a ::iterator type,
- // furthermore, std::back_insert_iterator (and other iterators) have a base class `iterator`...
- // Therefore it is detected as a ConstructibleArrayType.
- // The real fix would be to have an Iterable concept.
- not is_iterator_traits <
- iterator_traits<ConstructibleArrayType >>::value and
-
- (std::is_same<typename ConstructibleArrayType::value_type, typename BasicJsonType::array_t::value_type>::value or
+ // furthermore, std::back_insert_iterator (and other iterators) have a
+ // base class `iterator`... Therefore it is detected as a
+ // ConstructibleArrayType. The real fix would be to have an Iterable
+ // concept.
+ not is_iterator_traits<iterator_traits<ConstructibleArrayType>>::value and
+
+ (std::is_same<typename ConstructibleArrayType::value_type,
+ typename BasicJsonType::array_t::value_type>::value or
has_from_json<BasicJsonType,
typename ConstructibleArrayType::value_type>::value or
has_non_default_from_json <
@@ -1207,6 +3136,19 @@ struct is_compatible_type_impl <
template <typename BasicJsonType, typename CompatibleType>
struct is_compatible_type
: is_compatible_type_impl<BasicJsonType, CompatibleType> {};
+
+// https://en.cppreference.com/w/cpp/types/conjunction
+template<class...> struct conjunction : std::true_type { };
+template<class B1> struct conjunction<B1> : B1 { };
+template<class B1, class... Bn>
+struct conjunction<B1, Bn...>
+: std::conditional<bool(B1::value), conjunction<Bn...>, B1>::type {};
+
+template <typename T1, typename T2>
+struct is_constructible_tuple : std::false_type {};
+
+template <typename T1, typename... Args>
+struct is_constructible_tuple<T1, std::tuple<Args...>> : conjunction<std::is_constructible<T1, Args>...> {};
} // namespace detail
} // namespace nlohmann
@@ -1214,11 +3156,13 @@ struct is_compatible_type
#include <array> // array
-#include <ciso646> // and
#include <cstddef> // size_t
#include <cstdint> // uint8_t
#include <string> // string
+// #include <nlohmann/detail/boolean_operators.hpp>
+
+
namespace nlohmann
{
namespace detail
@@ -1261,24 +3205,29 @@ enum class value_t : std::uint8_t
number_integer, ///< number value (signed integer)
number_unsigned, ///< number value (unsigned integer)
number_float, ///< number value (floating-point)
- discarded ///< discarded by the the parser callback function
+ binary, ///< binary array (ordered collection of bytes)
+ discarded ///< discarded by the parser callback function
};
/*!
@brief comparison operator for JSON types
Returns an ordering that is similar to Python:
-- order: null < boolean < number < object < array < string
+- order: null < boolean < number < object < array < string < binary
- furthermore, each type is not smaller than itself
- discarded values are not comparable
+- binary is represented as a b"" string in python and directly comparable to a
+ string; however, making a binary array directly comparable with a string would
+ be surprising behavior in a JSON file.
@since version 1.0.0
*/
inline bool operator<(const value_t lhs, const value_t rhs) noexcept
{
- static constexpr std::array<std::uint8_t, 8> order = {{
+ static constexpr std::array<std::uint8_t, 9> order = {{
0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */,
- 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */
+ 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */,
+ 6 /* binary */
}
};
@@ -1297,7 +3246,7 @@ namespace detail
template<typename BasicJsonType>
void from_json(const BasicJsonType& j, typename std::nullptr_t& n)
{
- if (JSON_UNLIKELY(not j.is_null()))
+ if (JSON_HEDLEY_UNLIKELY(not j.is_null()))
{
JSON_THROW(type_error::create(302, "type must be null, but is " + std::string(j.type_name())));
}
@@ -1337,7 +3286,7 @@ void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val)
template<typename BasicJsonType>
void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b)
{
- if (JSON_UNLIKELY(not j.is_boolean()))
+ if (JSON_HEDLEY_UNLIKELY(not j.is_boolean()))
{
JSON_THROW(type_error::create(302, "type must be boolean, but is " + std::string(j.type_name())));
}
@@ -1347,7 +3296,7 @@ void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b)
template<typename BasicJsonType>
void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s)
{
- if (JSON_UNLIKELY(not j.is_string()))
+ if (JSON_HEDLEY_UNLIKELY(not j.is_string()))
{
JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name())));
}
@@ -1363,7 +3312,7 @@ template <
int > = 0 >
void from_json(const BasicJsonType& j, ConstructibleStringType& s)
{
- if (JSON_UNLIKELY(not j.is_string()))
+ if (JSON_HEDLEY_UNLIKELY(not j.is_string()))
{
JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name())));
}
@@ -1403,10 +3352,11 @@ template<typename BasicJsonType, typename T, typename Allocator,
enable_if_t<std::is_convertible<BasicJsonType, T>::value, int> = 0>
void from_json(const BasicJsonType& j, std::forward_list<T, Allocator>& l)
{
- if (JSON_UNLIKELY(not j.is_array()))
+ if (JSON_HEDLEY_UNLIKELY(not j.is_array()))
{
JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name())));
}
+ l.clear();
std::transform(j.rbegin(), j.rend(),
std::front_inserter(l), [](const BasicJsonType & i)
{
@@ -1419,12 +3369,22 @@ template<typename BasicJsonType, typename T,
enable_if_t<std::is_convertible<BasicJsonType, T>::value, int> = 0>
void from_json(const BasicJsonType& j, std::valarray<T>& l)
{
- if (JSON_UNLIKELY(not j.is_array()))
+ if (JSON_HEDLEY_UNLIKELY(not j.is_array()))
{
JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name())));
}
l.resize(j.size());
- std::copy(j.m_value.array->begin(), j.m_value.array->end(), std::begin(l));
+ std::copy(j.begin(), j.end(), std::begin(l));
+}
+
+template <typename BasicJsonType, typename T, std::size_t N>
+auto from_json(const BasicJsonType& j, T (&arr)[N])
+-> decltype(j.template get<T>(), void())
+{
+ for (std::size_t i = 0; i < N; ++i)
+ {
+ arr[i] = j.at(i).template get<T>();
+ }
}
template<typename BasicJsonType>
@@ -1453,14 +3413,16 @@ auto from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, p
{
using std::end;
- arr.reserve(j.size());
+ ConstructibleArrayType ret;
+ ret.reserve(j.size());
std::transform(j.begin(), j.end(),
- std::inserter(arr, end(arr)), [](const BasicJsonType & i)
+ std::inserter(ret, end(ret)), [](const BasicJsonType & i)
{
// get<BasicJsonType>() returns *this, this won't call a from_json
// method when value_type is BasicJsonType
return i.template get<typename ConstructibleArrayType::value_type>();
});
+ arr = std::move(ret);
}
template <typename BasicJsonType, typename ConstructibleArrayType>
@@ -1469,14 +3431,16 @@ void from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr,
{
using std::end;
+ ConstructibleArrayType ret;
std::transform(
- j.begin(), j.end(), std::inserter(arr, end(arr)),
+ j.begin(), j.end(), std::inserter(ret, end(ret)),
[](const BasicJsonType & i)
{
// get<BasicJsonType>() returns *this, this won't call a from_json
// method when value_type is BasicJsonType
return i.template get<typename ConstructibleArrayType::value_type>();
});
+ arr = std::move(ret);
}
template <typename BasicJsonType, typename ConstructibleArrayType,
@@ -1484,15 +3448,15 @@ template <typename BasicJsonType, typename ConstructibleArrayType,
is_constructible_array_type<BasicJsonType, ConstructibleArrayType>::value and
not is_constructible_object_type<BasicJsonType, ConstructibleArrayType>::value and
not is_constructible_string_type<BasicJsonType, ConstructibleArrayType>::value and
+ not std::is_same<ConstructibleArrayType, typename BasicJsonType::binary_t>::value and
not is_basic_json<ConstructibleArrayType>::value,
int > = 0 >
-
auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr)
-> decltype(from_json_array_impl(j, arr, priority_tag<3> {}),
j.template get<typename ConstructibleArrayType::value_type>(),
void())
{
- if (JSON_UNLIKELY(not j.is_array()))
+ if (JSON_HEDLEY_UNLIKELY(not j.is_array()))
{
JSON_THROW(type_error::create(302, "type must be array, but is " +
std::string(j.type_name())));
@@ -1501,24 +3465,37 @@ void())
from_json_array_impl(j, arr, priority_tag<3> {});
}
+template <typename BasicJsonType>
+void from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin)
+{
+ if (JSON_HEDLEY_UNLIKELY(not j.is_binary()))
+ {
+ JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(j.type_name())));
+ }
+
+ bin = *j.template get_ptr<const typename BasicJsonType::binary_t*>();
+}
+
template<typename BasicJsonType, typename ConstructibleObjectType,
enable_if_t<is_constructible_object_type<BasicJsonType, ConstructibleObjectType>::value, int> = 0>
void from_json(const BasicJsonType& j, ConstructibleObjectType& obj)
{
- if (JSON_UNLIKELY(not j.is_object()))
+ if (JSON_HEDLEY_UNLIKELY(not j.is_object()))
{
JSON_THROW(type_error::create(302, "type must be object, but is " + std::string(j.type_name())));
}
+ ConstructibleObjectType ret;
auto inner_object = j.template get_ptr<const typename BasicJsonType::object_t*>();
using value_type = typename ConstructibleObjectType::value_type;
std::transform(
inner_object->begin(), inner_object->end(),
- std::inserter(obj, obj.begin()),
+ std::inserter(ret, ret.begin()),
[](typename BasicJsonType::object_t::value_type const & p)
{
return value_type(p.first, p.second.template get<typename ConstructibleObjectType::mapped_type>());
});
+ obj = std::move(ret);
}
// overload for arithmetic types, not chosen for basic_json template arguments
@@ -1586,13 +3563,14 @@ template <typename BasicJsonType, typename Key, typename Value, typename Compare
typename BasicJsonType::string_t, Key>::value>>
void from_json(const BasicJsonType& j, std::map<Key, Value, Compare, Allocator>& m)
{
- if (JSON_UNLIKELY(not j.is_array()))
+ if (JSON_HEDLEY_UNLIKELY(not j.is_array()))
{
JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name())));
}
+ m.clear();
for (const auto& p : j)
{
- if (JSON_UNLIKELY(not p.is_array()))
+ if (JSON_HEDLEY_UNLIKELY(not p.is_array()))
{
JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name())));
}
@@ -1605,13 +3583,14 @@ template <typename BasicJsonType, typename Key, typename Value, typename Hash, t
typename BasicJsonType::string_t, Key>::value>>
void from_json(const BasicJsonType& j, std::unordered_map<Key, Value, Hash, KeyEqual, Allocator>& m)
{
- if (JSON_UNLIKELY(not j.is_array()))
+ if (JSON_HEDLEY_UNLIKELY(not j.is_array()))
{
JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name())));
}
+ m.clear();
for (const auto& p : j)
{
- if (JSON_UNLIKELY(not p.is_array()))
+ if (JSON_HEDLEY_UNLIKELY(not p.is_array()))
{
JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name())));
}
@@ -1638,13 +3617,12 @@ namespace
{
constexpr const auto& from_json = detail::static_const<detail::from_json_fn>::value;
} // namespace
-} // namespace nlohmann
+} // namespace nlohmann
// #include <nlohmann/detail/conversions/to_json.hpp>
#include <algorithm> // copy
-#include <ciso646> // or, and, not
#include <iterator> // begin, end
#include <string> // string
#include <tuple> // tuple, get
@@ -1653,6 +3631,8 @@ constexpr const auto& from_json = detail::static_const<detail::from_json_fn>::va
#include <valarray> // valarray
#include <vector> // vector
+// #include <nlohmann/detail/boolean_operators.hpp>
+
// #include <nlohmann/detail/iterators/iteration_proxy.hpp>
@@ -1670,6 +3650,11 @@ namespace nlohmann
{
namespace detail
{
+template<typename string_type>
+void int_to_string( string_type& target, std::size_t value )
+{
+ target = std::to_string(value);
+}
template <typename IteratorType> class iteration_proxy_value
{
public:
@@ -1678,6 +3663,7 @@ template <typename IteratorType> class iteration_proxy_value
using pointer = value_type * ;
using reference = value_type & ;
using iterator_category = std::input_iterator_tag;
+ using string_type = typename std::remove_cv< typename std::remove_reference<decltype( std::declval<IteratorType>().key() ) >::type >::type;
private:
/// the iterator
@@ -1687,9 +3673,9 @@ template <typename IteratorType> class iteration_proxy_value
/// last stringified array index
mutable std::size_t array_index_last = 0;
/// a string representation of the array index
- mutable std::string array_index_str = "0";
+ mutable string_type array_index_str = "0";
/// an empty string (to return a reference for primitive values)
- const std::string empty_str = "";
+ const string_type empty_str = "";
public:
explicit iteration_proxy_value(IteratorType it) noexcept : anchor(it) {}
@@ -1722,7 +3708,7 @@ template <typename IteratorType> class iteration_proxy_value
}
/// return key of the iterator
- const std::string& key() const
+ const string_type& key() const
{
assert(anchor.m_object != nullptr);
@@ -1733,7 +3719,7 @@ template <typename IteratorType> class iteration_proxy_value
{
if (array_index != array_index_last)
{
- array_index_str = std::to_string(array_index);
+ int_to_string( array_index_str, array_index );
array_index_last = array_index;
}
return array_index_str;
@@ -1887,6 +3873,28 @@ struct external_constructor<value_t::string>
};
template<>
+struct external_constructor<value_t::binary>
+{
+ template<typename BasicJsonType>
+ static void construct(BasicJsonType& j, const typename BasicJsonType::binary_t& b)
+ {
+ j.m_type = value_t::binary;
+ typename BasicJsonType::binary_t value{b};
+ j.m_value = value;
+ j.assert_invariant();
+ }
+
+ template<typename BasicJsonType>
+ static void construct(BasicJsonType& j, typename BasicJsonType::binary_t&& b)
+ {
+ j.m_type = value_t::binary;
+ typename BasicJsonType::binary_t value{std::move(b)};
+ j.m_value = value;
+ j.assert_invariant();
+ }
+};
+
+template<>
struct external_constructor<value_t::number_float>
{
template<typename BasicJsonType>
@@ -1973,7 +3981,10 @@ struct external_constructor<value_t::array>
j.m_type = value_t::array;
j.m_value = value_t::array;
j.m_value.array->resize(arr.size());
- std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin());
+ if (arr.size() > 0)
+ {
+ std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin());
+ }
j.assert_invariant();
}
};
@@ -2072,9 +4083,9 @@ void to_json(BasicJsonType& j, const std::vector<bool>& e)
template <typename BasicJsonType, typename CompatibleArrayType,
enable_if_t<is_compatible_array_type<BasicJsonType,
CompatibleArrayType>::value and
- not is_compatible_object_type<
- BasicJsonType, CompatibleArrayType>::value and
+ not is_compatible_object_type<BasicJsonType, CompatibleArrayType>::value and
not is_compatible_string_type<BasicJsonType, CompatibleArrayType>::value and
+ not std::is_same<typename BasicJsonType::binary_t, CompatibleArrayType>::value and
not is_basic_json<CompatibleArrayType>::value,
int> = 0>
void to_json(BasicJsonType& j, const CompatibleArrayType& arr)
@@ -2082,6 +4093,12 @@ void to_json(BasicJsonType& j, const CompatibleArrayType& arr)
external_constructor<value_t::array>::construct(j, arr);
}
+template <typename BasicJsonType>
+void to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin)
+{
+ external_constructor<value_t::binary>::construct(j, bin);
+}
+
template<typename BasicJsonType, typename T,
enable_if_t<std::is_convertible<T, BasicJsonType>::value, int> = 0>
void to_json(BasicJsonType& j, const std::valarray<T>& arr)
@@ -2118,8 +4135,8 @@ void to_json(BasicJsonType& j, const T(&arr)[N])
external_constructor<value_t::array>::construct(j, arr);
}
-template<typename BasicJsonType, typename... Args>
-void to_json(BasicJsonType& j, const std::pair<Args...>& p)
+template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible<BasicJsonType, T1>::value&& std::is_constructible<BasicJsonType, T2>::value, int > = 0 >
+void to_json(BasicJsonType& j, const std::pair<T1, T2>& p)
{
j = { p.first, p.second };
}
@@ -2138,10 +4155,10 @@ void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence<Idx...>
j = { std::get<Idx>(t)... };
}
-template<typename BasicJsonType, typename... Args>
-void to_json(BasicJsonType& j, const std::tuple<Args...>& t)
+template<typename BasicJsonType, typename T, enable_if_t<is_constructible_tuple<BasicJsonType, T>::value, int > = 0>
+void to_json(BasicJsonType& j, const T& t)
{
- to_json_tuple_impl(j, t, index_sequence_for<Args...> {});
+ to_json_tuple_impl(j, t, make_index_sequence<std::tuple_size<T>::value> {});
}
struct to_json_fn
@@ -2160,7 +4177,7 @@ namespace
{
constexpr const auto& to_json = detail::static_const<detail::to_json_fn>::value;
} // namespace
-} // namespace nlohmann
+} // namespace nlohmann
namespace nlohmann
@@ -2206,6 +4223,176 @@ struct adl_serializer
} // namespace nlohmann
+// #include <nlohmann/byte_container_with_subtype.hpp>
+
+
+#include <cstdint> // uint8_t
+#include <tuple> // tie
+#include <utility> // move
+
+namespace nlohmann
+{
+
+/*!
+@brief an internal type for a backed binary type
+
+This type extends the template parameter @a BinaryType provided to `basic_json`
+with a subtype used by BSON and MessagePack. This type exists so that the user
+does not have to specify a type themselves with a specific naming scheme in
+order to override the binary type.
+
+@tparam BinaryType container to store bytes (`std::vector<std::uint8_t>` by
+ default)
+
+@since version 3.8.0
+*/
+template<typename BinaryType>
+class byte_container_with_subtype : public BinaryType
+{
+ public:
+ /// the type of the underlying container
+ using container_type = BinaryType;
+
+ byte_container_with_subtype() noexcept(noexcept(container_type()))
+ : container_type()
+ {}
+
+ byte_container_with_subtype(const container_type& b) noexcept(noexcept(container_type(b)))
+ : container_type(b)
+ {}
+
+ byte_container_with_subtype(container_type&& b) noexcept(noexcept(container_type(std::move(b))))
+ : container_type(std::move(b))
+ {}
+
+ byte_container_with_subtype(const container_type& b, std::uint8_t subtype) noexcept(noexcept(container_type(b)))
+ : container_type(b)
+ , m_subtype(subtype)
+ , m_has_subtype(true)
+ {}
+
+ byte_container_with_subtype(container_type&& b, std::uint8_t subtype) noexcept(noexcept(container_type(std::move(b))))
+ : container_type(std::move(b))
+ , m_subtype(subtype)
+ , m_has_subtype(true)
+ {}
+
+ bool operator==(const byte_container_with_subtype& rhs) const
+ {
+ return std::tie(static_cast<const BinaryType&>(*this), m_subtype, m_has_subtype) ==
+ std::tie(static_cast<const BinaryType&>(rhs), rhs.m_subtype, rhs.m_has_subtype);
+ }
+
+ bool operator!=(const byte_container_with_subtype& rhs) const
+ {
+ return !(rhs == *this);
+ }
+
+ /*!
+ @brief sets the binary subtype
+
+ Sets the binary subtype of the value, also flags a binary JSON value as
+ having a subtype, which has implications for serialization.
+
+ @complexity Constant.
+
+ @exceptionsafety No-throw guarantee: this member function never throws
+ exceptions.
+
+ @sa @ref subtype() -- return the binary subtype
+ @sa @ref clear_subtype() -- clears the binary subtype
+ @sa @ref has_subtype() -- returns whether or not the binary value has a
+ subtype
+
+ @since version 3.8.0
+ */
+ void set_subtype(std::uint8_t subtype) noexcept
+ {
+ m_subtype = subtype;
+ m_has_subtype = true;
+ }
+
+ /*!
+ @brief return the binary subtype
+
+ Returns the numerical subtype of the value if it has a subtype. If it does
+ not have a subtype, this function will return size_t(-1) as a sentinel
+ value.
+
+ @return the numerical subtype of the binary value
+
+ @complexity Constant.
+
+ @exceptionsafety No-throw guarantee: this member function never throws
+ exceptions.
+
+ @sa @ref set_subtype() -- sets the binary subtype
+ @sa @ref clear_subtype() -- clears the binary subtype
+ @sa @ref has_subtype() -- returns whether or not the binary value has a
+ subtype
+
+ @since version 3.8.0
+ */
+ constexpr std::uint8_t subtype() const noexcept
+ {
+ return m_subtype;
+ }
+
+ /*!
+ @brief return whether the value has a subtype
+
+ @return whether the value has a subtype
+
+ @complexity Constant.
+
+ @exceptionsafety No-throw guarantee: this member function never throws
+ exceptions.
+
+ @sa @ref subtype() -- return the binary subtype
+ @sa @ref set_subtype() -- sets the binary subtype
+ @sa @ref clear_subtype() -- clears the binary subtype
+
+ @since version 3.8.0
+ */
+ constexpr bool has_subtype() const noexcept
+ {
+ return m_has_subtype;
+ }
+
+ /*!
+ @brief clears the binary subtype
+
+ Clears the binary subtype and flags the value as not having a subtype, which
+ has implications for serialization; for instance MessagePack will prefer the
+ bin family over the ext family.
+
+ @complexity Constant.
+
+ @exceptionsafety No-throw guarantee: this member function never throws
+ exceptions.
+
+ @sa @ref subtype() -- return the binary subtype
+ @sa @ref set_subtype() -- sets the binary subtype
+ @sa @ref has_subtype() -- returns whether or not the binary value has a
+ subtype
+
+ @since version 3.8.0
+ */
+ void clear_subtype() noexcept
+ {
+ m_subtype = 0;
+ m_has_subtype = false;
+ }
+
+ private:
+ std::uint8_t m_subtype = 0;
+ bool m_has_subtype = false;
+};
+
+} // namespace nlohmann
+
+// #include <nlohmann/detail/boolean_operators.hpp>
+
// #include <nlohmann/detail/conversions/from_json.hpp>
// #include <nlohmann/detail/conversions/to_json.hpp>
@@ -2263,33 +4450,15 @@ enum class input_format_t { json, cbor, msgpack, ubjson, bson };
////////////////////
/*!
-@brief abstract input adapter interface
-
-Produces a stream of std::char_traits<char>::int_type characters from a
-std::istream, a buffer, or some other input type. Accepts the return of
-exactly one non-EOF character for future input. The int_type characters
-returned consist of all valid char values as positive values (typically
-unsigned char), plus an EOF value outside that range, specified by the value
-of the function std::char_traits<char>::eof(). This value is typically -1, but
-could be any arbitrary value which is not a valid char value.
-*/
-struct input_adapter_protocol
-{
- /// get a character [0,255] or std::char_traits<char>::eof().
- virtual std::char_traits<char>::int_type get_character() = 0;
- virtual ~input_adapter_protocol() = default;
-};
-
-/// a type to simplify interfaces
-using input_adapter_t = std::shared_ptr<input_adapter_protocol>;
-
-/*!
Input adapter for stdio file access. This adapter read only 1 byte and do not use any
buffer. This adapter is a very low level adapter.
*/
-class file_input_adapter : public input_adapter_protocol
+class file_input_adapter
{
public:
+ using char_type = char;
+
+ JSON_HEDLEY_NON_NULL(2)
explicit file_input_adapter(std::FILE* f) noexcept
: m_file(f)
{}
@@ -2298,10 +4467,9 @@ class file_input_adapter : public input_adapter_protocol
file_input_adapter(const file_input_adapter&) = delete;
file_input_adapter(file_input_adapter&&) = default;
file_input_adapter& operator=(const file_input_adapter&) = delete;
- file_input_adapter& operator=(file_input_adapter&&) = default;
- ~file_input_adapter() override = default;
+ file_input_adapter& operator=(file_input_adapter&&) = delete;
- std::char_traits<char>::int_type get_character() noexcept override
+ std::char_traits<char>::int_type get_character() noexcept
{
return std::fgetc(m_file);
}
@@ -2321,91 +4489,111 @@ characters following those used in parsing the JSON input. Clears the
std::istream flags; any input errors (e.g., EOF) will be detected by the first
subsequent call for input from the std::istream.
*/
-class input_stream_adapter : public input_adapter_protocol
+class input_stream_adapter
{
public:
- ~input_stream_adapter() override
+ using char_type = char;
+
+ ~input_stream_adapter()
{
// clear stream flags; we use underlying streambuf I/O, do not
// maintain ifstream flags, except eof
- is.clear(is.rdstate() & std::ios::eofbit);
+ if (is)
+ {
+ is->clear(is->rdstate() & std::ios::eofbit);
+ }
}
explicit input_stream_adapter(std::istream& i)
- : is(i), sb(*i.rdbuf())
+ : is(&i), sb(i.rdbuf())
{}
// delete because of pointer members
input_stream_adapter(const input_stream_adapter&) = delete;
input_stream_adapter& operator=(input_stream_adapter&) = delete;
- input_stream_adapter(input_stream_adapter&&) = delete;
- input_stream_adapter& operator=(input_stream_adapter&&) = delete;
+ input_stream_adapter& operator=(input_stream_adapter&& rhs) = delete;
+
+ input_stream_adapter(input_stream_adapter&& rhs) : is(rhs.is), sb(rhs.sb)
+ {
+ rhs.is = nullptr;
+ rhs.sb = nullptr;
+ }
// std::istream/std::streambuf use std::char_traits<char>::to_int_type, to
// ensure that std::char_traits<char>::eof() and the character 0xFF do not
// end up as the same value, eg. 0xFFFFFFFF.
- std::char_traits<char>::int_type get_character() override
+ std::char_traits<char>::int_type get_character()
{
- auto res = sb.sbumpc();
+ auto res = sb->sbumpc();
// set eof manually, as we don't use the istream interface.
- if (res == EOF)
+ if (JSON_HEDLEY_UNLIKELY(res == EOF))
{
- is.clear(is.rdstate() | std::ios::eofbit);
+ is->clear(is->rdstate() | std::ios::eofbit);
}
return res;
}
private:
/// the associated input stream
- std::istream& is;
- std::streambuf& sb;
+ std::istream* is = nullptr;
+ std::streambuf* sb = nullptr;
};
-/// input adapter for buffer input
-class input_buffer_adapter : public input_adapter_protocol
+// General-purpose iterator-based adapter. It might not be as fast as
+// theoretically possible for some containers, but it is extremely versatile.
+template<typename IteratorType>
+class iterator_input_adapter
{
public:
- input_buffer_adapter(const char* b, const std::size_t l) noexcept
- : cursor(b), limit(b + l)
- {}
+ using char_type = typename std::iterator_traits<IteratorType>::value_type;
- // delete because of pointer members
- input_buffer_adapter(const input_buffer_adapter&) = delete;
- input_buffer_adapter& operator=(input_buffer_adapter&) = delete;
- input_buffer_adapter(input_buffer_adapter&&) = delete;
- input_buffer_adapter& operator=(input_buffer_adapter&&) = delete;
- ~input_buffer_adapter() override = default;
+ iterator_input_adapter(IteratorType first, IteratorType last)
+ : current(std::move(first)), end(std::move(last)) {}
- std::char_traits<char>::int_type get_character() noexcept override
+ typename std::char_traits<char_type>::int_type get_character()
{
- if (JSON_LIKELY(cursor < limit))
+ if (JSON_HEDLEY_LIKELY(current != end))
{
- return std::char_traits<char>::to_int_type(*(cursor++));
+ auto result = std::char_traits<char_type>::to_int_type(*current);
+ std::advance(current, 1);
+ return result;
+ }
+ else
+ {
+ return std::char_traits<char_type>::eof();
}
-
- return std::char_traits<char>::eof();
}
private:
- /// pointer to the current character
- const char* cursor;
- /// pointer past the last character
- const char* const limit;
+ IteratorType current;
+ IteratorType end;
+
+ template<typename BaseInputAdapter, size_t T>
+ friend struct wide_string_input_helper;
+
+ bool empty() const
+ {
+ return current == end;
+ }
+
};
-template<typename WideStringType, size_t T>
-struct wide_string_input_helper
+
+template<typename BaseInputAdapter, size_t T>
+struct wide_string_input_helper;
+
+template<typename BaseInputAdapter>
+struct wide_string_input_helper<BaseInputAdapter, 4>
{
// UTF-32
- static void fill_buffer(const WideStringType& str,
- size_t& current_wchar,
+ static void fill_buffer(BaseInputAdapter& input,
std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,
size_t& utf8_bytes_index,
size_t& utf8_bytes_filled)
{
utf8_bytes_index = 0;
- if (current_wchar == str.size())
+ if (JSON_HEDLEY_UNLIKELY(input.empty()))
{
utf8_bytes[0] = std::char_traits<char>::eof();
utf8_bytes_filled = 1;
@@ -2413,7 +4601,7 @@ struct wide_string_input_helper
else
{
// get the current character
- const auto wc = static_cast<unsigned int>(str[current_wchar++]);
+ const auto wc = input.get_character();
// UTF-32 to UTF-8 encoding
if (wc < 0x80)
@@ -2423,23 +4611,23 @@ struct wide_string_input_helper
}
else if (wc <= 0x7FF)
{
- utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((wc >> 6u) & 0x1Fu));
- utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (wc & 0x3Fu));
+ utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u) & 0x1Fu));
+ utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
utf8_bytes_filled = 2;
}
else if (wc <= 0xFFFF)
{
- utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((wc >> 12u) & 0x0Fu));
- utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((wc >> 6u) & 0x3Fu));
- utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (wc & 0x3Fu));
+ utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u) & 0x0Fu));
+ utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
+ utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
utf8_bytes_filled = 3;
}
else if (wc <= 0x10FFFF)
{
- utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | ((wc >> 18u) & 0x07u));
- utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((wc >> 12u) & 0x3Fu));
- utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((wc >> 6u) & 0x3Fu));
- utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (wc & 0x3Fu));
+ utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | ((static_cast<unsigned int>(wc) >> 18u) & 0x07u));
+ utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 12u) & 0x3Fu));
+ utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
+ utf8_bytes[3] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
utf8_bytes_filled = 4;
}
else
@@ -2452,19 +4640,18 @@ struct wide_string_input_helper
}
};
-template<typename WideStringType>
-struct wide_string_input_helper<WideStringType, 2>
+template<typename BaseInputAdapter>
+struct wide_string_input_helper<BaseInputAdapter, 2>
{
// UTF-16
- static void fill_buffer(const WideStringType& str,
- size_t& current_wchar,
+ static void fill_buffer(BaseInputAdapter& input,
std::array<std::char_traits<char>::int_type, 4>& utf8_bytes,
size_t& utf8_bytes_index,
size_t& utf8_bytes_filled)
{
utf8_bytes_index = 0;
- if (current_wchar == str.size())
+ if (JSON_HEDLEY_UNLIKELY(input.empty()))
{
utf8_bytes[0] = std::char_traits<char>::eof();
utf8_bytes_filled = 1;
@@ -2472,7 +4659,7 @@ struct wide_string_input_helper<WideStringType, 2>
else
{
// get the current character
- const auto wc = static_cast<unsigned int>(str[current_wchar++]);
+ const auto wc = input.get_character();
// UTF-16 to UTF-8 encoding
if (wc < 0x80)
@@ -2482,23 +4669,23 @@ struct wide_string_input_helper<WideStringType, 2>
}
else if (wc <= 0x7FF)
{
- utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((wc >> 6u)));
- utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (wc & 0x3Fu));
+ utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u)));
+ utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
utf8_bytes_filled = 2;
}
else if (0xD800 > wc or wc >= 0xE000)
{
- utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((wc >> 12u)));
- utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((wc >> 6u) & 0x3Fu));
- utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (wc & 0x3Fu));
+ utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u)));
+ utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu));
+ utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu));
utf8_bytes_filled = 3;
}
else
{
- if (current_wchar < str.size())
+ if (JSON_HEDLEY_UNLIKELY(not input.empty()))
{
- const auto wc2 = static_cast<unsigned int>(str[current_wchar++]);
- const auto charcode = 0x10000u + (((wc & 0x3FFu) << 10u) | (wc2 & 0x3FFu));
+ const auto wc2 = static_cast<unsigned int>(input.get_character());
+ const auto charcode = 0x10000u + (((static_cast<unsigned int>(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu));
utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | (charcode >> 18u));
utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 12u) & 0x3Fu));
utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 6u) & 0x3Fu));
@@ -2507,8 +4694,6 @@ struct wide_string_input_helper<WideStringType, 2>
}
else
{
- // unknown character
- ++current_wchar;
utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(wc);
utf8_bytes_filled = 1;
}
@@ -2517,20 +4702,22 @@ struct wide_string_input_helper<WideStringType, 2>
}
};
-template<typename WideStringType>
-class wide_string_input_adapter : public input_adapter_protocol
+// Wraps another input apdater to convert wide character types into individual bytes.
+template<typename BaseInputAdapter, typename WideCharType>
+class wide_string_input_adapter
{
public:
- explicit wide_string_input_adapter(const WideStringType& w) noexcept
- : str(w)
- {}
+ using char_type = char;
+
+ wide_string_input_adapter(BaseInputAdapter base)
+ : base_adapter(base) {}
- std::char_traits<char>::int_type get_character() noexcept override
+ typename std::char_traits<char>::int_type get_character() noexcept
{
// check if buffer needs to be filled
if (utf8_bytes_index == utf8_bytes_filled)
{
- fill_buffer<sizeof(typename WideStringType::value_type)>();
+ fill_buffer<sizeof(WideCharType)>();
assert(utf8_bytes_filled > 0);
assert(utf8_bytes_index == 0);
@@ -2543,18 +4730,14 @@ class wide_string_input_adapter : public input_adapter_protocol
}
private:
+ BaseInputAdapter base_adapter;
+
template<size_t T>
void fill_buffer()
{
- wide_string_input_helper<WideStringType, T>::fill_buffer(str, current_wchar, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);
+ wide_string_input_helper<BaseInputAdapter, T>::fill_buffer(base_adapter, utf8_bytes, utf8_bytes_index, utf8_bytes_filled);
}
- /// the wstring to process
- const WideStringType& str;
-
- /// index of the current wchar in str
- std::size_t current_wchar = 0;
-
/// a buffer for UTF-8 bytes
std::array<std::char_traits<char>::int_type, 4> utf8_bytes = {{0, 0, 0, 0}};
@@ -2564,111 +4747,131 @@ class wide_string_input_adapter : public input_adapter_protocol
std::size_t utf8_bytes_filled = 0;
};
-class input_adapter
+
+template<typename IteratorType, typename Enable = void>
+struct iterator_input_adapter_factory
{
- public:
- // native support
- input_adapter(std::FILE* file)
- : ia(std::make_shared<file_input_adapter>(file)) {}
- /// input adapter for input stream
- input_adapter(std::istream& i)
- : ia(std::make_shared<input_stream_adapter>(i)) {}
+ using iterator_type = IteratorType;
+ using char_type = typename std::iterator_traits<iterator_type>::value_type;
+ using adapter_type = iterator_input_adapter<iterator_type>;
- /// input adapter for input stream
- input_adapter(std::istream&& i)
- : ia(std::make_shared<input_stream_adapter>(i)) {}
+ static adapter_type create(IteratorType first, IteratorType last)
+ {
+ return adapter_type(std::move(first), std::move(last));
+ }
+};
- input_adapter(const std::wstring& ws)
- : ia(std::make_shared<wide_string_input_adapter<std::wstring>>(ws)) {}
+template<typename T>
+struct is_iterator_of_multibyte
+{
+ using value_type = typename std::iterator_traits<T>::value_type;
+ enum
+ {
+ value = sizeof(value_type) > 1
+ };
+};
- input_adapter(const std::u16string& ws)
- : ia(std::make_shared<wide_string_input_adapter<std::u16string>>(ws)) {}
+template<typename IteratorType>
+struct iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>::value>>
+{
+ using iterator_type = IteratorType;
+ using char_type = typename std::iterator_traits<iterator_type>::value_type;
+ using base_adapter_type = iterator_input_adapter<iterator_type>;
+ using adapter_type = wide_string_input_adapter<base_adapter_type, char_type>;
- input_adapter(const std::u32string& ws)
- : ia(std::make_shared<wide_string_input_adapter<std::u32string>>(ws)) {}
+ static adapter_type create(IteratorType first, IteratorType last)
+ {
+ return adapter_type(base_adapter_type(std::move(first), std::move(last)));
+ }
+};
- /// input adapter for buffer
- template<typename CharT,
- typename std::enable_if<
- std::is_pointer<CharT>::value and
- std::is_integral<typename std::remove_pointer<CharT>::type>::value and
- sizeof(typename std::remove_pointer<CharT>::type) == 1,
- int>::type = 0>
- input_adapter(CharT b, std::size_t l)
- : ia(std::make_shared<input_buffer_adapter>(reinterpret_cast<const char*>(b), l)) {}
+// General purpose iterator-based input
+template<typename IteratorType>
+typename iterator_input_adapter_factory<IteratorType>::adapter_type input_adapter(IteratorType first, IteratorType last)
+{
+ using factory_type = iterator_input_adapter_factory<IteratorType>;
+ return factory_type::create(first, last);
+}
+
+// Convenience shorthand from container to iterator
+template<typename ContainerType>
+auto input_adapter(const ContainerType& container) -> decltype(input_adapter(begin(container), end(container)))
+{
+ // Enable ADL
+ using std::begin;
+ using std::end;
+
+ return input_adapter(begin(container), end(container));
+}
+
+// Special cases with fast paths
+inline file_input_adapter input_adapter(std::FILE* file)
+{
+ return file_input_adapter(file);
+}
+
+inline input_stream_adapter input_adapter(std::istream& stream)
+{
+ return input_stream_adapter(stream);
+}
- // derived support
+inline input_stream_adapter input_adapter(std::istream&& stream)
+{
+ return input_stream_adapter(stream);
+}
- /// input adapter for string literal
+using contiguous_bytes_input_adapter = decltype(input_adapter(std::declval<const char*>(), std::declval<const char*>()));
+
+// Null-delimited strings, and the like.
+template < typename CharT,
+ typename std::enable_if <
+ std::is_pointer<CharT>::value and
+ not std::is_array<CharT>::value and
+ std::is_integral<typename std::remove_pointer<CharT>::type>::value and
+ sizeof(typename std::remove_pointer<CharT>::type) == 1,
+ int >::type = 0 >
+contiguous_bytes_input_adapter input_adapter(CharT b)
+{
+ auto length = std::strlen(reinterpret_cast<const char*>(b));
+ auto ptr = reinterpret_cast<const char*>(b);
+ return input_adapter(ptr, ptr + length);
+}
+
+template<typename T, std::size_t N>
+auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N))
+{
+ return input_adapter(array, array + N);
+}
+
+// This class only handles inputs of input_buffer_adapter type.
+// It's required so that expressions like {ptr, len} can be implicitely casted
+// to the correct adapter.
+class span_input_adapter
+{
+ public:
template<typename CharT,
typename std::enable_if<
std::is_pointer<CharT>::value and
std::is_integral<typename std::remove_pointer<CharT>::type>::value and
sizeof(typename std::remove_pointer<CharT>::type) == 1,
int>::type = 0>
- input_adapter(CharT b)
- : input_adapter(reinterpret_cast<const char*>(b),
- std::strlen(reinterpret_cast<const char*>(b))) {}
+ span_input_adapter(CharT b, std::size_t l)
+ : ia(reinterpret_cast<const char*>(b), reinterpret_cast<const char*>(b) + l) {}
- /// input adapter for iterator range with contiguous storage
template<class IteratorType,
typename std::enable_if<
std::is_same<typename iterator_traits<IteratorType>::iterator_category, std::random_access_iterator_tag>::value,
int>::type = 0>
- input_adapter(IteratorType first, IteratorType last)
- {
-#ifndef NDEBUG
- // assertion to check that the iterator range is indeed contiguous,
- // see http://stackoverflow.com/a/35008842/266378 for more discussion
- const auto is_contiguous = std::accumulate(
- first, last, std::pair<bool, int>(true, 0),
- [&first](std::pair<bool, int> res, decltype(*first) val)
- {
- res.first &= (val == *(std::next(std::addressof(*first), res.second++)));
- return res;
- }).first;
- assert(is_contiguous);
-#endif
+ span_input_adapter(IteratorType first, IteratorType last)
+ : ia(input_adapter(first, last)) {}
- // assertion to check that each element is 1 byte long
- static_assert(
- sizeof(typename iterator_traits<IteratorType>::value_type) == 1,
- "each element in the iterator range must have the size of 1 byte");
-
- const auto len = static_cast<size_t>(std::distance(first, last));
- if (JSON_LIKELY(len > 0))
- {
- // there is at least one element: use the address of first
- ia = std::make_shared<input_buffer_adapter>(reinterpret_cast<const char*>(&(*first)), len);
- }
- else
- {
- // the address of first cannot be used: use nullptr
- ia = std::make_shared<input_buffer_adapter>(nullptr, len);
- }
- }
-
- /// input adapter for array
- template<class T, std::size_t N>
- input_adapter(T (&array)[N])
- : input_adapter(std::begin(array), std::end(array)) {}
-
- /// input adapter for contiguous container
- template<class ContiguousContainer, typename
- std::enable_if<not std::is_pointer<ContiguousContainer>::value and
- std::is_base_of<std::random_access_iterator_tag, typename iterator_traits<decltype(std::begin(std::declval<ContiguousContainer const>()))>::iterator_category>::value,
- int>::type = 0>
- input_adapter(const ContiguousContainer& c)
- : input_adapter(std::begin(c), std::end(c)) {}
-
- operator input_adapter_t()
+ contiguous_bytes_input_adapter&& get()
{
- return ia;
+ return std::move(ia);
}
private:
- /// the actual adapter
- input_adapter_t ia = nullptr;
+ contiguous_bytes_input_adapter ia;
};
} // namespace detail
} // namespace nlohmann
@@ -2701,14 +4904,11 @@ input.
template<typename BasicJsonType>
struct json_sax
{
- /// type for (signed) integers
using number_integer_t = typename BasicJsonType::number_integer_t;
- /// type for unsigned integers
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
- /// type for floating-point numbers
using number_float_t = typename BasicJsonType::number_float_t;
- /// type for strings
using string_t = typename BasicJsonType::string_t;
+ using binary_t = typename BasicJsonType::binary_t;
/*!
@brief a null value was read
@@ -2754,6 +4954,14 @@ struct json_sax
virtual bool string(string_t& val) = 0;
/*!
+ @brief a binary string was read
+ @param[in] val binary value
+ @return whether parsing should proceed
+ @note It is safe to move the passed binary.
+ */
+ virtual bool binary(binary_t& val) = 0;
+
+ /*!
@brief the beginning of an object was read
@param[in] elements number of object elements or -1 if unknown
@return whether parsing should proceed
@@ -2827,6 +5035,7 @@ class json_sax_dom_parser
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
using number_float_t = typename BasicJsonType::number_float_t;
using string_t = typename BasicJsonType::string_t;
+ using binary_t = typename BasicJsonType::binary_t;
/*!
@param[in, out] r reference to a JSON value that is manipulated while
@@ -2880,11 +5089,17 @@ class json_sax_dom_parser
return true;
}
+ bool binary(binary_t& val)
+ {
+ handle_value(std::move(val));
+ return true;
+ }
+
bool start_object(std::size_t len)
{
ref_stack.push_back(handle_value(BasicJsonType::value_t::object));
- if (JSON_UNLIKELY(len != std::size_t(-1) and len > ref_stack.back()->max_size()))
+ if (JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) and len > ref_stack.back()->max_size()))
{
JSON_THROW(out_of_range::create(408,
"excessive object size: " + std::to_string(len)));
@@ -2910,7 +5125,7 @@ class json_sax_dom_parser
{
ref_stack.push_back(handle_value(BasicJsonType::value_t::array));
- if (JSON_UNLIKELY(len != std::size_t(-1) and len > ref_stack.back()->max_size()))
+ if (JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) and len > ref_stack.back()->max_size()))
{
JSON_THROW(out_of_range::create(408,
"excessive array size: " + std::to_string(len)));
@@ -2966,6 +5181,7 @@ class json_sax_dom_parser
object to which we can add elements
*/
template<typename Value>
+ JSON_HEDLEY_RETURNS_NON_NULL
BasicJsonType* handle_value(Value&& v)
{
if (ref_stack.empty())
@@ -3008,6 +5224,7 @@ class json_sax_dom_callback_parser
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
using number_float_t = typename BasicJsonType::number_float_t;
using string_t = typename BasicJsonType::string_t;
+ using binary_t = typename BasicJsonType::binary_t;
using parser_callback_t = typename BasicJsonType::parser_callback_t;
using parse_event_t = typename BasicJsonType::parse_event_t;
@@ -3062,6 +5279,12 @@ class json_sax_dom_callback_parser
return true;
}
+ bool binary(binary_t& val)
+ {
+ handle_value(std::move(val));
+ return true;
+ }
+
bool start_object(std::size_t len)
{
// check callback for object start
@@ -3072,7 +5295,7 @@ class json_sax_dom_callback_parser
ref_stack.push_back(val.second);
// check object limit
- if (ref_stack.back() and JSON_UNLIKELY(len != std::size_t(-1) and len > ref_stack.back()->max_size()))
+ if (ref_stack.back() and JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) and len > ref_stack.back()->max_size()))
{
JSON_THROW(out_of_range::create(408, "excessive object size: " + std::to_string(len)));
}
@@ -3110,7 +5333,7 @@ class json_sax_dom_callback_parser
ref_stack.pop_back();
keep_stack.pop_back();
- if (not ref_stack.empty() and ref_stack.back() and ref_stack.back()->is_object())
+ if (not ref_stack.empty() and ref_stack.back() and ref_stack.back()->is_structured())
{
// remove discarded value
for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it)
@@ -3135,7 +5358,7 @@ class json_sax_dom_callback_parser
ref_stack.push_back(val.second);
// check array limit
- if (ref_stack.back() and JSON_UNLIKELY(len != std::size_t(-1) and len > ref_stack.back()->max_size()))
+ if (ref_stack.back() and JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) and len > ref_stack.back()->max_size()))
{
JSON_THROW(out_of_range::create(408, "excessive array size: " + std::to_string(len)));
}
@@ -3312,6 +5535,7 @@ class json_sax_acceptor
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
using number_float_t = typename BasicJsonType::number_float_t;
using string_t = typename BasicJsonType::string_t;
+ using binary_t = typename BasicJsonType::binary_t;
bool null()
{
@@ -3343,7 +5567,12 @@ class json_sax_acceptor
return true;
}
- bool start_object(std::size_t /*unused*/ = std::size_t(-1))
+ bool binary(binary_t& /*unused*/)
+ {
+ return true;
+ }
+
+ bool start_object(std::size_t /*unused*/ = std::size_t(-1))
{
return true;
}
@@ -3358,7 +5587,7 @@ class json_sax_acceptor
return true;
}
- bool start_array(std::size_t /*unused*/ = std::size_t(-1))
+ bool start_array(std::size_t /*unused*/ = std::size_t(-1))
{
return true;
}
@@ -3532,6 +5761,20 @@ namespace nlohmann
{
namespace detail
{
+
+/*!
+@brief determine system byte order
+
+@return true if and only if system's byte order is little endian
+
+@note from https://stackoverflow.com/a/1001328/266378
+*/
+static inline bool little_endianess(int num = 1) noexcept
+{
+ return *reinterpret_cast<char*>(&num) == 1;
+}
+
+
///////////////////
// binary reader //
///////////////////
@@ -3539,14 +5782,17 @@ namespace detail
/*!
@brief deserialization of CBOR, MessagePack, and UBJSON values
*/
-template<typename BasicJsonType, typename SAX = json_sax_dom_parser<BasicJsonType>>
+template<typename BasicJsonType, typename InputAdapterType, typename SAX = json_sax_dom_parser<BasicJsonType>>
class binary_reader
{
using number_integer_t = typename BasicJsonType::number_integer_t;
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
using number_float_t = typename BasicJsonType::number_float_t;
using string_t = typename BasicJsonType::string_t;
+ using binary_t = typename BasicJsonType::binary_t;
using json_sax_t = SAX;
+ using char_type = typename InputAdapterType::char_type;
+ using char_int_type = typename std::char_traits<char_type>::int_type;
public:
/*!
@@ -3554,10 +5800,9 @@ class binary_reader
@param[in] adapter input adapter to read from
*/
- explicit binary_reader(input_adapter_t adapter) : ia(std::move(adapter))
+ explicit binary_reader(InputAdapterType&& adapter) : ia(std::move(adapter))
{
(void)detail::is_sax_static_asserts<SAX, BasicJsonType> {};
- assert(ia);
}
// make class move-only
@@ -3574,6 +5819,7 @@ class binary_reader
@return
*/
+ JSON_HEDLEY_NON_NULL(3)
bool sax_parse(const input_format_t format,
json_sax_t* sax_,
const bool strict = true)
@@ -3615,7 +5861,7 @@ class binary_reader
get();
}
- if (JSON_UNLIKELY(current != std::char_traits<char>::eof()))
+ if (JSON_HEDLEY_UNLIKELY(current != std::char_traits<char_type>::eof()))
{
return sax->parse_error(chars_read, get_token_string(),
parse_error::create(110, chars_read, exception_message(format, "expected end of input; last byte: 0x" + get_token_string(), "value")));
@@ -3625,18 +5871,6 @@ class binary_reader
return result;
}
- /*!
- @brief determine system byte order
-
- @return true if and only if system's byte order is little endian
-
- @note from http://stackoverflow.com/a/1001328/266378
- */
- static constexpr bool little_endianess(int num = 1) noexcept
- {
- return *reinterpret_cast<char*>(&num) == 1;
- }
-
private:
//////////
// BSON //
@@ -3651,12 +5885,12 @@ class binary_reader
std::int32_t document_size;
get_number<std::int32_t, true>(input_format_t::bson, document_size);
- if (JSON_UNLIKELY(not sax->start_object(std::size_t(-1))))
+ if (JSON_HEDLEY_UNLIKELY(not sax->start_object(std::size_t(-1))))
{
return false;
}
- if (JSON_UNLIKELY(not parse_bson_element_list(/*is_array*/false)))
+ if (JSON_HEDLEY_UNLIKELY(not parse_bson_element_list(/*is_array*/false)))
{
return false;
}
@@ -3677,7 +5911,7 @@ class binary_reader
while (true)
{
get();
- if (JSON_UNLIKELY(not unexpect_eof(input_format_t::bson, "cstring")))
+ if (JSON_HEDLEY_UNLIKELY(not unexpect_eof(input_format_t::bson, "cstring")))
{
return false;
}
@@ -3685,7 +5919,7 @@ class binary_reader
{
return true;
}
- *out++ = static_cast<char>(current);
+ *out++ = static_cast<typename string_t::value_type>(current);
}
return true;
@@ -3705,13 +5939,39 @@ class binary_reader
template<typename NumberType>
bool get_bson_string(const NumberType len, string_t& result)
{
- if (JSON_UNLIKELY(len < 1))
+ if (JSON_HEDLEY_UNLIKELY(len < 1))
{
auto last_token = get_token_string();
return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, "string length must be at least 1, is " + std::to_string(len), "string")));
}
- return get_string(input_format_t::bson, len - static_cast<NumberType>(1), result) and get() != std::char_traits<char>::eof();
+ return get_string(input_format_t::bson, len - static_cast<NumberType>(1), result) and get() != std::char_traits<char_type>::eof();
+ }
+
+ /*!
+ @brief Parses a byte array input of length @a len from the BSON input.
+ @param[in] len The length of the byte array to be read.
+ @param[in, out] result A reference to the binary variable where the read
+ array is to be stored.
+ @tparam NumberType The type of the length @a len
+ @pre len >= 0
+ @return `true` if the byte array was successfully parsed
+ */
+ template<typename NumberType>
+ bool get_bson_binary(const NumberType len, binary_t& result)
+ {
+ if (JSON_HEDLEY_UNLIKELY(len < 0))
+ {
+ auto last_token = get_token_string();
+ return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, "byte array length cannot be negative, is " + std::to_string(len), "binary")));
+ }
+
+ // All BSON binary values have a subtype
+ std::uint8_t subtype;
+ get_number<std::uint8_t>(input_format_t::bson, subtype);
+ result.set_subtype(subtype);
+
+ return get_binary(input_format_t::bson, len, result);
}
/*!
@@ -3724,7 +5984,7 @@ class binary_reader
Unsupported BSON record type 0x...
@return whether a valid BSON-object/array was passed to the SAX parser
*/
- bool parse_bson_element_internal(const int element_type,
+ bool parse_bson_element_internal(const char_int_type element_type,
const std::size_t element_type_parse_position)
{
switch (element_type)
@@ -3752,6 +6012,13 @@ class binary_reader
return parse_bson_array();
}
+ case 0x05: // binary
+ {
+ std::int32_t len;
+ binary_t value;
+ return get_number<std::int32_t, true>(input_format_t::bson, len) and get_bson_binary(len, value) and sax->binary(value);
+ }
+
case 0x08: // boolean
{
return sax->boolean(get() != 0);
@@ -3798,15 +6065,16 @@ class binary_reader
bool parse_bson_element_list(const bool is_array)
{
string_t key;
- while (int element_type = get())
+
+ while (auto element_type = get())
{
- if (JSON_UNLIKELY(not unexpect_eof(input_format_t::bson, "element list")))
+ if (JSON_HEDLEY_UNLIKELY(not unexpect_eof(input_format_t::bson, "element list")))
{
return false;
}
const std::size_t element_type_parse_position = chars_read;
- if (JSON_UNLIKELY(not get_bson_cstr(key)))
+ if (JSON_HEDLEY_UNLIKELY(not get_bson_cstr(key)))
{
return false;
}
@@ -3816,7 +6084,7 @@ class binary_reader
return false;
}
- if (JSON_UNLIKELY(not parse_bson_element_internal(element_type, element_type_parse_position)))
+ if (JSON_HEDLEY_UNLIKELY(not parse_bson_element_internal(element_type, element_type_parse_position)))
{
return false;
}
@@ -3837,12 +6105,12 @@ class binary_reader
std::int32_t document_size;
get_number<std::int32_t, true>(input_format_t::bson, document_size);
- if (JSON_UNLIKELY(not sax->start_array(std::size_t(-1))))
+ if (JSON_HEDLEY_UNLIKELY(not sax->start_array(std::size_t(-1))))
{
return false;
}
- if (JSON_UNLIKELY(not parse_bson_element_list(/*is_array*/true)))
+ if (JSON_HEDLEY_UNLIKELY(not parse_bson_element_list(/*is_array*/true)))
{
return false;
}
@@ -3866,7 +6134,7 @@ class binary_reader
switch (get_char ? get() : current)
{
// EOF
- case std::char_traits<char>::eof():
+ case std::char_traits<char_type>::eof():
return unexpect_eof(input_format_t::cbor, "value");
// Integer 0x00..0x17 (0..23)
@@ -3972,6 +6240,41 @@ class binary_reader
- static_cast<number_integer_t>(number));
}
+ // Binary data (0x00..0x17 bytes follow)
+ case 0x40:
+ case 0x41:
+ case 0x42:
+ case 0x43:
+ case 0x44:
+ case 0x45:
+ case 0x46:
+ case 0x47:
+ case 0x48:
+ case 0x49:
+ case 0x4A:
+ case 0x4B:
+ case 0x4C:
+ case 0x4D:
+ case 0x4E:
+ case 0x4F:
+ case 0x50:
+ case 0x51:
+ case 0x52:
+ case 0x53:
+ case 0x54:
+ case 0x55:
+ case 0x56:
+ case 0x57:
+ case 0x58: // Binary data (one-byte uint8_t for n follows)
+ case 0x59: // Binary data (two-byte uint16_t for n follow)
+ case 0x5A: // Binary data (four-byte uint32_t for n follow)
+ case 0x5B: // Binary data (eight-byte uint64_t for n follow)
+ case 0x5F: // Binary data (indefinite length)
+ {
+ binary_t b;
+ return get_cbor_binary(b) and sax->binary(b);
+ }
+
// UTF-8 string (0x00..0x17 bytes follow)
case 0x60:
case 0x61:
@@ -4126,13 +6429,13 @@ class binary_reader
case 0xF9: // Half-Precision Float (two-byte IEEE 754)
{
- const int byte1_raw = get();
- if (JSON_UNLIKELY(not unexpect_eof(input_format_t::cbor, "number")))
+ const auto byte1_raw = get();
+ if (JSON_HEDLEY_UNLIKELY(not unexpect_eof(input_format_t::cbor, "number")))
{
return false;
}
- const int byte2_raw = get();
- if (JSON_UNLIKELY(not unexpect_eof(input_format_t::cbor, "number")))
+ const auto byte2_raw = get();
+ if (JSON_HEDLEY_UNLIKELY(not unexpect_eof(input_format_t::cbor, "number")))
{
return false;
}
@@ -4154,7 +6457,7 @@ class binary_reader
const int exp = (half >> 10u) & 0x1Fu;
const unsigned int mant = half & 0x3FFu;
assert(0 <= exp and exp <= 32);
- assert(0 <= mant and mant <= 1024);
+ assert(mant <= 1024);
switch (exp)
{
case 0:
@@ -4205,7 +6508,7 @@ class binary_reader
*/
bool get_cbor_string(string_t& result)
{
- if (JSON_UNLIKELY(not unexpect_eof(input_format_t::cbor, "string")))
+ if (JSON_HEDLEY_UNLIKELY(not unexpect_eof(input_format_t::cbor, "string")))
{
return false;
}
@@ -4288,13 +6591,112 @@ class binary_reader
}
/*!
+ @brief reads a CBOR byte array
+
+ This function first reads starting bytes to determine the expected
+ byte array length and then copies this number of bytes into the byte array.
+ Additionally, CBOR's byte arrays with indefinite lengths are supported.
+
+ @param[out] result created byte array
+
+ @return whether byte array creation completed
+ */
+ bool get_cbor_binary(binary_t& result)
+ {
+ if (JSON_HEDLEY_UNLIKELY(not unexpect_eof(input_format_t::cbor, "binary")))
+ {
+ return false;
+ }
+
+ switch (current)
+ {
+ // Binary data (0x00..0x17 bytes follow)
+ case 0x40:
+ case 0x41:
+ case 0x42:
+ case 0x43:
+ case 0x44:
+ case 0x45:
+ case 0x46:
+ case 0x47:
+ case 0x48:
+ case 0x49:
+ case 0x4A:
+ case 0x4B:
+ case 0x4C:
+ case 0x4D:
+ case 0x4E:
+ case 0x4F:
+ case 0x50:
+ case 0x51:
+ case 0x52:
+ case 0x53:
+ case 0x54:
+ case 0x55:
+ case 0x56:
+ case 0x57:
+ {
+ return get_binary(input_format_t::cbor, static_cast<unsigned int>(current) & 0x1Fu, result);
+ }
+
+ case 0x58: // Binary data (one-byte uint8_t for n follows)
+ {
+ std::uint8_t len;
+ return get_number(input_format_t::cbor, len) and
+ get_binary(input_format_t::cbor, len, result);
+ }
+
+ case 0x59: // Binary data (two-byte uint16_t for n follow)
+ {
+ std::uint16_t len;
+ return get_number(input_format_t::cbor, len) and
+ get_binary(input_format_t::cbor, len, result);
+ }
+
+ case 0x5A: // Binary data (four-byte uint32_t for n follow)
+ {
+ std::uint32_t len;
+ return get_number(input_format_t::cbor, len) and
+ get_binary(input_format_t::cbor, len, result);
+ }
+
+ case 0x5B: // Binary data (eight-byte uint64_t for n follow)
+ {
+ std::uint64_t len;
+ return get_number(input_format_t::cbor, len) and
+ get_binary(input_format_t::cbor, len, result);
+ }
+
+ case 0x5F: // Binary data (indefinite length)
+ {
+ while (get() != 0xFF)
+ {
+ binary_t chunk;
+ if (not get_cbor_binary(chunk))
+ {
+ return false;
+ }
+ result.insert(result.end(), chunk.begin(), chunk.end());
+ }
+ return true;
+ }
+
+ default:
+ {
+ auto last_token = get_token_string();
+ return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, "expected length specification (0x40-0x5B) or indefinite binary array type (0x5F); last byte: 0x" + last_token, "binary")));
+ }
+ }
+ }
+
+ /*!
@param[in] len the length of the array or std::size_t(-1) for an
array of indefinite size
@return whether array creation completed
*/
bool get_cbor_array(const std::size_t len)
{
- if (JSON_UNLIKELY(not sax->start_array(len)))
+ if (JSON_HEDLEY_UNLIKELY(not sax->start_array(len)))
{
return false;
}
@@ -4303,7 +6705,7 @@ class binary_reader
{
for (std::size_t i = 0; i < len; ++i)
{
- if (JSON_UNLIKELY(not parse_cbor_internal()))
+ if (JSON_HEDLEY_UNLIKELY(not parse_cbor_internal()))
{
return false;
}
@@ -4313,7 +6715,7 @@ class binary_reader
{
while (get() != 0xFF)
{
- if (JSON_UNLIKELY(not parse_cbor_internal(false)))
+ if (JSON_HEDLEY_UNLIKELY(not parse_cbor_internal(false)))
{
return false;
}
@@ -4330,7 +6732,7 @@ class binary_reader
*/
bool get_cbor_object(const std::size_t len)
{
- if (JSON_UNLIKELY(not sax->start_object(len)))
+ if (JSON_HEDLEY_UNLIKELY(not sax->start_object(len)))
{
return false;
}
@@ -4341,12 +6743,12 @@ class binary_reader
for (std::size_t i = 0; i < len; ++i)
{
get();
- if (JSON_UNLIKELY(not get_cbor_string(key) or not sax->key(key)))
+ if (JSON_HEDLEY_UNLIKELY(not get_cbor_string(key) or not sax->key(key)))
{
return false;
}
- if (JSON_UNLIKELY(not parse_cbor_internal()))
+ if (JSON_HEDLEY_UNLIKELY(not parse_cbor_internal()))
{
return false;
}
@@ -4357,12 +6759,12 @@ class binary_reader
{
while (get() != 0xFF)
{
- if (JSON_UNLIKELY(not get_cbor_string(key) or not sax->key(key)))
+ if (JSON_HEDLEY_UNLIKELY(not get_cbor_string(key) or not sax->key(key)))
{
return false;
}
- if (JSON_UNLIKELY(not parse_cbor_internal()))
+ if (JSON_HEDLEY_UNLIKELY(not parse_cbor_internal()))
{
return false;
}
@@ -4385,7 +6787,7 @@ class binary_reader
switch (get())
{
// EOF
- case std::char_traits<char>::eof():
+ case std::char_traits<char_type>::eof():
return unexpect_eof(input_format_t::msgpack, "value");
// positive fixint
@@ -4590,6 +6992,9 @@ class binary_reader
case 0xBD:
case 0xBE:
case 0xBF:
+ case 0xD9: // str 8
+ case 0xDA: // str 16
+ case 0xDB: // str 32
{
string_t s;
return get_msgpack_string(s) and sax->string(s);
@@ -4604,6 +7009,22 @@ class binary_reader
case 0xC3: // true
return sax->boolean(true);
+ case 0xC4: // bin 8
+ case 0xC5: // bin 16
+ case 0xC6: // bin 32
+ case 0xC7: // ext 8
+ case 0xC8: // ext 16
+ case 0xC9: // ext 32
+ case 0xD4: // fixext 1
+ case 0xD5: // fixext 2
+ case 0xD6: // fixext 4
+ case 0xD7: // fixext 8
+ case 0xD8: // fixext 16
+ {
+ binary_t b;
+ return get_msgpack_binary(b) and sax->binary(b);
+ }
+
case 0xCA: // float 32
{
float number;
@@ -4664,14 +7085,6 @@ class binary_reader
return get_number(input_format_t::msgpack, number) and sax->number_integer(number);
}
- case 0xD9: // str 8
- case 0xDA: // str 16
- case 0xDB: // str 32
- {
- string_t s;
- return get_msgpack_string(s) and sax->string(s);
- }
-
case 0xDC: // array 16
{
std::uint16_t len;
@@ -4751,7 +7164,7 @@ class binary_reader
*/
bool get_msgpack_string(string_t& result)
{
- if (JSON_UNLIKELY(not unexpect_eof(input_format_t::msgpack, "string")))
+ if (JSON_HEDLEY_UNLIKELY(not unexpect_eof(input_format_t::msgpack, "string")))
{
return false;
}
@@ -4822,19 +7235,136 @@ class binary_reader
}
/*!
+ @brief reads a MessagePack byte array
+
+ This function first reads starting bytes to determine the expected
+ byte array length and then copies this number of bytes into a byte array.
+
+ @param[out] result created byte array
+
+ @return whether byte array creation completed
+ */
+ bool get_msgpack_binary(binary_t& result)
+ {
+ // helper function to set the subtype
+ auto assign_and_return_true = [&result](std::int8_t subtype)
+ {
+ result.set_subtype(static_cast<std::uint8_t>(subtype));
+ return true;
+ };
+
+ switch (current)
+ {
+ case 0xC4: // bin 8
+ {
+ std::uint8_t len;
+ return get_number(input_format_t::msgpack, len) and
+ get_binary(input_format_t::msgpack, len, result);
+ }
+
+ case 0xC5: // bin 16
+ {
+ std::uint16_t len;
+ return get_number(input_format_t::msgpack, len) and
+ get_binary(input_format_t::msgpack, len, result);
+ }
+
+ case 0xC6: // bin 32
+ {
+ std::uint32_t len;
+ return get_number(input_format_t::msgpack, len) and
+ get_binary(input_format_t::msgpack, len, result);
+ }
+
+ case 0xC7: // ext 8
+ {
+ std::uint8_t len;
+ std::int8_t subtype;
+ return get_number(input_format_t::msgpack, len) and
+ get_number(input_format_t::msgpack, subtype) and
+ get_binary(input_format_t::msgpack, len, result) and
+ assign_and_return_true(subtype);
+ }
+
+ case 0xC8: // ext 16
+ {
+ std::uint16_t len;
+ std::int8_t subtype;
+ return get_number(input_format_t::msgpack, len) and
+ get_number(input_format_t::msgpack, subtype) and
+ get_binary(input_format_t::msgpack, len, result) and
+ assign_and_return_true(subtype);
+ }
+
+ case 0xC9: // ext 32
+ {
+ std::uint32_t len;
+ std::int8_t subtype;
+ return get_number(input_format_t::msgpack, len) and
+ get_number(input_format_t::msgpack, subtype) and
+ get_binary(input_format_t::msgpack, len, result) and
+ assign_and_return_true(subtype);
+ }
+
+ case 0xD4: // fixext 1
+ {
+ std::int8_t subtype;
+ return get_number(input_format_t::msgpack, subtype) and
+ get_binary(input_format_t::msgpack, 1, result) and
+ assign_and_return_true(subtype);
+ }
+
+ case 0xD5: // fixext 2
+ {
+ std::int8_t subtype;
+ return get_number(input_format_t::msgpack, subtype) and
+ get_binary(input_format_t::msgpack, 2, result) and
+ assign_and_return_true(subtype);
+ }
+
+ case 0xD6: // fixext 4
+ {
+ std::int8_t subtype;
+ return get_number(input_format_t::msgpack, subtype) and
+ get_binary(input_format_t::msgpack, 4, result) and
+ assign_and_return_true(subtype);
+ }
+
+ case 0xD7: // fixext 8
+ {
+ std::int8_t subtype;
+ return get_number(input_format_t::msgpack, subtype) and
+ get_binary(input_format_t::msgpack, 8, result) and
+ assign_and_return_true(subtype);
+ }
+
+ case 0xD8: // fixext 16
+ {
+ std::int8_t subtype;
+ return get_number(input_format_t::msgpack, subtype) and
+ get_binary(input_format_t::msgpack, 16, result) and
+ assign_and_return_true(subtype);
+ }
+
+ default: // LCOV_EXCL_LINE
+ return false; // LCOV_EXCL_LINE
+ }
+ }
+
+ /*!
@param[in] len the length of the array
@return whether array creation completed
*/
bool get_msgpack_array(const std::size_t len)
{
- if (JSON_UNLIKELY(not sax->start_array(len)))
+ if (JSON_HEDLEY_UNLIKELY(not sax->start_array(len)))
{
return false;
}
for (std::size_t i = 0; i < len; ++i)
{
- if (JSON_UNLIKELY(not parse_msgpack_internal()))
+ if (JSON_HEDLEY_UNLIKELY(not parse_msgpack_internal()))
{
return false;
}
@@ -4849,7 +7379,7 @@ class binary_reader
*/
bool get_msgpack_object(const std::size_t len)
{
- if (JSON_UNLIKELY(not sax->start_object(len)))
+ if (JSON_HEDLEY_UNLIKELY(not sax->start_object(len)))
{
return false;
}
@@ -4858,12 +7388,12 @@ class binary_reader
for (std::size_t i = 0; i < len; ++i)
{
get();
- if (JSON_UNLIKELY(not get_msgpack_string(key) or not sax->key(key)))
+ if (JSON_HEDLEY_UNLIKELY(not get_msgpack_string(key) or not sax->key(key)))
{
return false;
}
- if (JSON_UNLIKELY(not parse_msgpack_internal()))
+ if (JSON_HEDLEY_UNLIKELY(not parse_msgpack_internal()))
{
return false;
}
@@ -4910,7 +7440,7 @@ class binary_reader
get(); // TODO(niels): may we ignore N here?
}
- if (JSON_UNLIKELY(not unexpect_eof(input_format_t::ubjson, "value")))
+ if (JSON_HEDLEY_UNLIKELY(not unexpect_eof(input_format_t::ubjson, "value")))
{
return false;
}
@@ -4964,7 +7494,7 @@ class binary_reader
case 'U':
{
std::uint8_t number;
- if (JSON_UNLIKELY(not get_number(input_format_t::ubjson, number)))
+ if (JSON_HEDLEY_UNLIKELY(not get_number(input_format_t::ubjson, number)))
{
return false;
}
@@ -4975,7 +7505,7 @@ class binary_reader
case 'i':
{
std::int8_t number;
- if (JSON_UNLIKELY(not get_number(input_format_t::ubjson, number)))
+ if (JSON_HEDLEY_UNLIKELY(not get_number(input_format_t::ubjson, number)))
{
return false;
}
@@ -4986,7 +7516,7 @@ class binary_reader
case 'I':
{
std::int16_t number;
- if (JSON_UNLIKELY(not get_number(input_format_t::ubjson, number)))
+ if (JSON_HEDLEY_UNLIKELY(not get_number(input_format_t::ubjson, number)))
{
return false;
}
@@ -4997,7 +7527,7 @@ class binary_reader
case 'l':
{
std::int32_t number;
- if (JSON_UNLIKELY(not get_number(input_format_t::ubjson, number)))
+ if (JSON_HEDLEY_UNLIKELY(not get_number(input_format_t::ubjson, number)))
{
return false;
}
@@ -5008,7 +7538,7 @@ class binary_reader
case 'L':
{
std::int64_t number;
- if (JSON_UNLIKELY(not get_number(input_format_t::ubjson, number)))
+ if (JSON_HEDLEY_UNLIKELY(not get_number(input_format_t::ubjson, number)))
{
return false;
}
@@ -5034,7 +7564,7 @@ class binary_reader
@return whether pair creation completed
*/
- bool get_ubjson_size_type(std::pair<std::size_t, int>& result)
+ bool get_ubjson_size_type(std::pair<std::size_t, char_int_type>& result)
{
result.first = string_t::npos; // size
result.second = 0; // type
@@ -5044,15 +7574,15 @@ class binary_reader
if (current == '$')
{
result.second = get(); // must not ignore 'N', because 'N' maybe the type
- if (JSON_UNLIKELY(not unexpect_eof(input_format_t::ubjson, "type")))
+ if (JSON_HEDLEY_UNLIKELY(not unexpect_eof(input_format_t::ubjson, "type")))
{
return false;
}
get_ignore_noop();
- if (JSON_UNLIKELY(current != '#'))
+ if (JSON_HEDLEY_UNLIKELY(current != '#'))
{
- if (JSON_UNLIKELY(not unexpect_eof(input_format_t::ubjson, "value")))
+ if (JSON_HEDLEY_UNLIKELY(not unexpect_eof(input_format_t::ubjson, "value")))
{
return false;
}
@@ -5075,11 +7605,11 @@ class binary_reader
@param prefix the previously read or set type prefix
@return whether value creation completed
*/
- bool get_ubjson_value(const int prefix)
+ bool get_ubjson_value(const char_int_type prefix)
{
switch (prefix)
{
- case std::char_traits<char>::eof(): // EOF
+ case std::char_traits<char_type>::eof(): // EOF
return unexpect_eof(input_format_t::ubjson, "value");
case 'T': // true
@@ -5135,16 +7665,16 @@ class binary_reader
case 'C': // char
{
get();
- if (JSON_UNLIKELY(not unexpect_eof(input_format_t::ubjson, "char")))
+ if (JSON_HEDLEY_UNLIKELY(not unexpect_eof(input_format_t::ubjson, "char")))
{
return false;
}
- if (JSON_UNLIKELY(current > 127))
+ if (JSON_HEDLEY_UNLIKELY(current > 127))
{
auto last_token = get_token_string();
return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + last_token, "char")));
}
- string_t s(1, static_cast<char>(current));
+ string_t s(1, static_cast<typename string_t::value_type>(current));
return sax->string(s);
}
@@ -5173,15 +7703,15 @@ class binary_reader
*/
bool get_ubjson_array()
{
- std::pair<std::size_t, int> size_and_type;
- if (JSON_UNLIKELY(not get_ubjson_size_type(size_and_type)))
+ std::pair<std::size_t, char_int_type> size_and_type;
+ if (JSON_HEDLEY_UNLIKELY(not get_ubjson_size_type(size_and_type)))
{
return false;
}
if (size_and_type.first != string_t::npos)
{
- if (JSON_UNLIKELY(not sax->start_array(size_and_type.first)))
+ if (JSON_HEDLEY_UNLIKELY(not sax->start_array(size_and_type.first)))
{
return false;
}
@@ -5192,7 +7722,7 @@ class binary_reader
{
for (std::size_t i = 0; i < size_and_type.first; ++i)
{
- if (JSON_UNLIKELY(not get_ubjson_value(size_and_type.second)))
+ if (JSON_HEDLEY_UNLIKELY(not get_ubjson_value(size_and_type.second)))
{
return false;
}
@@ -5203,7 +7733,7 @@ class binary_reader
{
for (std::size_t i = 0; i < size_and_type.first; ++i)
{
- if (JSON_UNLIKELY(not parse_ubjson_internal()))
+ if (JSON_HEDLEY_UNLIKELY(not parse_ubjson_internal()))
{
return false;
}
@@ -5212,14 +7742,14 @@ class binary_reader
}
else
{
- if (JSON_UNLIKELY(not sax->start_array(std::size_t(-1))))
+ if (JSON_HEDLEY_UNLIKELY(not sax->start_array(std::size_t(-1))))
{
return false;
}
while (current != ']')
{
- if (JSON_UNLIKELY(not parse_ubjson_internal(false)))
+ if (JSON_HEDLEY_UNLIKELY(not parse_ubjson_internal(false)))
{
return false;
}
@@ -5235,8 +7765,8 @@ class binary_reader
*/
bool get_ubjson_object()
{
- std::pair<std::size_t, int> size_and_type;
- if (JSON_UNLIKELY(not get_ubjson_size_type(size_and_type)))
+ std::pair<std::size_t, char_int_type> size_and_type;
+ if (JSON_HEDLEY_UNLIKELY(not get_ubjson_size_type(size_and_type)))
{
return false;
}
@@ -5244,7 +7774,7 @@ class binary_reader
string_t key;
if (size_and_type.first != string_t::npos)
{
- if (JSON_UNLIKELY(not sax->start_object(size_and_type.first)))
+ if (JSON_HEDLEY_UNLIKELY(not sax->start_object(size_and_type.first)))
{
return false;
}
@@ -5253,11 +7783,11 @@ class binary_reader
{
for (std::size_t i = 0; i < size_and_type.first; ++i)
{
- if (JSON_UNLIKELY(not get_ubjson_string(key) or not sax->key(key)))
+ if (JSON_HEDLEY_UNLIKELY(not get_ubjson_string(key) or not sax->key(key)))
{
return false;
}
- if (JSON_UNLIKELY(not get_ubjson_value(size_and_type.second)))
+ if (JSON_HEDLEY_UNLIKELY(not get_ubjson_value(size_and_type.second)))
{
return false;
}
@@ -5268,11 +7798,11 @@ class binary_reader
{
for (std::size_t i = 0; i < size_and_type.first; ++i)
{
- if (JSON_UNLIKELY(not get_ubjson_string(key) or not sax->key(key)))
+ if (JSON_HEDLEY_UNLIKELY(not get_ubjson_string(key) or not sax->key(key)))
{
return false;
}
- if (JSON_UNLIKELY(not parse_ubjson_internal()))
+ if (JSON_HEDLEY_UNLIKELY(not parse_ubjson_internal()))
{
return false;
}
@@ -5282,18 +7812,18 @@ class binary_reader
}
else
{
- if (JSON_UNLIKELY(not sax->start_object(std::size_t(-1))))
+ if (JSON_HEDLEY_UNLIKELY(not sax->start_object(std::size_t(-1))))
{
return false;
}
while (current != '}')
{
- if (JSON_UNLIKELY(not get_ubjson_string(key, false) or not sax->key(key)))
+ if (JSON_HEDLEY_UNLIKELY(not get_ubjson_string(key, false) or not sax->key(key)))
{
return false;
}
- if (JSON_UNLIKELY(not parse_ubjson_internal()))
+ if (JSON_HEDLEY_UNLIKELY(not parse_ubjson_internal()))
{
return false;
}
@@ -5305,6 +7835,9 @@ class binary_reader
return sax->end_object();
}
+ // Note, no reader for UBJSON binary types is implemented because they do
+ // not exist
+
///////////////////////
// Utility functions //
///////////////////////
@@ -5314,20 +7847,20 @@ class binary_reader
This function provides the interface to the used input adapter. It does
not throw in case the input reached EOF, but returns a -'ve valued
- `std::char_traits<char>::eof()` in that case.
+ `std::char_traits<char_type>::eof()` in that case.
@return character read from the input
*/
- int get()
+ char_int_type get()
{
++chars_read;
- return current = ia->get_character();
+ return current = ia.get_character();
}
/*!
@return character read from the input after ignoring all 'N' entries
*/
- int get_ignore_noop()
+ char_int_type get_ignore_noop()
{
do
{
@@ -5359,7 +7892,7 @@ class binary_reader
for (std::size_t i = 0; i < sizeof(NumberType); ++i)
{
get();
- if (JSON_UNLIKELY(not unexpect_eof(format, "number")))
+ if (JSON_HEDLEY_UNLIKELY(not unexpect_eof(format, "number")))
{
return false;
}
@@ -5403,11 +7936,43 @@ class binary_reader
std::generate_n(std::back_inserter(result), len, [this, &success, &format]()
{
get();
- if (JSON_UNLIKELY(not unexpect_eof(format, "string")))
+ if (JSON_HEDLEY_UNLIKELY(not unexpect_eof(format, "string")))
{
success = false;
}
- return static_cast<char>(current);
+ return std::char_traits<char_type>::to_char_type(current);
+ });
+ return success;
+ }
+
+ /*!
+ @brief create a byte array by reading bytes from the input
+
+ @tparam NumberType the type of the number
+ @param[in] format the current format (for diagnostics)
+ @param[in] len number of bytes to read
+ @param[out] result byte array created by reading @a len bytes
+
+ @return whether byte array creation completed
+
+ @note We can not reserve @a len bytes for the result, because @a len
+ may be too large. Usually, @ref unexpect_eof() detects the end of
+ the input before we run out of memory.
+ */
+ template<typename NumberType>
+ bool get_binary(const input_format_t format,
+ const NumberType len,
+ binary_t& result)
+ {
+ bool success = true;
+ std::generate_n(std::back_inserter(result), len, [this, &success, &format]()
+ {
+ get();
+ if (JSON_HEDLEY_UNLIKELY(not unexpect_eof(format, "binary")))
+ {
+ success = false;
+ }
+ return static_cast<std::uint8_t>(current);
});
return success;
}
@@ -5417,9 +7982,10 @@ class binary_reader
@param[in] context further context information (for diagnostics)
@return whether the last read character is not EOF
*/
+ JSON_HEDLEY_NON_NULL(3)
bool unexpect_eof(const input_format_t format, const char* context) const
{
- if (JSON_UNLIKELY(current == std::char_traits<char>::eof()))
+ if (JSON_HEDLEY_UNLIKELY(current == std::char_traits<char_type>::eof()))
{
return sax->parse_error(chars_read, "<end of file>",
parse_error::create(110, chars_read, exception_message(format, "unexpected end of input", context)));
@@ -5440,7 +8006,7 @@ class binary_reader
/*!
@param[in] format the current format
@param[in] detail a detailed error message
- @param[in] context further contect information
+ @param[in] context further context information
@return a message string to use in the parse_error exceptions
*/
std::string exception_message(const input_format_t format,
@@ -5476,10 +8042,10 @@ class binary_reader
private:
/// input adapter
- input_adapter_t ia = nullptr;
+ InputAdapterType ia;
/// the current character
- int current = std::char_traits<char>::eof();
+ char_int_type current = std::char_traits<char_type>::eof();
/// the number of characters read
std::size_t chars_read = 0;
@@ -5523,19 +8089,9 @@ namespace detail
// lexer //
///////////
-/*!
-@brief lexical analysis
-
-This class organizes the lexical analysis during JSON deserialization.
-*/
template<typename BasicJsonType>
-class lexer
+class lexer_base
{
- using number_integer_t = typename BasicJsonType::number_integer_t;
- using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
- using number_float_t = typename BasicJsonType::number_float_t;
- using string_t = typename BasicJsonType::string_t;
-
public:
/// token types for the parser
enum class token_type
@@ -5560,6 +8116,8 @@ class lexer
};
/// return name of values of type token_type (only used for errors)
+ JSON_HEDLEY_RETURNS_NON_NULL
+ JSON_HEDLEY_CONST
static const char* token_type_name(const token_type t) noexcept
{
switch (t)
@@ -5574,9 +8132,9 @@ class lexer
return "null literal";
case token_type::value_string:
return "string literal";
- case lexer::token_type::value_unsigned:
- case lexer::token_type::value_integer:
- case lexer::token_type::value_float:
+ case token_type::value_unsigned:
+ case token_type::value_integer:
+ case token_type::value_float:
return "number literal";
case token_type::begin_array:
return "'['";
@@ -5602,15 +8160,33 @@ class lexer
// LCOV_EXCL_STOP
}
}
+};
+/*!
+@brief lexical analysis
- explicit lexer(detail::input_adapter_t&& adapter)
- : ia(std::move(adapter)), decimal_point_char(get_decimal_point()) {}
+This class organizes the lexical analysis during JSON deserialization.
+*/
+template<typename BasicJsonType, typename InputAdapterType>
+class lexer : public lexer_base<BasicJsonType>
+{
+ using number_integer_t = typename BasicJsonType::number_integer_t;
+ using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
+ using number_float_t = typename BasicJsonType::number_float_t;
+ using string_t = typename BasicJsonType::string_t;
+ using char_type = typename InputAdapterType::char_type;
+ using char_int_type = typename std::char_traits<char_type>::int_type;
+
+ public:
+ using token_type = typename lexer_base<BasicJsonType>::token_type;
+
+ explicit lexer(InputAdapterType&& adapter)
+ : ia(std::move(adapter)), decimal_point_char(static_cast<char_int_type>(get_decimal_point())) {}
// delete because of pointer members
lexer(const lexer&) = delete;
- lexer(lexer&&) = delete;
+ lexer(lexer&&) = default;
lexer& operator=(lexer&) = delete;
- lexer& operator=(lexer&&) = delete;
+ lexer& operator=(lexer&&) = default;
~lexer() = default;
private:
@@ -5619,6 +8195,7 @@ class lexer
/////////////////////
/// return the locale-dependent decimal point
+ JSON_HEDLEY_PURE
static char get_decimal_point() noexcept
{
const auto loc = localeconv();
@@ -5693,7 +8270,7 @@ class lexer
@return true if and only if no range violation was detected
*/
- bool next_byte_in_range(std::initializer_list<int> ranges)
+ bool next_byte_in_range(std::initializer_list<char_int_type> ranges)
{
assert(ranges.size() == 2 or ranges.size() == 4 or ranges.size() == 6);
add(current);
@@ -5701,7 +8278,7 @@ class lexer
for (auto range = ranges.begin(); range != ranges.end(); ++range)
{
get();
- if (JSON_LIKELY(*range <= current and current <= *(++range)))
+ if (JSON_HEDLEY_LIKELY(*range <= current and current <= *(++range)))
{
add(current);
}
@@ -5744,7 +8321,7 @@ class lexer
switch (get())
{
// end of file while parsing string
- case std::char_traits<char>::eof():
+ case std::char_traits<char_type>::eof():
{
error_message = "invalid string: missing closing quote";
return token_type::parse_error;
@@ -5800,7 +8377,7 @@ class lexer
const int codepoint1 = get_codepoint();
int codepoint = codepoint1; // start with codepoint1
- if (JSON_UNLIKELY(codepoint1 == -1))
+ if (JSON_HEDLEY_UNLIKELY(codepoint1 == -1))
{
error_message = "invalid string: '\\u' must be followed by 4 hex digits";
return token_type::parse_error;
@@ -5810,18 +8387,18 @@ class lexer
if (0xD800 <= codepoint1 and codepoint1 <= 0xDBFF)
{
// expect next \uxxxx entry
- if (JSON_LIKELY(get() == '\\' and get() == 'u'))
+ if (JSON_HEDLEY_LIKELY(get() == '\\' and get() == 'u'))
{
const int codepoint2 = get_codepoint();
- if (JSON_UNLIKELY(codepoint2 == -1))
+ if (JSON_HEDLEY_UNLIKELY(codepoint2 == -1))
{
error_message = "invalid string: '\\u' must be followed by 4 hex digits";
return token_type::parse_error;
}
// check if codepoint2 is a low surrogate
- if (JSON_LIKELY(0xDC00 <= codepoint2 and codepoint2 <= 0xDFFF))
+ if (JSON_HEDLEY_LIKELY(0xDC00 <= codepoint2 and codepoint2 <= 0xDFFF))
{
// overwrite codepoint
codepoint = static_cast<int>(
@@ -5836,19 +8413,19 @@ class lexer
}
else
{
- error_message = "invalid string: surrogate U+DC00..U+DFFF must be followed by U+DC00..U+DFFF";
+ error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF";
return token_type::parse_error;
}
}
else
{
- error_message = "invalid string: surrogate U+DC00..U+DFFF must be followed by U+DC00..U+DFFF";
+ error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF";
return token_type::parse_error;
}
}
else
{
- if (JSON_UNLIKELY(0xDC00 <= codepoint1 and codepoint1 <= 0xDFFF))
+ if (JSON_HEDLEY_UNLIKELY(0xDC00 <= codepoint1 and codepoint1 <= 0xDFFF))
{
error_message = "invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF";
return token_type::parse_error;
@@ -5862,28 +8439,28 @@ class lexer
if (codepoint < 0x80)
{
// 1-byte characters: 0xxxxxxx (ASCII)
- add(codepoint);
+ add(static_cast<char_int_type>(codepoint));
}
else if (codepoint <= 0x7FF)
{
// 2-byte characters: 110xxxxx 10xxxxxx
- add(static_cast<int>(0xC0u | (static_cast<unsigned int>(codepoint) >> 6u)));
- add(static_cast<int>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));
+ add(static_cast<char_int_type>(0xC0u | (static_cast<unsigned int>(codepoint) >> 6u)));
+ add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));
}
else if (codepoint <= 0xFFFF)
{
// 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx
- add(static_cast<int>(0xE0u | (static_cast<unsigned int>(codepoint) >> 12u)));
- add(static_cast<int>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));
- add(static_cast<int>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));
+ add(static_cast<char_int_type>(0xE0u | (static_cast<unsigned int>(codepoint) >> 12u)));
+ add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));
+ add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));
}
else
{
// 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
- add(static_cast<int>(0xF0u | (static_cast<unsigned int>(codepoint) >> 18u)));
- add(static_cast<int>(0x80u | ((static_cast<unsigned int>(codepoint) >> 12u) & 0x3Fu)));
- add(static_cast<int>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));
- add(static_cast<int>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));
+ add(static_cast<char_int_type>(0xF0u | (static_cast<unsigned int>(codepoint) >> 18u)));
+ add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 12u) & 0x3Fu)));
+ add(static_cast<char_int_type>(0x80u | ((static_cast<unsigned int>(codepoint) >> 6u) & 0x3Fu)));
+ add(static_cast<char_int_type>(0x80u | (static_cast<unsigned int>(codepoint) & 0x3Fu)));
}
break;
@@ -6223,7 +8800,7 @@ class lexer
case 0xDE:
case 0xDF:
{
- if (JSON_UNLIKELY(not next_byte_in_range({0x80, 0xBF})))
+ if (JSON_HEDLEY_UNLIKELY(not next_byte_in_range({0x80, 0xBF})))
{
return token_type::parse_error;
}
@@ -6233,7 +8810,7 @@ class lexer
// U+0800..U+0FFF: bytes E0 A0..BF 80..BF
case 0xE0:
{
- if (JSON_UNLIKELY(not (next_byte_in_range({0xA0, 0xBF, 0x80, 0xBF}))))
+ if (JSON_HEDLEY_UNLIKELY(not (next_byte_in_range({0xA0, 0xBF, 0x80, 0xBF}))))
{
return token_type::parse_error;
}
@@ -6257,7 +8834,7 @@ class lexer
case 0xEE:
case 0xEF:
{
- if (JSON_UNLIKELY(not (next_byte_in_range({0x80, 0xBF, 0x80, 0xBF}))))
+ if (JSON_HEDLEY_UNLIKELY(not (next_byte_in_range({0x80, 0xBF, 0x80, 0xBF}))))
{
return token_type::parse_error;
}
@@ -6267,7 +8844,7 @@ class lexer
// U+D000..U+D7FF: bytes ED 80..9F 80..BF
case 0xED:
{
- if (JSON_UNLIKELY(not (next_byte_in_range({0x80, 0x9F, 0x80, 0xBF}))))
+ if (JSON_HEDLEY_UNLIKELY(not (next_byte_in_range({0x80, 0x9F, 0x80, 0xBF}))))
{
return token_type::parse_error;
}
@@ -6277,7 +8854,7 @@ class lexer
// U+10000..U+3FFFF F0 90..BF 80..BF 80..BF
case 0xF0:
{
- if (JSON_UNLIKELY(not (next_byte_in_range({0x90, 0xBF, 0x80, 0xBF, 0x80, 0xBF}))))
+ if (JSON_HEDLEY_UNLIKELY(not (next_byte_in_range({0x90, 0xBF, 0x80, 0xBF, 0x80, 0xBF}))))
{
return token_type::parse_error;
}
@@ -6289,7 +8866,7 @@ class lexer
case 0xF2:
case 0xF3:
{
- if (JSON_UNLIKELY(not (next_byte_in_range({0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF}))))
+ if (JSON_HEDLEY_UNLIKELY(not (next_byte_in_range({0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF}))))
{
return token_type::parse_error;
}
@@ -6299,7 +8876,7 @@ class lexer
// U+100000..U+10FFFF F4 80..8F 80..BF 80..BF
case 0xF4:
{
- if (JSON_UNLIKELY(not (next_byte_in_range({0x80, 0x8F, 0x80, 0xBF, 0x80, 0xBF}))))
+ if (JSON_HEDLEY_UNLIKELY(not (next_byte_in_range({0x80, 0x8F, 0x80, 0xBF, 0x80, 0xBF}))))
{
return token_type::parse_error;
}
@@ -6316,16 +8893,19 @@ class lexer
}
}
+ JSON_HEDLEY_NON_NULL(2)
static void strtof(float& f, const char* str, char** endptr) noexcept
{
f = std::strtof(str, endptr);
}
+ JSON_HEDLEY_NON_NULL(2)
static void strtof(double& f, const char* str, char** endptr) noexcept
{
f = std::strtod(str, endptr);
}
+ JSON_HEDLEY_NON_NULL(2)
static void strtof(long double& f, const char* str, char** endptr) noexcept
{
f = std::strtold(str, endptr);
@@ -6348,7 +8928,7 @@ class lexer
minus | zero | any1 | [error] | [error] | [error] | [error] | [error]
zero | done | done | exponent | done | done | decimal1 | done
any1 | any1 | any1 | exponent | done | done | decimal1 | done
- decimal1 | decimal2 | [error] | [error] | [error] | [error] | [error] | [error]
+ decimal1 | decimal2 | decimal2 | [error] | [error] | [error] | [error] | [error]
decimal2 | decimal2 | decimal2 | exponent | done | done | done | done
exponent | any2 | any2 | [error] | sign | sign | [error] | [error]
sign | any2 | any2 | [error] | [error] | [error] | [error] | [error]
@@ -6701,13 +9281,14 @@ scan_number_done:
@param[in] length the length of the passed literal text
@param[in] return_type the token type to return on success
*/
- token_type scan_literal(const char* literal_text, const std::size_t length,
+ JSON_HEDLEY_NON_NULL(2)
+ token_type scan_literal(const char_type* literal_text, const std::size_t length,
token_type return_type)
{
- assert(current == literal_text[0]);
+ assert(std::char_traits<char_type>::to_char_type(current) == literal_text[0]);
for (std::size_t i = 1; i < length; ++i)
{
- if (JSON_UNLIKELY(get() != literal_text[i]))
+ if (JSON_HEDLEY_UNLIKELY(std::char_traits<char_type>::to_char_type(get()) != literal_text[i]))
{
error_message = "invalid literal";
return token_type::parse_error;
@@ -6725,7 +9306,7 @@ scan_number_done:
{
token_buffer.clear();
token_string.clear();
- token_string.push_back(std::char_traits<char>::to_char_type(current));
+ token_string.push_back(std::char_traits<char_type>::to_char_type(current));
}
/*
@@ -6738,7 +9319,7 @@ scan_number_done:
@return character read from the input
*/
- std::char_traits<char>::int_type get()
+ char_int_type get()
{
++position.chars_read_total;
++position.chars_read_current_line;
@@ -6750,12 +9331,12 @@ scan_number_done:
}
else
{
- current = ia->get_character();
+ current = ia.get_character();
}
- if (JSON_LIKELY(current != std::char_traits<char>::eof()))
+ if (JSON_HEDLEY_LIKELY(current != std::char_traits<char_type>::eof()))
{
- token_string.push_back(std::char_traits<char>::to_char_type(current));
+ token_string.push_back(std::char_traits<char_type>::to_char_type(current));
}
if (current == '\n')
@@ -6794,7 +9375,7 @@ scan_number_done:
--position.chars_read_current_line;
}
- if (JSON_LIKELY(current != std::char_traits<char>::eof()))
+ if (JSON_HEDLEY_LIKELY(current != std::char_traits<char_type>::eof()))
{
assert(not token_string.empty());
token_string.pop_back();
@@ -6802,9 +9383,9 @@ scan_number_done:
}
/// add a character to token_buffer
- void add(int c)
+ void add(char_int_type c)
{
- token_buffer.push_back(std::char_traits<char>::to_char_type(c));
+ token_buffer.push_back(static_cast<typename string_t::value_type>(c));
}
public:
@@ -6855,7 +9436,7 @@ scan_number_done:
std::string result;
for (const auto c : token_string)
{
- if ('\x00' <= c and c <= '\x1F')
+ if (static_cast<unsigned char>(c) <= '\x1F')
{
// escape control characters
std::array<char, 9> cs{{}};
@@ -6865,7 +9446,7 @@ scan_number_done:
else
{
// add character as is
- result.push_back(c);
+ result.push_back(static_cast<std::string::value_type>(c));
}
}
@@ -6873,6 +9454,7 @@ scan_number_done:
}
/// return syntax error message
+ JSON_HEDLEY_RETURNS_NON_NULL
constexpr const char* get_error_message() const noexcept
{
return error_message;
@@ -6934,11 +9516,20 @@ scan_number_done:
// literals
case 't':
- return scan_literal("true", 4, token_type::literal_true);
+ {
+ std::array<char_type, 4> true_literal = {{'t', 'r', 'u', 'e'}};
+ return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true);
+ }
case 'f':
- return scan_literal("false", 5, token_type::literal_false);
+ {
+ std::array<char_type, 5> false_literal = {{'f', 'a', 'l', 's', 'e'}};
+ return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false);
+ }
case 'n':
- return scan_literal("null", 4, token_type::literal_null);
+ {
+ std::array<char_type, 4> null_literal = {{'n', 'u', 'l', 'l'}};
+ return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null);
+ }
// string
case '\"':
@@ -6961,7 +9552,7 @@ scan_number_done:
// end of input (the null byte is needed when parsing from
// string literals)
case '\0':
- case std::char_traits<char>::eof():
+ case std::char_traits<char_type>::eof():
return token_type::end_of_input;
// error
@@ -6973,10 +9564,10 @@ scan_number_done:
private:
/// input adapter
- detail::input_adapter_t ia = nullptr;
+ InputAdapterType ia;
/// the current character
- std::char_traits<char>::int_type current = std::char_traits<char>::eof();
+ char_int_type current = std::char_traits<char_type>::eof();
/// whether the next get() call should just return current
bool next_unget = false;
@@ -6985,7 +9576,7 @@ scan_number_done:
position_t position {};
/// raw input token string (for error messages)
- std::vector<char> token_string {};
+ std::vector<char_type> token_string {};
/// buffer for variable-length tokens (numbers, strings)
string_t token_buffer {};
@@ -6999,7 +9590,7 @@ scan_number_done:
number_float_t value_float = 0;
/// the decimal point
- const char decimal_point_char = '.';
+ const char_int_type decimal_point_char = '.';
};
} // namespace detail
} // namespace nlohmann
@@ -7038,44 +9629,45 @@ namespace detail
// parser //
////////////
+enum class parse_event_t : uint8_t
+{
+ /// the parser read `{` and started to process a JSON object
+ object_start,
+ /// the parser read `}` and finished processing a JSON object
+ object_end,
+ /// the parser read `[` and started to process a JSON array
+ array_start,
+ /// the parser read `]` and finished processing a JSON array
+ array_end,
+ /// the parser read a key of a value in an object
+ key,
+ /// the parser finished reading a JSON value
+ value
+};
+
+template<typename BasicJsonType>
+using parser_callback_t =
+ std::function<bool(int depth, parse_event_t event, BasicJsonType& parsed)>;
+
/*!
@brief syntax analysis
-This class implements a recursive decent parser.
+This class implements a recursive descent parser.
*/
-template<typename BasicJsonType>
+template<typename BasicJsonType, typename InputAdapterType>
class parser
{
using number_integer_t = typename BasicJsonType::number_integer_t;
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
using number_float_t = typename BasicJsonType::number_float_t;
using string_t = typename BasicJsonType::string_t;
- using lexer_t = lexer<BasicJsonType>;
+ using lexer_t = lexer<BasicJsonType, InputAdapterType>;
using token_type = typename lexer_t::token_type;
public:
- enum class parse_event_t : uint8_t
- {
- /// the parser read `{` and started to process a JSON object
- object_start,
- /// the parser read `}` and finished processing a JSON object
- object_end,
- /// the parser read `[` and started to process a JSON array
- array_start,
- /// the parser read `]` and finished processing a JSON array
- array_end,
- /// the parser read a key of a value in an object
- key,
- /// the parser finished reading a JSON value
- value
- };
-
- using parser_callback_t =
- std::function<bool(int depth, parse_event_t event, BasicJsonType& parsed)>;
-
/// a parser reading from an input adapter
- explicit parser(detail::input_adapter_t&& adapter,
- const parser_callback_t cb = nullptr,
+ explicit parser(InputAdapterType&& adapter,
+ const parser_callback_t<BasicJsonType> cb = nullptr,
const bool allow_exceptions_ = true)
: callback(cb), m_lexer(std::move(adapter)), allow_exceptions(allow_exceptions_)
{
@@ -7161,6 +9753,7 @@ class parser
}
template <typename SAX>
+ JSON_HEDLEY_NON_NULL(2)
bool sax_parse(SAX* sax, const bool strict = true)
{
(void)detail::is_sax_static_asserts<SAX, BasicJsonType> {};
@@ -7180,6 +9773,7 @@ class parser
private:
template <typename SAX>
+ JSON_HEDLEY_NON_NULL(2)
bool sax_parse_internal(SAX* sax)
{
// stack to remember the hierarchy of structured values we are parsing
@@ -7197,7 +9791,7 @@ class parser
{
case token_type::begin_object:
{
- if (JSON_UNLIKELY(not sax->start_object(std::size_t(-1))))
+ if (JSON_HEDLEY_UNLIKELY(not sax->start_object(std::size_t(-1))))
{
return false;
}
@@ -7205,7 +9799,7 @@ class parser
// closing } -> we are done
if (get_token() == token_type::end_object)
{
- if (JSON_UNLIKELY(not sax->end_object()))
+ if (JSON_HEDLEY_UNLIKELY(not sax->end_object()))
{
return false;
}
@@ -7213,20 +9807,20 @@ class parser
}
// parse key
- if (JSON_UNLIKELY(last_token != token_type::value_string))
+ if (JSON_HEDLEY_UNLIKELY(last_token != token_type::value_string))
{
return sax->parse_error(m_lexer.get_position(),
m_lexer.get_token_string(),
parse_error::create(101, m_lexer.get_position(),
exception_message(token_type::value_string, "object key")));
}
- if (JSON_UNLIKELY(not sax->key(m_lexer.get_string())))
+ if (JSON_HEDLEY_UNLIKELY(not sax->key(m_lexer.get_string())))
{
return false;
}
// parse separator (:)
- if (JSON_UNLIKELY(get_token() != token_type::name_separator))
+ if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator))
{
return sax->parse_error(m_lexer.get_position(),
m_lexer.get_token_string(),
@@ -7244,7 +9838,7 @@ class parser
case token_type::begin_array:
{
- if (JSON_UNLIKELY(not sax->start_array(std::size_t(-1))))
+ if (JSON_HEDLEY_UNLIKELY(not sax->start_array(std::size_t(-1))))
{
return false;
}
@@ -7252,7 +9846,7 @@ class parser
// closing ] -> we are done
if (get_token() == token_type::end_array)
{
- if (JSON_UNLIKELY(not sax->end_array()))
+ if (JSON_HEDLEY_UNLIKELY(not sax->end_array()))
{
return false;
}
@@ -7270,14 +9864,14 @@ class parser
{
const auto res = m_lexer.get_number_float();
- if (JSON_UNLIKELY(not std::isfinite(res)))
+ if (JSON_HEDLEY_UNLIKELY(not std::isfinite(res)))
{
return sax->parse_error(m_lexer.get_position(),
m_lexer.get_token_string(),
out_of_range::create(406, "number overflow parsing '" + m_lexer.get_token_string() + "'"));
}
- if (JSON_UNLIKELY(not sax->number_float(res, m_lexer.get_string())))
+ if (JSON_HEDLEY_UNLIKELY(not sax->number_float(res, m_lexer.get_string())))
{
return false;
}
@@ -7287,7 +9881,7 @@ class parser
case token_type::literal_false:
{
- if (JSON_UNLIKELY(not sax->boolean(false)))
+ if (JSON_HEDLEY_UNLIKELY(not sax->boolean(false)))
{
return false;
}
@@ -7296,7 +9890,7 @@ class parser
case token_type::literal_null:
{
- if (JSON_UNLIKELY(not sax->null()))
+ if (JSON_HEDLEY_UNLIKELY(not sax->null()))
{
return false;
}
@@ -7305,7 +9899,7 @@ class parser
case token_type::literal_true:
{
- if (JSON_UNLIKELY(not sax->boolean(true)))
+ if (JSON_HEDLEY_UNLIKELY(not sax->boolean(true)))
{
return false;
}
@@ -7314,7 +9908,7 @@ class parser
case token_type::value_integer:
{
- if (JSON_UNLIKELY(not sax->number_integer(m_lexer.get_number_integer())))
+ if (JSON_HEDLEY_UNLIKELY(not sax->number_integer(m_lexer.get_number_integer())))
{
return false;
}
@@ -7323,7 +9917,7 @@ class parser
case token_type::value_string:
{
- if (JSON_UNLIKELY(not sax->string(m_lexer.get_string())))
+ if (JSON_HEDLEY_UNLIKELY(not sax->string(m_lexer.get_string())))
{
return false;
}
@@ -7332,7 +9926,7 @@ class parser
case token_type::value_unsigned:
{
- if (JSON_UNLIKELY(not sax->number_unsigned(m_lexer.get_number_unsigned())))
+ if (JSON_HEDLEY_UNLIKELY(not sax->number_unsigned(m_lexer.get_number_unsigned())))
{
return false;
}
@@ -7380,9 +9974,9 @@ class parser
}
// closing ]
- if (JSON_LIKELY(last_token == token_type::end_array))
+ if (JSON_HEDLEY_LIKELY(last_token == token_type::end_array))
{
- if (JSON_UNLIKELY(not sax->end_array()))
+ if (JSON_HEDLEY_UNLIKELY(not sax->end_array()))
{
return false;
}
@@ -7408,7 +10002,7 @@ class parser
if (get_token() == token_type::value_separator)
{
// parse key
- if (JSON_UNLIKELY(get_token() != token_type::value_string))
+ if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::value_string))
{
return sax->parse_error(m_lexer.get_position(),
m_lexer.get_token_string(),
@@ -7416,13 +10010,13 @@ class parser
exception_message(token_type::value_string, "object key")));
}
- if (JSON_UNLIKELY(not sax->key(m_lexer.get_string())))
+ if (JSON_HEDLEY_UNLIKELY(not sax->key(m_lexer.get_string())))
{
return false;
}
// parse separator (:)
- if (JSON_UNLIKELY(get_token() != token_type::name_separator))
+ if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator))
{
return sax->parse_error(m_lexer.get_position(),
m_lexer.get_token_string(),
@@ -7436,9 +10030,9 @@ class parser
}
// closing }
- if (JSON_LIKELY(last_token == token_type::end_object))
+ if (JSON_HEDLEY_LIKELY(last_token == token_type::end_object))
{
- if (JSON_UNLIKELY(not sax->end_object()))
+ if (JSON_HEDLEY_UNLIKELY(not sax->end_object()))
{
return false;
}
@@ -7498,7 +10092,7 @@ class parser
private:
/// callback function
- const parser_callback_t callback = nullptr;
+ const parser_callback_t<BasicJsonType> callback = nullptr;
/// the type of the last read token
token_type last_token = token_type::uninitialized;
/// the lexer
@@ -7651,6 +10245,8 @@ template<typename BasicJsonType> struct internal_iterator
typename BasicJsonType::object_t::iterator object_iterator {};
/// iterator for JSON arrays
typename BasicJsonType::array_t::iterator array_iterator {};
+ /// iterator for JSON binary arrays
+ typename BasicJsonType::binary_t::container_type::iterator binary_iterator {};
/// generic iterator for all other types
primitive_iterator_t primitive_iterator {};
};
@@ -7660,10 +10256,11 @@ template<typename BasicJsonType> struct internal_iterator
// #include <nlohmann/detail/iterators/iter_impl.hpp>
-#include <ciso646> // not
#include <iterator> // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next
#include <type_traits> // conditional, is_const, remove_const
+// #include <nlohmann/detail/boolean_operators.hpp>
+
// #include <nlohmann/detail/exceptions.hpp>
// #include <nlohmann/detail/iterators/internal_iterator.hpp>
@@ -7786,16 +10383,41 @@ class iter_impl
*/
/*!
+ @brief const copy constructor
+ @param[in] other const iterator to copy from
+ @note This copy constructor had to be defined explicitly to circumvent a bug
+ occurring on msvc v19.0 compiler (VS 2015) debug build. For more
+ information refer to: https://github.com/nlohmann/json/issues/1608
+ */
+ iter_impl(const iter_impl<const BasicJsonType>& other) noexcept
+ : m_object(other.m_object), m_it(other.m_it)
+ {}
+
+ /*!
+ @brief converting assignment
+ @param[in] other const iterator to copy from
+ @return const/non-const iterator
+ @note It is not checked whether @a other is initialized.
+ */
+ iter_impl& operator=(const iter_impl<const BasicJsonType>& other) noexcept
+ {
+ m_object = other.m_object;
+ m_it = other.m_it;
+ return *this;
+ }
+
+ /*!
@brief converting constructor
@param[in] other non-const iterator to copy from
@note It is not checked whether @a other is initialized.
*/
iter_impl(const iter_impl<typename std::remove_const<BasicJsonType>::type>& other) noexcept
- : m_object(other.m_object), m_it(other.m_it) {}
+ : m_object(other.m_object), m_it(other.m_it)
+ {}
/*!
@brief converting assignment
- @param[in,out] other non-const iterator to copy from
+ @param[in] other non-const iterator to copy from
@return const/non-const iterator
@note It is not checked whether @a other is initialized.
*/
@@ -7902,7 +10524,7 @@ class iter_impl
default:
{
- if (JSON_LIKELY(m_it.primitive_iterator.is_begin()))
+ if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin()))
{
return *m_object;
}
@@ -7936,7 +10558,7 @@ class iter_impl
default:
{
- if (JSON_LIKELY(m_it.primitive_iterator.is_begin()))
+ if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin()))
{
return m_object;
}
@@ -8039,7 +10661,7 @@ class iter_impl
bool operator==(const iter_impl& other) const
{
// if objects are not the same, the comparison is undefined
- if (JSON_UNLIKELY(m_object != other.m_object))
+ if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
{
JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers"));
}
@@ -8075,7 +10697,7 @@ class iter_impl
bool operator<(const iter_impl& other) const
{
// if objects are not the same, the comparison is undefined
- if (JSON_UNLIKELY(m_object != other.m_object))
+ if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object))
{
JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers"));
}
@@ -8235,7 +10857,7 @@ class iter_impl
default:
{
- if (JSON_LIKELY(m_it.primitive_iterator.get_value() == -n))
+ if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.get_value() == -n))
{
return *m_object;
}
@@ -8253,7 +10875,7 @@ class iter_impl
{
assert(m_object != nullptr);
- if (JSON_LIKELY(m_object->is_object()))
+ if (JSON_HEDLEY_LIKELY(m_object->is_object()))
{
return m_it.object_iterator->first;
}
@@ -8276,7 +10898,7 @@ class iter_impl
/// the actual iterator of the associated instance
internal_iterator<typename std::remove_const<BasicJsonType>::type> m_it {};
};
-} // namespace detail
+} // namespace detail
} // namespace nlohmann
// #include <nlohmann/detail/iterators/iteration_proxy.hpp>
@@ -8409,6 +11031,7 @@ class json_reverse_iterator : public std::reverse_iterator<Base>
#include <algorithm> // all_of
#include <cassert> // assert
+#include <cctype> // isdigit
#include <numeric> // accumulate
#include <string> // string
#include <utility> // move
@@ -8535,8 +11158,8 @@ class json_pointer
/*!
@brief append an array index at the end of this JSON pointer
- @param[in] array_index array index ot append
- @return JSON pointer with @a array_index appended
+ @param[in] array_idx array index to append
+ @return JSON pointer with @a array_idx appended
@liveexample{The example shows the usage of `operator/=`.,json_pointer__operator_add}
@@ -8548,9 +11171,9 @@ class json_pointer
@since version 3.6.0
*/
- json_pointer& operator/=(std::size_t array_index)
+ json_pointer& operator/=(std::size_t array_idx)
{
- return *this /= std::to_string(array_index);
+ return *this /= std::to_string(array_idx);
}
/*!
@@ -8598,8 +11221,8 @@ class json_pointer
@brief create a new JSON pointer by appending the array-index-token at the end of the JSON pointer
@param[in] ptr JSON pointer
- @param[in] array_index array index
- @return a new JSON pointer with @a array_index appended to @a ptr
+ @param[in] array_idx array index
+ @return a new JSON pointer with @a array_idx appended to @a ptr
@liveexample{The example shows the usage of `operator/`.,json_pointer__operator_add_binary}
@@ -8609,9 +11232,9 @@ class json_pointer
@since version 3.6.0
*/
- friend json_pointer operator/(const json_pointer& ptr, std::size_t array_index)
+ friend json_pointer operator/(const json_pointer& ptr, std::size_t array_idx)
{
- return json_pointer(ptr) /= array_index;
+ return json_pointer(ptr) /= array_idx;
}
/*!
@@ -8654,7 +11277,7 @@ class json_pointer
*/
void pop_back()
{
- if (JSON_UNLIKELY(empty()))
+ if (JSON_HEDLEY_UNLIKELY(empty()))
{
JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent"));
}
@@ -8676,9 +11299,9 @@ class json_pointer
@since version 3.6.0
*/
- const std::string& back()
+ const std::string& back() const
{
- if (JSON_UNLIKELY(empty()))
+ if (JSON_HEDLEY_UNLIKELY(empty()))
{
JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent"));
}
@@ -8738,11 +11361,33 @@ class json_pointer
*/
static int array_index(const std::string& s)
{
+ // error condition (cf. RFC 6901, Sect. 4)
+ if (JSON_HEDLEY_UNLIKELY(s.size() > 1 and s[0] == '0'))
+ {
+ JSON_THROW(detail::parse_error::create(106, 0,
+ "array index '" + s +
+ "' must not begin with '0'"));
+ }
+
+ // error condition (cf. RFC 6901, Sect. 4)
+ if (JSON_HEDLEY_UNLIKELY(s.size() > 1 and not (s[0] >= '1' and s[0] <= '9')))
+ {
+ JSON_THROW(detail::parse_error::create(109, 0, "array index '" + s + "' is not a number"));
+ }
+
std::size_t processed_chars = 0;
- const int res = std::stoi(s, &processed_chars);
+ int res = 0;
+ JSON_TRY
+ {
+ res = std::stoi(s, &processed_chars);
+ }
+ JSON_CATCH(std::out_of_range&)
+ {
+ JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + s + "'"));
+ }
// check if the string was completely read
- if (JSON_UNLIKELY(processed_chars != s.size()))
+ if (JSON_HEDLEY_UNLIKELY(processed_chars != s.size()))
{
JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + s + "'"));
}
@@ -8752,7 +11397,7 @@ class json_pointer
json_pointer top() const
{
- if (JSON_UNLIKELY(empty()))
+ if (JSON_HEDLEY_UNLIKELY(empty()))
{
JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent"));
}
@@ -8779,7 +11424,7 @@ class json_pointer
// j which will be overwritten by a primitive value
for (const auto& reference_token : reference_tokens)
{
- switch (result->m_type)
+ switch (result->type())
{
case detail::value_t::null:
{
@@ -8806,14 +11451,7 @@ class json_pointer
case detail::value_t::array:
{
// create an entry in the array
- JSON_TRY
- {
- result = &result->operator[](static_cast<size_type>(array_index(reference_token)));
- }
- JSON_CATCH(std::invalid_argument&)
- {
- JSON_THROW(detail::parse_error::create(109, 0, "array index '" + reference_token + "' is not a number"));
- }
+ result = &result->operator[](static_cast<size_type>(array_index(reference_token)));
break;
}
@@ -8856,14 +11494,14 @@ class json_pointer
for (const auto& reference_token : reference_tokens)
{
// convert null values to arrays or objects before continuing
- if (ptr->m_type == detail::value_t::null)
+ if (ptr->is_null())
{
// check if reference token is a number
const bool nums =
std::all_of(reference_token.begin(), reference_token.end(),
- [](const char x)
+ [](const unsigned char x)
{
- return x >= '0' and x <= '9';
+ return std::isdigit(x);
});
// change value to array for numbers or "-" or to object otherwise
@@ -8872,7 +11510,7 @@ class json_pointer
: detail::value_t::object;
}
- switch (ptr->m_type)
+ switch (ptr->type())
{
case detail::value_t::object:
{
@@ -8883,14 +11521,6 @@ class json_pointer
case detail::value_t::array:
{
- // error condition (cf. RFC 6901, Sect. 4)
- if (JSON_UNLIKELY(reference_token.size() > 1 and reference_token[0] == '0'))
- {
- JSON_THROW(detail::parse_error::create(106, 0,
- "array index '" + reference_token +
- "' must not begin with '0'"));
- }
-
if (reference_token == "-")
{
// explicitly treat "-" as index beyond the end
@@ -8899,15 +11529,8 @@ class json_pointer
else
{
// convert array index to number; unchecked access
- JSON_TRY
- {
- ptr = &ptr->operator[](
- static_cast<size_type>(array_index(reference_token)));
- }
- JSON_CATCH(std::invalid_argument&)
- {
- JSON_THROW(detail::parse_error::create(109, 0, "array index '" + reference_token + "' is not a number"));
- }
+ ptr = &ptr->operator[](
+ static_cast<size_type>(array_index(reference_token)));
}
break;
}
@@ -8931,7 +11554,7 @@ class json_pointer
using size_type = typename BasicJsonType::size_type;
for (const auto& reference_token : reference_tokens)
{
- switch (ptr->m_type)
+ switch (ptr->type())
{
case detail::value_t::object:
{
@@ -8942,7 +11565,7 @@ class json_pointer
case detail::value_t::array:
{
- if (JSON_UNLIKELY(reference_token == "-"))
+ if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
{
// "-" always fails the range check
JSON_THROW(detail::out_of_range::create(402,
@@ -8950,23 +11573,8 @@ class json_pointer
") is out of range"));
}
- // error condition (cf. RFC 6901, Sect. 4)
- if (JSON_UNLIKELY(reference_token.size() > 1 and reference_token[0] == '0'))
- {
- JSON_THROW(detail::parse_error::create(106, 0,
- "array index '" + reference_token +
- "' must not begin with '0'"));
- }
-
// note: at performs range check
- JSON_TRY
- {
- ptr = &ptr->at(static_cast<size_type>(array_index(reference_token)));
- }
- JSON_CATCH(std::invalid_argument&)
- {
- JSON_THROW(detail::parse_error::create(109, 0, "array index '" + reference_token + "' is not a number"));
- }
+ ptr = &ptr->at(static_cast<size_type>(array_index(reference_token)));
break;
}
@@ -8996,7 +11604,7 @@ class json_pointer
using size_type = typename BasicJsonType::size_type;
for (const auto& reference_token : reference_tokens)
{
- switch (ptr->m_type)
+ switch (ptr->type())
{
case detail::value_t::object:
{
@@ -9007,7 +11615,7 @@ class json_pointer
case detail::value_t::array:
{
- if (JSON_UNLIKELY(reference_token == "-"))
+ if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
{
// "-" cannot be used for const access
JSON_THROW(detail::out_of_range::create(402,
@@ -9015,24 +11623,9 @@ class json_pointer
") is out of range"));
}
- // error condition (cf. RFC 6901, Sect. 4)
- if (JSON_UNLIKELY(reference_token.size() > 1 and reference_token[0] == '0'))
- {
- JSON_THROW(detail::parse_error::create(106, 0,
- "array index '" + reference_token +
- "' must not begin with '0'"));
- }
-
// use unchecked array access
- JSON_TRY
- {
- ptr = &ptr->operator[](
- static_cast<size_type>(array_index(reference_token)));
- }
- JSON_CATCH(std::invalid_argument&)
- {
- JSON_THROW(detail::parse_error::create(109, 0, "array index '" + reference_token + "' is not a number"));
- }
+ ptr = &ptr->operator[](
+ static_cast<size_type>(array_index(reference_token)));
break;
}
@@ -9055,7 +11648,7 @@ class json_pointer
using size_type = typename BasicJsonType::size_type;
for (const auto& reference_token : reference_tokens)
{
- switch (ptr->m_type)
+ switch (ptr->type())
{
case detail::value_t::object:
{
@@ -9066,7 +11659,7 @@ class json_pointer
case detail::value_t::array:
{
- if (JSON_UNLIKELY(reference_token == "-"))
+ if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
{
// "-" always fails the range check
JSON_THROW(detail::out_of_range::create(402,
@@ -9074,32 +11667,93 @@ class json_pointer
") is out of range"));
}
- // error condition (cf. RFC 6901, Sect. 4)
- if (JSON_UNLIKELY(reference_token.size() > 1 and reference_token[0] == '0'))
+ // note: at performs range check
+ ptr = &ptr->at(static_cast<size_type>(array_index(reference_token)));
+ break;
+ }
+
+ default:
+ JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'"));
+ }
+ }
+
+ return *ptr;
+ }
+
+ /*!
+ @throw parse_error.106 if an array index begins with '0'
+ @throw parse_error.109 if an array index was not a number
+ */
+ bool contains(const BasicJsonType* ptr) const
+ {
+ using size_type = typename BasicJsonType::size_type;
+ for (const auto& reference_token : reference_tokens)
+ {
+ switch (ptr->type())
+ {
+ case detail::value_t::object:
+ {
+ if (not ptr->contains(reference_token))
{
- JSON_THROW(detail::parse_error::create(106, 0,
- "array index '" + reference_token +
- "' must not begin with '0'"));
+ // we did not find the key in the object
+ return false;
}
- // note: at performs range check
- JSON_TRY
+ ptr = &ptr->operator[](reference_token);
+ break;
+ }
+
+ case detail::value_t::array:
+ {
+ if (JSON_HEDLEY_UNLIKELY(reference_token == "-"))
{
- ptr = &ptr->at(static_cast<size_type>(array_index(reference_token)));
+ // "-" always fails the range check
+ return false;
}
- JSON_CATCH(std::invalid_argument&)
+ if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 and not ("0" <= reference_token and reference_token <= "9")))
{
- JSON_THROW(detail::parse_error::create(109, 0, "array index '" + reference_token + "' is not a number"));
+ // invalid char
+ return false;
}
+ if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1))
+ {
+ if (JSON_HEDLEY_UNLIKELY(not ('1' <= reference_token[0] and reference_token[0] <= '9')))
+ {
+ // first char should be between '1' and '9'
+ return false;
+ }
+ for (std::size_t i = 1; i < reference_token.size(); i++)
+ {
+ if (JSON_HEDLEY_UNLIKELY(not ('0' <= reference_token[i] and reference_token[i] <= '9')))
+ {
+ // other char should be between '0' and '9'
+ return false;
+ }
+ }
+ }
+
+ const auto idx = static_cast<size_type>(array_index(reference_token));
+ if (idx >= ptr->size())
+ {
+ // index out of range
+ return false;
+ }
+
+ ptr = &ptr->operator[](idx);
break;
}
default:
- JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'"));
+ {
+ // we do not expect primitive values if there is still a
+ // reference token to process
+ return false;
+ }
}
}
- return *ptr;
+ // no reference token left means we found a primitive value
+ return true;
}
/*!
@@ -9122,7 +11776,7 @@ class json_pointer
}
// check if nonempty reference string begins with slash
- if (JSON_UNLIKELY(reference_string[0] != '/'))
+ if (JSON_HEDLEY_UNLIKELY(reference_string[0] != '/'))
{
JSON_THROW(detail::parse_error::create(107, 1,
"JSON pointer must be empty or begin with '/' - was: '" +
@@ -9157,9 +11811,9 @@ class json_pointer
assert(reference_token[pos] == '~');
// ~ must be followed by 0 or 1
- if (JSON_UNLIKELY(pos == reference_token.size() - 1 or
- (reference_token[pos + 1] != '0' and
- reference_token[pos + 1] != '1')))
+ if (JSON_HEDLEY_UNLIKELY(pos == reference_token.size() - 1 or
+ (reference_token[pos + 1] != '0' and
+ reference_token[pos + 1] != '1')))
{
JSON_THROW(detail::parse_error::create(108, 0, "escape character '~' must be followed with '0' or '1'"));
}
@@ -9223,7 +11877,7 @@ class json_pointer
const BasicJsonType& value,
BasicJsonType& result)
{
- switch (value.m_type)
+ switch (value.type())
{
case detail::value_t::array:
{
@@ -9284,7 +11938,7 @@ class json_pointer
static BasicJsonType
unflatten(const BasicJsonType& value)
{
- if (JSON_UNLIKELY(not value.is_object()))
+ if (JSON_HEDLEY_UNLIKELY(not value.is_object()))
{
JSON_THROW(detail::type_error::create(314, "only objects can be unflattened"));
}
@@ -9294,7 +11948,7 @@ class json_pointer
// iterate the JSON object values
for (const auto& element : *value.m_value.object)
{
- if (JSON_UNLIKELY(not element.second.is_primitive()))
+ if (JSON_HEDLEY_UNLIKELY(not element.second.is_primitive()))
{
JSON_THROW(detail::type_error::create(315, "values in object must be primitive"));
}
@@ -9435,9 +12089,12 @@ class json_ref
#include <cstring> // memcpy
#include <limits> // numeric_limits
#include <string> // string
+#include <cmath> // isnan, isinf
// #include <nlohmann/detail/input/binary_reader.hpp>
+// #include <nlohmann/detail/macro_scope.hpp>
+
// #include <nlohmann/detail/output/output_adapters.hpp>
@@ -9449,6 +12106,8 @@ class json_ref
#include <ostream> // basic_ostream
#include <string> // basic_string
#include <vector> // vector
+// #include <nlohmann/detail/macro_scope.hpp>
+
namespace nlohmann
{
@@ -9480,6 +12139,7 @@ class output_vector_adapter : public output_adapter_protocol<CharType>
v.push_back(c);
}
+ JSON_HEDLEY_NON_NULL(2)
void write_characters(const CharType* s, std::size_t length) override
{
std::copy(s, s + length, std::back_inserter(v));
@@ -9503,6 +12163,7 @@ class output_stream_adapter : public output_adapter_protocol<CharType>
stream.put(c);
}
+ JSON_HEDLEY_NON_NULL(2)
void write_characters(const CharType* s, std::size_t length) override
{
stream.write(s, static_cast<std::streamsize>(length));
@@ -9526,6 +12187,7 @@ class output_string_adapter : public output_adapter_protocol<CharType>
str.push_back(c);
}
+ JSON_HEDLEY_NON_NULL(2)
void write_characters(const CharType* s, std::size_t length) override
{
str.append(s, length);
@@ -9575,6 +12237,7 @@ template<typename BasicJsonType, typename CharType>
class binary_writer
{
using string_t = typename BasicJsonType::string_t;
+ using binary_t = typename BasicJsonType::binary_t;
public:
/*!
@@ -9725,8 +12388,35 @@ class binary_writer
case value_t::number_float:
{
- oa->write_character(get_cbor_float_prefix(j.m_value.number_float));
- write_number(j.m_value.number_float);
+ if (std::isnan(j.m_value.number_float))
+ {
+ // NaN is 0xf97e00 in CBOR
+ oa->write_character(to_char_type(0xF9));
+ oa->write_character(to_char_type(0x7E));
+ oa->write_character(to_char_type(0x00));
+ }
+ else if (std::isinf(j.m_value.number_float))
+ {
+ // Infinity is 0xf97c00, -Infinity is 0xf9fc00
+ oa->write_character(to_char_type(0xf9));
+ oa->write_character(j.m_value.number_float > 0 ? to_char_type(0x7C) : to_char_type(0xFC));
+ oa->write_character(to_char_type(0x00));
+ }
+ else
+ {
+ if (static_cast<double>(j.m_value.number_float) >= static_cast<double>(std::numeric_limits<float>::lowest()) and
+ static_cast<double>(j.m_value.number_float) <= static_cast<double>((std::numeric_limits<float>::max)()) and
+ static_cast<double>(static_cast<float>(j.m_value.number_float)) == static_cast<double>(j.m_value.number_float))
+ {
+ oa->write_character(get_cbor_float_prefix(static_cast<float>(j.m_value.number_float)));
+ write_number(static_cast<float>(j.m_value.number_float));
+ }
+ else
+ {
+ oa->write_character(get_cbor_float_prefix(j.m_value.number_float));
+ write_number(j.m_value.number_float);
+ }
+ }
break;
}
@@ -9807,6 +12497,45 @@ class binary_writer
break;
}
+ case value_t::binary:
+ {
+ // step 1: write control byte and the binary array size
+ const auto N = j.m_value.binary->size();
+ if (N <= 0x17)
+ {
+ write_number(static_cast<std::uint8_t>(0x40 + N));
+ }
+ else if (N <= (std::numeric_limits<std::uint8_t>::max)())
+ {
+ oa->write_character(to_char_type(0x58));
+ write_number(static_cast<std::uint8_t>(N));
+ }
+ else if (N <= (std::numeric_limits<std::uint16_t>::max)())
+ {
+ oa->write_character(to_char_type(0x59));
+ write_number(static_cast<std::uint16_t>(N));
+ }
+ else if (N <= (std::numeric_limits<std::uint32_t>::max)())
+ {
+ oa->write_character(to_char_type(0x5A));
+ write_number(static_cast<std::uint32_t>(N));
+ }
+ // LCOV_EXCL_START
+ else if (N <= (std::numeric_limits<std::uint64_t>::max)())
+ {
+ oa->write_character(to_char_type(0x5B));
+ write_number(static_cast<std::uint64_t>(N));
+ }
+ // LCOV_EXCL_STOP
+
+ // step 2: write each element
+ oa->write_characters(
+ reinterpret_cast<const CharType*>(j.m_value.binary->data()),
+ N);
+
+ break;
+ }
+
case value_t::object:
{
// step 1: write control byte and the object size
@@ -10055,6 +12784,101 @@ class binary_writer
break;
}
+ case value_t::binary:
+ {
+ // step 0: determine if the binary type has a set subtype to
+ // determine whether or not to use the ext or fixext types
+ const bool use_ext = j.m_value.binary->has_subtype();
+
+ // step 1: write control byte and the byte string length
+ const auto N = j.m_value.binary->size();
+ if (N <= (std::numeric_limits<std::uint8_t>::max)())
+ {
+ std::uint8_t output_type;
+ bool fixed = true;
+ if (use_ext)
+ {
+ switch (N)
+ {
+ case 1:
+ output_type = 0xD4; // fixext 1
+ break;
+ case 2:
+ output_type = 0xD5; // fixext 2
+ break;
+ case 4:
+ output_type = 0xD6; // fixext 4
+ break;
+ case 8:
+ output_type = 0xD7; // fixext 8
+ break;
+ case 16:
+ output_type = 0xD8; // fixext 16
+ break;
+ default:
+ output_type = 0xC7; // ext 8
+ fixed = false;
+ break;
+ }
+
+ }
+ else
+ {
+ output_type = 0xC4; // bin 8
+ fixed = false;
+ }
+
+ oa->write_character(to_char_type(output_type));
+ if (not fixed)
+ {
+ write_number(static_cast<std::uint8_t>(N));
+ }
+ }
+ else if (N <= (std::numeric_limits<std::uint16_t>::max)())
+ {
+ std::uint8_t output_type;
+ if (use_ext)
+ {
+ output_type = 0xC8; // ext 16
+ }
+ else
+ {
+ output_type = 0xC5; // bin 16
+ }
+
+ oa->write_character(to_char_type(output_type));
+ write_number(static_cast<std::uint16_t>(N));
+ }
+ else if (N <= (std::numeric_limits<std::uint32_t>::max)())
+ {
+ std::uint8_t output_type;
+ if (use_ext)
+ {
+ output_type = 0xC9; // ext 32
+ }
+ else
+ {
+ output_type = 0xC6; // bin 32
+ }
+
+ oa->write_character(to_char_type(output_type));
+ write_number(static_cast<std::uint32_t>(N));
+ }
+
+ // step 1.5: if this is an ext type, write the subtype
+ if (use_ext)
+ {
+ write_number(static_cast<std::int8_t>(j.m_value.binary->subtype()));
+ }
+
+ // step 2: write the byte string
+ oa->write_characters(
+ reinterpret_cast<const CharType*>(j.m_value.binary->data()),
+ N);
+
+ break;
+ }
+
case value_t::object:
{
// step 1: write control byte and the object size
@@ -10198,6 +13022,49 @@ class binary_writer
break;
}
+ case value_t::binary:
+ {
+ if (add_prefix)
+ {
+ oa->write_character(to_char_type('['));
+ }
+
+ if (use_type and not j.m_value.binary->empty())
+ {
+ assert(use_count);
+ oa->write_character(to_char_type('$'));
+ oa->write_character('U');
+ }
+
+ if (use_count)
+ {
+ oa->write_character(to_char_type('#'));
+ write_number_with_ubjson_prefix(j.m_value.binary->size(), true);
+ }
+
+ if (use_type)
+ {
+ oa->write_characters(
+ reinterpret_cast<const CharType*>(j.m_value.binary->data()),
+ j.m_value.binary->size());
+ }
+ else
+ {
+ for (size_t i = 0; i < j.m_value.binary->size(); ++i)
+ {
+ oa->write_character(to_char_type('U'));
+ oa->write_character(j.m_value.binary->data()[i]);
+ }
+ }
+
+ if (not use_count)
+ {
+ oa->write_character(to_char_type(']'));
+ }
+
+ break;
+ }
+
case value_t::object:
{
if (add_prefix)
@@ -10264,7 +13131,7 @@ class binary_writer
static std::size_t calc_bson_entry_header_size(const string_t& name)
{
const auto it = name.find(static_cast<typename string_t::value_type>(0));
- if (JSON_UNLIKELY(it != BasicJsonType::string_t::npos))
+ if (JSON_HEDLEY_UNLIKELY(it != BasicJsonType::string_t::npos))
{
JSON_THROW(out_of_range::create(409,
"BSON key cannot contain code point U+0000 (at byte " + std::to_string(it) + ")"));
@@ -10410,18 +13277,25 @@ class binary_writer
*/
static std::size_t calc_bson_array_size(const typename BasicJsonType::array_t& value)
{
- std::size_t embedded_document_size = 0ul;
std::size_t array_index = 0ul;
- for (const auto& el : value)
+ const std::size_t embedded_document_size = std::accumulate(std::begin(value), std::end(value), std::size_t(0), [&array_index](std::size_t result, const typename BasicJsonType::array_t::value_type & el)
{
- embedded_document_size += calc_bson_element_size(std::to_string(array_index++), el);
- }
+ return result + calc_bson_element_size(std::to_string(array_index++), el);
+ });
return sizeof(std::int32_t) + embedded_document_size + 1ul;
}
/*!
+ @return The size of the BSON-encoded binary array @a value
+ */
+ static std::size_t calc_bson_binary_size(const typename BasicJsonType::binary_t& value)
+ {
+ return sizeof(std::int32_t) + value.size() + 1ul;
+ }
+
+ /*!
@brief Writes a BSON element with key @a name and array @a value
*/
void write_bson_array(const string_t& name,
@@ -10441,6 +13315,20 @@ class binary_writer
}
/*!
+ @brief Writes a BSON element with key @a name and binary value @a value
+ */
+ void write_bson_binary(const string_t& name,
+ const binary_t& value)
+ {
+ write_bson_entry_header(name, 0x05);
+
+ write_number<std::int32_t, true>(static_cast<std::int32_t>(value.size()));
+ write_number(value.has_subtype() ? value.subtype() : std::uint8_t(0x00));
+
+ oa->write_characters(reinterpret_cast<const CharType*>(value.data()), value.size());
+ }
+
+ /*!
@brief Calculates the size necessary to serialize the JSON value @a j with its @a name
@return The calculated size for the BSON document entry for @a j with the given @a name.
*/
@@ -10456,6 +13344,9 @@ class binary_writer
case value_t::array:
return header_size + calc_bson_array_size(*j.m_value.array);
+ case value_t::binary:
+ return header_size + calc_bson_binary_size(*j.m_value.binary);
+
case value_t::boolean:
return header_size + 1ul;
@@ -10500,6 +13391,9 @@ class binary_writer
case value_t::array:
return write_bson_array(name, *j.m_value.array);
+ case value_t::binary:
+ return write_bson_binary(name, *j.m_value.binary);
+
case value_t::boolean:
return write_bson_boolean(name, j.m_value.boolean);
@@ -10534,7 +13428,7 @@ class binary_writer
*/
static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value)
{
- std::size_t document_size = std::accumulate(value.begin(), value.end(), 0ul,
+ std::size_t document_size = std::accumulate(value.begin(), value.end(), std::size_t(0),
[](size_t result, const typename BasicJsonType::object_t::value_type & el)
{
return result += calc_bson_element_size(el.first, el.second);
@@ -10754,19 +13648,19 @@ class binary_writer
case value_t::number_unsigned:
{
- if (j.m_value.number_unsigned <= (std::numeric_limits<std::int8_t>::max)())
+ if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int8_t>::max)()))
{
return 'i';
}
- if (j.m_value.number_unsigned <= (std::numeric_limits<std::uint8_t>::max)())
+ if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::uint8_t>::max)()))
{
return 'U';
}
- if (j.m_value.number_unsigned <= (std::numeric_limits<std::int16_t>::max)())
+ if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int16_t>::max)()))
{
return 'I';
}
- if (j.m_value.number_unsigned <= (std::numeric_limits<std::int32_t>::max)())
+ if (j.m_value.number_unsigned <= static_cast<std::uint64_t>((std::numeric_limits<std::int32_t>::max)()))
{
return 'l';
}
@@ -10780,7 +13674,8 @@ class binary_writer
case value_t::string:
return 'S';
- case value_t::array:
+ case value_t::array: // fallthrough
+ case value_t::binary:
return '[';
case value_t::object:
@@ -10850,7 +13745,7 @@ class binary_writer
static CharType to_char_type(std::uint8_t x) noexcept
{
static_assert(sizeof(std::uint8_t) == sizeof(CharType), "size of CharType must be equal to std::uint8_t");
- static_assert(std::is_pod<CharType>::value, "CharType must be POD");
+ static_assert(std::is_trivial<CharType>::value, "CharType must be trivial");
CharType result;
std::memcpy(&result, &x, sizeof(x));
return result;
@@ -10876,7 +13771,7 @@ class binary_writer
private:
/// whether we can assume little endianess
- const bool is_little_endian = binary_reader<BasicJsonType>::little_endianess();
+ const bool is_little_endian = little_endianess();
/// the output
output_adapter_t<CharType> oa = nullptr;
@@ -10892,7 +13787,6 @@ class binary_writer
#include <algorithm> // reverse, remove, fill, find, none_of
#include <array> // array
#include <cassert> // assert
-#include <ciso646> // and, or
#include <clocale> // localeconv, lconv
#include <cmath> // labs, isfinite, isnan, signbit
#include <cstddef> // size_t, ptrdiff_t
@@ -10903,18 +13797,24 @@ class binary_writer
#include <type_traits> // is_same
#include <utility> // move
+// #include <nlohmann/detail/boolean_operators.hpp>
+
// #include <nlohmann/detail/conversions/to_chars.hpp>
#include <array> // array
#include <cassert> // assert
-#include <ciso646> // or, and, not
#include <cmath> // signbit, isfinite
#include <cstdint> // intN_t, uintN_t
#include <cstring> // memcpy, memmove
#include <limits> // numeric_limits
#include <type_traits> // conditional
+// #include <nlohmann/detail/boolean_operators.hpp>
+
+// #include <nlohmann/detail/macro_scope.hpp>
+
+
namespace nlohmann
{
namespace detail
@@ -11235,7 +14135,7 @@ inline cached_power get_cached_power_for_binary_exponent(int e)
// ==> 2^(q - 1 + alpha) <= c * 2^(e + q)
// ==> 2^(alpha - e - 1) <= c
//
- // If c were an exakt power of ten, i.e. c = 10^k, one may determine k as
+ // If c were an exact power of ten, i.e. c = 10^k, one may determine k as
//
// k = ceil( log_10( 2^(alpha - e - 1) ) )
// = ceil( (alpha - e - 1) * log_10(2) )
@@ -11724,6 +14624,7 @@ v = buf * 10^decimal_exponent
len is the length of the buffer (number of decimal digits)
The buffer must be large enough, i.e. >= max_digits10.
*/
+JSON_HEDLEY_NON_NULL(1)
inline void grisu2(char* buf, int& len, int& decimal_exponent,
diyfp m_minus, diyfp v, diyfp m_plus)
{
@@ -11783,6 +14684,7 @@ len is the length of the buffer (number of decimal digits)
The buffer must be large enough, i.e. >= max_digits10.
*/
template <typename FloatType>
+JSON_HEDLEY_NON_NULL(1)
void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value)
{
static_assert(diyfp::kPrecision >= std::numeric_limits<FloatType>::digits + 3,
@@ -11821,6 +14723,8 @@ void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value)
@return a pointer to the element following the exponent.
@pre -1000 < e < 1000
*/
+JSON_HEDLEY_NON_NULL(1)
+JSON_HEDLEY_RETURNS_NON_NULL
inline char* append_exponent(char* buf, int e)
{
assert(e > -1000);
@@ -11871,6 +14775,8 @@ notation. Otherwise it will be printed in exponential notation.
@pre min_exp < 0
@pre max_exp > 0
*/
+JSON_HEDLEY_NON_NULL(1)
+JSON_HEDLEY_RETURNS_NON_NULL
inline char* format_buffer(char* buf, int len, int decimal_exponent,
int min_exp, int max_exp)
{
@@ -11889,11 +14795,11 @@ inline char* format_buffer(char* buf, int len, int decimal_exponent,
// digits[000]
// len <= max_exp + 2
- std::memset(buf + k, '0', static_cast<size_t>(n - k));
+ std::memset(buf + k, '0', static_cast<size_t>(n) - static_cast<size_t>(k));
// Make it look like a floating-point number (#362, #378)
buf[n + 0] = '.';
buf[n + 1] = '0';
- return buf + (n + 2);
+ return buf + (static_cast<size_t>(n) + 2);
}
if (0 < n and n <= max_exp)
@@ -11903,9 +14809,9 @@ inline char* format_buffer(char* buf, int len, int decimal_exponent,
assert(k > n);
- std::memmove(buf + (n + 1), buf + n, static_cast<size_t>(k - n));
+ std::memmove(buf + (static_cast<size_t>(n) + 1), buf + n, static_cast<size_t>(k) - static_cast<size_t>(n));
buf[n] = '.';
- return buf + (k + 1);
+ return buf + (static_cast<size_t>(k) + 1U);
}
if (min_exp < n and n <= 0)
@@ -11913,11 +14819,11 @@ inline char* format_buffer(char* buf, int len, int decimal_exponent,
// 0.[000]digits
// len <= 2 + (-min_exp - 1) + max_digits10
- std::memmove(buf + (2 + -n), buf, static_cast<size_t>(k));
+ std::memmove(buf + (2 + static_cast<size_t>(-n)), buf, static_cast<size_t>(k));
buf[0] = '0';
buf[1] = '.';
std::memset(buf + 2, '0', static_cast<size_t>(-n));
- return buf + (2 + (-n) + k);
+ return buf + (2U + static_cast<size_t>(-n) + static_cast<size_t>(k));
}
if (k == 1)
@@ -11932,9 +14838,9 @@ inline char* format_buffer(char* buf, int len, int decimal_exponent,
// d.igitsE+123
// len <= max_digits10 + 1 + 5
- std::memmove(buf + 2, buf + 1, static_cast<size_t>(k - 1));
+ std::memmove(buf + 2, buf + 1, static_cast<size_t>(k) - 1);
buf[1] = '.';
- buf += 1 + k;
+ buf += 1 + static_cast<size_t>(k);
}
*buf++ = 'e';
@@ -11954,6 +14860,8 @@ format. Returns an iterator pointing past-the-end of the decimal representation.
@note The result is NOT null-terminated.
*/
template <typename FloatType>
+JSON_HEDLEY_NON_NULL(1, 2)
+JSON_HEDLEY_RETURNS_NON_NULL
char* to_chars(char* first, const char* last, FloatType value)
{
static_cast<void>(last); // maybe unused - fix warning
@@ -12038,6 +14946,7 @@ class serializer
using number_float_t = typename BasicJsonType::number_float_t;
using number_integer_t = typename BasicJsonType::number_integer_t;
using number_unsigned_t = typename BasicJsonType::number_unsigned_t;
+ using binary_char_t = typename BasicJsonType::binary_t::value_type;
static constexpr std::uint8_t UTF8_ACCEPT = 0;
static constexpr std::uint8_t UTF8_REJECT = 1;
@@ -12076,13 +14985,19 @@ class serializer
- strings and object keys are escaped using `escape_string()`
- integer numbers are converted implicitly via `operator<<`
- floating-point numbers are converted to a string using `"%g"` format
+ - binary values are serialized as objects containing the subtype and the
+ byte array
- @param[in] val value to serialize
- @param[in] pretty_print whether the output shall be pretty-printed
- @param[in] indent_step the indent level
- @param[in] current_indent the current indent level (only used internally)
+ @param[in] val value to serialize
+ @param[in] pretty_print whether the output shall be pretty-printed
+ @param[in] ensure_ascii If @a ensure_ascii is true, all non-ASCII characters
+ in the output are escaped with `\uXXXX` sequences, and the result consists
+ of ASCII characters only.
+ @param[in] indent_step the indent level
+ @param[in] current_indent the current indent level (only used internally)
*/
- void dump(const BasicJsonType& val, const bool pretty_print,
+ void dump(const BasicJsonType& val,
+ const bool pretty_print,
const bool ensure_ascii,
const unsigned int indent_step,
const unsigned int current_indent = 0)
@@ -12103,7 +15018,7 @@ class serializer
// variable to hold indentation for recursive calls
const auto new_indent = current_indent + indent_step;
- if (JSON_UNLIKELY(indent_string.size() < new_indent))
+ if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, ' ');
}
@@ -12176,7 +15091,7 @@ class serializer
// variable to hold indentation for recursive calls
const auto new_indent = current_indent + indent_step;
- if (JSON_UNLIKELY(indent_string.size() < new_indent))
+ if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))
{
indent_string.resize(indent_string.size() * 2, ' ');
}
@@ -12229,6 +15144,79 @@ class serializer
return;
}
+ case value_t::binary:
+ {
+ if (pretty_print)
+ {
+ o->write_characters("{\n", 2);
+
+ // variable to hold indentation for recursive calls
+ const auto new_indent = current_indent + indent_step;
+ if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent))
+ {
+ indent_string.resize(indent_string.size() * 2, ' ');
+ }
+
+ o->write_characters(indent_string.c_str(), new_indent);
+
+ o->write_characters("\"bytes\": [", 10);
+
+ if (not val.m_value.binary->empty())
+ {
+ for (auto i = val.m_value.binary->cbegin();
+ i != val.m_value.binary->cend() - 1; ++i)
+ {
+ dump_integer(*i);
+ o->write_characters(", ", 2);
+ }
+ dump_integer(val.m_value.binary->back());
+ }
+
+ o->write_characters("],\n", 3);
+ o->write_characters(indent_string.c_str(), new_indent);
+
+ o->write_characters("\"subtype\": ", 11);
+ if (val.m_value.binary->has_subtype())
+ {
+ dump_integer(val.m_value.binary->subtype());
+ }
+ else
+ {
+ o->write_characters("null", 4);
+ }
+ o->write_character('\n');
+ o->write_characters(indent_string.c_str(), current_indent);
+ o->write_character('}');
+ }
+ else
+ {
+ o->write_characters("{\"bytes\":[", 10);
+
+ if (not val.m_value.binary->empty())
+ {
+ for (auto i = val.m_value.binary->cbegin();
+ i != val.m_value.binary->cend() - 1; ++i)
+ {
+ dump_integer(*i);
+ o->write_character(',');
+ }
+ dump_integer(val.m_value.binary->back());
+ }
+
+ o->write_characters("],\"subtype\":", 12);
+ if (val.m_value.binary->has_subtype())
+ {
+ dump_integer(val.m_value.binary->subtype());
+ o->write_character('}');
+ }
+ else
+ {
+ o->write_characters("null}", 5);
+ }
+ }
+ return;
+ }
+
case value_t::boolean:
{
if (val.m_value.boolean)
@@ -12491,7 +15479,7 @@ class serializer
}
// we finished processing the string
- if (JSON_LIKELY(state == UTF8_ACCEPT))
+ if (JSON_HEDLEY_LIKELY(state == UTF8_ACCEPT))
{
// write buffer
if (bytes > 0)
@@ -12585,7 +15573,8 @@ class serializer
*/
template<typename NumberType, detail::enable_if_t<
std::is_same<NumberType, number_unsigned_t>::value or
- std::is_same<NumberType, number_integer_t>::value,
+ std::is_same<NumberType, number_integer_t>::value or
+ std::is_same<NumberType, binary_char_t>::value,
int> = 0>
void dump_integer(NumberType x)
{
@@ -12623,7 +15612,7 @@ class serializer
if (is_negative)
{
*buffer_ptr = '-';
- abs_value = static_cast<number_unsigned_t>(std::abs(static_cast<std::intmax_t>(x)));
+ abs_value = remove_sign(static_cast<number_integer_t>(x));
// account one more byte for the minus sign
n_chars = 1 + count_digits(abs_value);
@@ -12800,10 +15789,38 @@ class serializer
? (byte & 0x3fu) | (codep << 6u)
: (0xFFu >> type) & (byte);
- state = utf8d[256u + state * 16u + type];
+ std::size_t index = 256u + static_cast<size_t>(state) * 16u + static_cast<size_t>(type);
+ assert(index < 400);
+ state = utf8d[index];
return state;
}
+ /*
+ * Overload to make the compiler happy while it is instantiating
+ * dump_integer for number_unsigned_t.
+ * Must never be called.
+ */
+ number_unsigned_t remove_sign(number_unsigned_t x)
+ {
+ assert(false); // LCOV_EXCL_LINE
+ return x; // LCOV_EXCL_LINE
+ }
+
+ /*
+ * Helper function for dump_integer
+ *
+ * This function takes a negative signed integer and returns its absolute
+ * value as unsigned integer. The plus/minus shuffling is necessary as we can
+ * not directly remove the sign of an arbitrary signed integer as the
+ * absolute values of INT_MIN and INT_MAX are usually not the same. See
+ * #1708 for details.
+ */
+ inline number_unsigned_t remove_sign(number_integer_t x) noexcept
+ {
+ assert(x < 0 and x < (std::numeric_limits<number_integer_t>::max)());
+ return static_cast<number_unsigned_t>(-(x + 1)) + 1;
+ }
+
private:
/// the output of the serializer
output_adapter_t<char> o = nullptr;
@@ -12862,6 +15879,9 @@ default; will be used in @ref number_integer_t)
`uint64_t` by default; will be used in @ref number_unsigned_t)
@tparam NumberFloatType type for JSON floating-point numbers (`double` by
default; will be used in @ref number_float_t)
+@tparam BinaryType type for packed binary data for compatibility with binary
+serialization formats (`std::vector<std::uint8_t>` by default; will be used in
+@ref binary_t)
@tparam AllocatorType type of the allocator to use (`std::allocator` by
default)
@tparam JSONSerializer the serializer to resolve internal calls to `to_json()`
@@ -12916,7 +15936,7 @@ relationship:
The invariants are checked by member function assert_invariant().
@internal
-@note ObjectType trick from http://stackoverflow.com/a/9860911
+@note ObjectType trick from https://stackoverflow.com/a/9860911
@endinternal
@see [RFC 7159: The JavaScript Object Notation (JSON) Data Interchange
@@ -12932,13 +15952,15 @@ class basic_json
private:
template<detail::value_t> friend struct detail::external_constructor;
friend ::nlohmann::json_pointer<basic_json>;
- friend ::nlohmann::detail::parser<basic_json>;
+
+ template<typename BasicJsonType, typename InputType>
+ friend class ::nlohmann::detail::parser;
friend ::nlohmann::detail::serializer<basic_json>;
template<typename BasicJsonType>
friend class ::nlohmann::detail::iter_impl;
template<typename BasicJsonType, typename CharType>
friend class ::nlohmann::detail::binary_writer;
- template<typename BasicJsonType, typename SAX>
+ template<typename BasicJsonType, typename InputType, typename SAX>
friend class ::nlohmann::detail::binary_reader;
template<typename BasicJsonType>
friend class ::nlohmann::detail::json_sax_dom_parser;
@@ -12949,8 +15971,17 @@ class basic_json
using basic_json_t = NLOHMANN_BASIC_JSON_TPL;
// convenience aliases for types residing in namespace detail;
- using lexer = ::nlohmann::detail::lexer<basic_json>;
- using parser = ::nlohmann::detail::parser<basic_json>;
+ using lexer = ::nlohmann::detail::lexer_base<basic_json>;
+
+ template<typename InputAdapterType>
+ static ::nlohmann::detail::parser<basic_json, InputAdapterType> parser(
+ InputAdapterType adapter,
+ detail::parser_callback_t<basic_json>cb = nullptr,
+ bool allow_exceptions = true
+ )
+ {
+ return ::nlohmann::detail::parser<basic_json, InputAdapterType>(std::move(adapter), std::move(cb), allow_exceptions);
+ }
using primitive_iterator_t = ::nlohmann::detail::primitive_iterator_t;
template<typename BasicJsonType>
@@ -12964,7 +15995,8 @@ class basic_json
template<typename CharType>
using output_adapter_t = ::nlohmann::detail::output_adapter_t<CharType>;
- using binary_reader = ::nlohmann::detail::binary_reader<basic_json>;
+ template<typename InputType>
+ using binary_reader = ::nlohmann::detail::binary_reader<basic_json, InputType>;
template<typename CharType> using binary_writer = ::nlohmann::detail::binary_writer<basic_json, CharType>;
using serializer = ::nlohmann::detail::serializer<basic_json>;
@@ -13084,7 +16116,7 @@ class basic_json
@since 2.1.0
*/
- JSON_NODISCARD
+ JSON_HEDLEY_WARN_UNUSED_RESULT
static basic_json meta()
{
basic_json result;
@@ -13583,12 +16615,83 @@ class basic_json
*/
using number_float_t = NumberFloatType;
+ /*!
+ @brief a type for a packed binary type
+
+ This type is a type designed to carry binary data that appears in various
+ serialized formats, such as CBOR's Major Type 2, MessagePack's bin, and
+ BSON's generic binary subtype. This type is NOT a part of standard JSON and
+ exists solely for compatibility with these binary types. As such, it is
+ simply defined as an ordered sequence of zero or more byte values.
+
+ Additionally, as an implementation detail, the subtype of the binary data is
+ carried around as a `std::uint8_t`, which is compatible with both of the
+ binary data formats that use binary subtyping, (though the specific
+ numbering is incompatible with each other, and it is up to the user to
+ translate between them).
+
+ [CBOR's RFC 7049](https://tools.ietf.org/html/rfc7049) describes this type
+ as:
+ > Major type 2: a byte string. The string's length in bytes is represented
+ > following the rules for positive integers (major type 0).
+
+ [MessagePack's documentation on the bin type
+ family](https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family)
+ describes this type as:
+ > Bin format family stores an byte array in 2, 3, or 5 bytes of extra bytes
+ > in addition to the size of the byte array.
+
+ [BSON's specifications](http://bsonspec.org/spec.html) describe several
+ binary types; however, this type is intended to represent the generic binary
+ type which has the description:
+ > Generic binary subtype - This is the most commonly used binary subtype and
+ > should be the 'default' for drivers and tools.
+
+ None of these impose any limitations on the internal representation other
+ than the basic unit of storage be some type of array whose parts are
+ decomposable into bytes.
+
+ The default representation of this binary format is a
+ `std::vector<std::uint8_t>`, which is a very common way to represent a byte
+ array in modern C++.
+
+ #### Default type
+
+ The default values for @a BinaryType is `std::vector<std::uint8_t>`
+
+ #### Storage
+
+ Binary Arrays are stored as pointers in a @ref basic_json type. That is,
+ for any access to array values, a pointer of the type `binary_t*` must be
+ dereferenced.
+
+ #### Notes on subtypes
+
+ - CBOR
+ - Binary values are represented as byte strings. No subtypes are
+ supported and will be ignored when CBOR is written.
+ - MessagePack
+ - If a subtype is given and the binary array contains exactly 1, 2, 4, 8,
+ or 16 elements, the fixext family (fixext1, fixext2, fixext4, fixext8)
+ is used. For other sizes, the ext family (ext8, ext16, ext32) is used.
+ The subtype is then added as singed 8-bit integer.
+ - If no subtype is given, the bin family (bin8, bin16, bin32) is used.
+ - BSON
+ - If a subtype is given, it is used and added as unsigned 8-bit integer.
+ - If no subtype is given, the generic binary subtype 0x00 is used.
+
+ @sa @ref binary -- create a binary array
+
+ @since version 3.8.0
+ */
+ using binary_t = nlohmann::byte_container_with_subtype<BinaryType>;
/// @}
private:
/// helper for exception-safe object creation
template<typename T, typename... Args>
+ JSON_HEDLEY_RETURNS_NON_NULL
static T* create(Args&& ... args)
{
AllocatorType<T> alloc;
@@ -13624,6 +16727,7 @@ class basic_json
number | number_integer | @ref number_integer_t
number | number_unsigned | @ref number_unsigned_t
number | number_float | @ref number_float_t
+ binary | binary | pointer to @ref binary_t
null | null | *no value is stored*
@note Variable-length types (objects, arrays, and strings) are stored as
@@ -13640,6 +16744,8 @@ class basic_json
array_t* array;
/// string (stored with pointer to save storage)
string_t* string;
+ /// binary (stored with pointer to save storage)
+ binary_t* binary;
/// boolean
boolean_t boolean;
/// number (integer)
@@ -13682,6 +16788,12 @@ class basic_json
break;
}
+ case value_t::binary:
+ {
+ binary = create<binary_t>();
+ break;
+ }
+
case value_t::boolean:
{
boolean = boolean_t(false);
@@ -13715,9 +16827,9 @@ class basic_json
default:
{
object = nullptr; // silence warning, see #821
- if (JSON_UNLIKELY(t == value_t::null))
+ if (JSON_HEDLEY_UNLIKELY(t == value_t::null))
{
- JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.6.1")); // LCOV_EXCL_LINE
+ JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.8.0")); // LCOV_EXCL_LINE
}
break;
}
@@ -13760,8 +16872,79 @@ class basic_json
array = create<array_t>(std::move(value));
}
+ /// constructor for binary arrays
+ json_value(const typename binary_t::container_type& value)
+ {
+ binary = create<binary_t>(value);
+ }
+
+ /// constructor for rvalue binary arrays
+ json_value(typename binary_t::container_type&& value)
+ {
+ binary = create<binary_t>(std::move(value));
+ }
+
+ /// constructor for binary arrays (internal type)
+ json_value(const binary_t& value)
+ {
+ binary = create<binary_t>(value);
+ }
+
+ /// constructor for rvalue binary arrays (internal type)
+ json_value(binary_t&& value)
+ {
+ binary = create<binary_t>(std::move(value));
+ }
+
void destroy(value_t t) noexcept
{
+ // flatten the current json_value to a heap-allocated stack
+ std::vector<basic_json> stack;
+
+ // move the top-level items to stack
+ if (t == value_t::array)
+ {
+ stack.reserve(array->size());
+ std::move(array->begin(), array->end(), std::back_inserter(stack));
+ }
+ else if (t == value_t::object)
+ {
+ stack.reserve(object->size());
+ for (auto&& it : *object)
+ {
+ stack.push_back(std::move(it.second));
+ }
+ }
+
+ while (not stack.empty())
+ {
+ // move the last item to local variable to be processed
+ basic_json current_item(std::move(stack.back()));
+ stack.pop_back();
+
+ // if current_item is array/object, move
+ // its children to the stack to be processed later
+ if (current_item.is_array())
+ {
+ std::move(current_item.m_value.array->begin(), current_item.m_value.array->end(),
+ std::back_inserter(stack));
+
+ current_item.m_value.array->clear();
+ }
+ else if (current_item.is_object())
+ {
+ for (auto&& it : *current_item.m_value.object)
+ {
+ stack.push_back(std::move(it.second));
+ }
+
+ current_item.m_value.object->clear();
+ }
+
+ // it's now safe that current_item get destructed
+ // since it doesn't have any children
+ }
+
switch (t)
{
case value_t::object:
@@ -13788,6 +16971,14 @@ class basic_json
break;
}
+ case value_t::binary:
+ {
+ AllocatorType<binary_t> alloc;
+ std::allocator_traits<decltype(alloc)>::destroy(alloc, binary);
+ std::allocator_traits<decltype(alloc)>::deallocate(alloc, binary, 1);
+ break;
+ }
+
default:
{
break;
@@ -13810,6 +17001,7 @@ class basic_json
assert(m_type != value_t::object or m_value.object != nullptr);
assert(m_type != value_t::array or m_value.array != nullptr);
assert(m_type != value_t::string or m_value.string != nullptr);
+ assert(m_type != value_t::binary or m_value.binary != nullptr);
}
public:
@@ -13832,7 +17024,7 @@ class basic_json
@sa @ref parser_callback_t for more information and examples
*/
- using parse_event_t = typename parser::parse_event_t;
+ using parse_event_t = detail::parse_event_t;
/*!
@brief per-element parser callback type
@@ -13883,7 +17075,7 @@ class basic_json
@since version 1.0.0
*/
- using parser_callback_t = typename parser::parser_callback_t;
+ using parser_callback_t = detail::parser_callback_t<basic_json>;
//////////////////
// constructors //
@@ -13908,6 +17100,7 @@ class basic_json
number | `0`
object | `{}`
array | `[]`
+ binary | empty array
@param[in] v the type of the value to create
@@ -13979,6 +17172,12 @@ class basic_json
@ref number_float_t, and all convertible number types such as `int`,
`size_t`, `int64_t`, `float` or `double` can be used.
- **boolean**: @ref boolean_t / `bool` can be used.
+ - **binary**: @ref binary_t / `std::vector<uint8_t>` may be used,
+ unfortunately because string literals cannot be distinguished from binary
+ character arrays by the C++ type system, all types compatible with `const
+ char*` will be directed to the string constructor instead. This is both
+ for backwards compatibility, and due to the fact that a binary type is not
+ a standard JSON type.
See the examples below.
@@ -14060,6 +17259,7 @@ class basic_json
using other_string_t = typename BasicJsonType::string_t;
using other_object_t = typename BasicJsonType::object_t;
using other_array_t = typename BasicJsonType::array_t;
+ using other_binary_t = typename BasicJsonType::binary_t;
switch (val.type())
{
@@ -14084,6 +17284,9 @@ class basic_json
case value_t::array:
JSONSerializer<other_array_t>::to_json(*this, val.template get_ref<const other_array_t&>());
break;
+ case value_t::binary:
+ JSONSerializer<other_binary_t>::to_json(*this, val.template get_ref<const other_binary_t&>());
+ break;
case value_t::null:
*this = nullptr;
break;
@@ -14192,7 +17395,7 @@ class basic_json
}
// if object is wanted but impossible, throw an exception
- if (JSON_UNLIKELY(manual_type == value_t::object and not is_an_object))
+ if (JSON_HEDLEY_UNLIKELY(manual_type == value_t::object and not is_an_object))
{
JSON_THROW(type_error::create(301, "cannot create object from initializer list"));
}
@@ -14223,6 +17426,99 @@ class basic_json
}
/*!
+ @brief explicitly create a binary array (without subtype)
+
+ Creates a JSON binary array value from a given binary container. Binary
+ values are part of various binary formats, such as CBOR, MessagePack, and
+ BSON. This constructor is used to create a value for serialization to those
+ formats.
+
+ @note Note, this function exists because of the difficulty in correctly
+ specifying the correct template overload in the standard value ctor, as both
+ JSON arrays and JSON binary arrays are backed with some form of a
+ `std::vector`. Because JSON binary arrays are a non-standard extension it
+ was decided that it would be best to prevent automatic initialization of a
+ binary array type, for backwards compatibility and so it does not happen on
+ accident.
+
+ @param[in] init container containing bytes to use as binary type
+
+ @return JSON binary array value
+
+ @complexity Linear in the size of @a init.
+
+ @exceptionsafety Strong guarantee: if an exception is thrown, there are no
+ changes to any JSON value.
+
+ @since version 3.8.0
+ */
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ static basic_json binary(const typename binary_t::container_type& init)
+ {
+ auto res = basic_json();
+ res.m_type = value_t::binary;
+ res.m_value = init;
+ return res;
+ }
+
+ /*!
+ @brief explicitly create a binary array (with subtype)
+
+ Creates a JSON binary array value from a given binary container. Binary
+ values are part of various binary formats, such as CBOR, MessagePack, and
+ BSON. This constructor is used to create a value for serialization to those
+ formats.
+
+ @note Note, this function exists because of the difficulty in correctly
+ specifying the correct template overload in the standard value ctor, as both
+ JSON arrays and JSON binary arrays are backed with some form of a
+ `std::vector`. Because JSON binary arrays are a non-standard extension it
+ was decided that it would be best to prevent automatic initialization of a
+ binary array type, for backwards compatibility and so it does not happen on
+ accident.
+
+ @param[in] init container containing bytes to use as binary type
+ @param[in] subtype subtype to use in MessagePack and BSON
+
+ @return JSON binary array value
+
+ @complexity Linear in the size of @a init.
+
+ @exceptionsafety Strong guarantee: if an exception is thrown, there are no
+ changes to any JSON value.
+
+ @since version 3.8.0
+ */
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ static basic_json binary(const typename binary_t::container_type& init, std::uint8_t subtype)
+ {
+ auto res = basic_json();
+ res.m_type = value_t::binary;
+ res.m_value = binary_t(init, subtype);
+ return res;
+ }
+
+ /// @copydoc binary(const typename binary_t::container_type&)
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ static basic_json binary(typename binary_t::container_type&& init)
+ {
+ auto res = basic_json();
+ res.m_type = value_t::binary;
+ res.m_value = std::move(init);
+ return res;
+ }
+
+ /// @copydoc binary(const typename binary_t::container_type&, std::uint8_t)
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ static basic_json binary(typename binary_t::container_type&& init, std::uint8_t subtype)
+ {
+ auto res = basic_json();
+ res.m_type = value_t::binary;
+ res.m_value = binary_t(std::move(init), subtype);
+ return res;
+ }
+
+ /*!
@brief explicitly create an array from an initializer list
Creates a JSON array value from a given initializer list. That is, given a
@@ -14259,7 +17555,7 @@ class basic_json
@since version 1.0.0
*/
- JSON_NODISCARD
+ JSON_HEDLEY_WARN_UNUSED_RESULT
static basic_json array(initializer_list_t init = {})
{
return basic_json(init, false, value_t::array);
@@ -14303,7 +17599,7 @@ class basic_json
@since version 1.0.0
*/
- JSON_NODISCARD
+ JSON_HEDLEY_WARN_UNUSED_RESULT
static basic_json object(initializer_list_t init = {})
{
return basic_json(init, false, value_t::object);
@@ -14402,7 +17698,7 @@ class basic_json
assert(last.m_object != nullptr);
// make sure iterator fits the current value
- if (JSON_UNLIKELY(first.m_object != last.m_object))
+ if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))
{
JSON_THROW(invalid_iterator::create(201, "iterators are not compatible"));
}
@@ -14419,8 +17715,8 @@ class basic_json
case value_t::number_unsigned:
case value_t::string:
{
- if (JSON_UNLIKELY(not first.m_it.primitive_iterator.is_begin()
- or not last.m_it.primitive_iterator.is_end()))
+ if (JSON_HEDLEY_UNLIKELY(not first.m_it.primitive_iterator.is_begin()
+ or not last.m_it.primitive_iterator.is_end()))
{
JSON_THROW(invalid_iterator::create(204, "iterators out of range"));
}
@@ -14477,6 +17773,12 @@ class basic_json
break;
}
+ case value_t::binary:
+ {
+ m_value = *first.m_object->m_value.binary;
+ break;
+ }
+
default:
JSON_THROW(invalid_iterator::create(206, "cannot construct with iterators from " +
std::string(first.m_object->type_name())));
@@ -14490,10 +17792,10 @@ class basic_json
// other constructors and destructor //
///////////////////////////////////////
- /// @private
- basic_json(const detail::json_ref<basic_json>& ref)
- : basic_json(ref.moved_or_copied())
- {}
+ template <typename JsonRef,
+ detail::enable_if_t<detail::conjunction<detail::is_json_ref<JsonRef>,
+ std::is_same<typename JsonRef::value_type, basic_json>>::value, int> = 0 >
+ basic_json(const JsonRef& ref) : basic_json(ref.moved_or_copied()) {}
/*!
@brief copy constructor
@@ -14570,6 +17872,12 @@ class basic_json
break;
}
+ case value_t::binary:
+ {
+ m_value = *other.m_value.binary;
+ break;
+ }
+
default:
break;
}
@@ -14714,7 +18022,11 @@ class basic_json
@return string containing the serialization of the JSON value
@throw type_error.316 if a string stored inside the JSON value is not
- UTF-8 encoded
+ UTF-8 encoded and @a error_handler is set to strict
+
+ @note Binary values are serialized as object containing two keys:
+ - "bytes": an array of bytes as integers
+ - "subtype": the subtype as integer or "null" if the binary has no subtype
@complexity Linear.
@@ -14729,7 +18041,8 @@ class basic_json
@since version 1.0.0; indentation character @a indent_char, option
@a ensure_ascii and exceptions added in version 3.0.0; error
- handlers added in version 3.4.0.
+ handlers added in version 3.4.0; serialization of binary values added
+ in version 3.8.0.
*/
string_t dump(const int indent = -1,
const char indent_char = ' ',
@@ -14768,6 +18081,7 @@ class basic_json
number (floating-point) | value_t::number_float
object | value_t::object
array | value_t::array
+ binary | value_t::binary
discarded | value_t::discarded
@complexity Constant.
@@ -14810,12 +18124,13 @@ class basic_json
@sa @ref is_string() -- returns whether JSON value is a string
@sa @ref is_boolean() -- returns whether JSON value is a boolean
@sa @ref is_number() -- returns whether JSON value is a number
+ @sa @ref is_binary() -- returns whether JSON value is a binary array
@since version 1.0.0
*/
constexpr bool is_primitive() const noexcept
{
- return is_null() or is_string() or is_boolean() or is_number();
+ return is_null() or is_string() or is_boolean() or is_number() or is_binary();
}
/*!
@@ -15071,6 +18386,28 @@ class basic_json
}
/*!
+ @brief return whether value is a binary array
+
+ This function returns true if and only if the JSON value is a binary array.
+
+ @return `true` if type is binary array, `false` otherwise.
+
+ @complexity Constant.
+
+ @exceptionsafety No-throw guarantee: this member function never throws
+ exceptions.
+
+ @liveexample{The following code exemplifies `is_binary()` for all JSON
+ types.,is_binary}
+
+ @since version 3.8.0
+ */
+ constexpr bool is_binary() const noexcept
+ {
+ return m_type == value_t::binary;
+ }
+
+ /*!
@brief return whether value is discarded
This function returns true if and only if the JSON value was discarded
@@ -15133,7 +18470,7 @@ class basic_json
/// get a boolean (explicit)
boolean_t get_impl(boolean_t* /*unused*/) const
{
- if (JSON_LIKELY(is_boolean()))
+ if (JSON_HEDLEY_LIKELY(is_boolean()))
{
return m_value.boolean;
}
@@ -15225,6 +18562,18 @@ class basic_json
return is_number_float() ? &m_value.number_float : nullptr;
}
+ /// get a pointer to the value (binary)
+ binary_t* get_impl_ptr(binary_t* /*unused*/) noexcept
+ {
+ return is_binary() ? m_value.binary : nullptr;
+ }
+
+ /// get a pointer to the value (binary)
+ constexpr const binary_t* get_impl_ptr(const binary_t* /*unused*/) const noexcept
+ {
+ return is_binary() ? m_value.binary : nullptr;
+ }
+
/*!
@brief helper function to implement get_ref()
@@ -15242,7 +18591,7 @@ class basic_json
// delegate the call to get_ptr<>()
auto ptr = obj.template get_ptr<typename std::add_pointer<ReferenceType>::type>();
- if (JSON_LIKELY(ptr != nullptr))
+ if (JSON_HEDLEY_LIKELY(ptr != nullptr))
{
return *ptr;
}
@@ -15397,11 +18746,11 @@ class basic_json
detail::has_non_default_from_json<basic_json_t, ValueType>::value,
int> = 0>
ValueType get() const noexcept(noexcept(
- JSONSerializer<ValueTypeCV>::from_json(std::declval<const basic_json_t&>())))
+ JSONSerializer<ValueType>::from_json(std::declval<const basic_json_t&>())))
{
static_assert(not std::is_reference<ValueTypeCV>::value,
"get() cannot be used with reference types, you might want to use get_ref()");
- return JSONSerializer<ValueTypeCV>::from_json(*this);
+ return JSONSerializer<ValueType>::from_json(*this);
}
/*!
@@ -15449,6 +18798,19 @@ class basic_json
return v;
}
+ template <
+ typename T, std::size_t N,
+ typename Array = T (&)[N],
+ detail::enable_if_t <
+ detail::has_from_json<basic_json_t, Array>::value, int > = 0 >
+ Array get_to(T (&v)[N]) const
+ noexcept(noexcept(JSONSerializer<Array>::from_json(
+ std::declval<const basic_json_t&>(), v)))
+ {
+ JSONSerializer<Array>::from_json(*this, v);
+ return v;
+ }
+
/*!
@brief get a pointer value (implicit)
@@ -15625,13 +18987,10 @@ class basic_json
not std::is_same<ValueType, detail::json_ref<basic_json>>::value and
not std::is_same<ValueType, typename string_t::value_type>::value and
not detail::is_basic_json<ValueType>::value
-
-#ifndef _MSC_VER // fix for issue #167 operator<< ambiguity under VS2015
and not std::is_same<ValueType, std::initializer_list<typename string_t::value_type>>::value
-#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) and _MSC_VER <= 1914))
+#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) and _MSC_VER >= 1910 and _MSC_VER <= 1914))
and not std::is_same<ValueType, typename std::string_view>::value
#endif
-#endif
and detail::is_detected<detail::get_template_function, const basic_json_t&, ValueType>::value
, int >::type = 0 >
operator ValueType() const
@@ -15640,6 +18999,36 @@ class basic_json
return get<ValueType>();
}
+ /*!
+ @return reference to the binary value
+
+ @throw type_error.302 if the value is not binary
+
+ @sa @ref is_binary() to check if the value is binary
+
+ @since version 3.8.0
+ */
+ binary_t& get_binary()
+ {
+ if (not is_binary())
+ {
+ JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(type_name())));
+ }
+
+ return *get_ptr<binary_t*>();
+ }
+
+ /// @copydoc get_binary()
+ const binary_t& get_binary() const
+ {
+ if (not is_binary())
+ {
+ JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(type_name())));
+ }
+
+ return *get_ptr<const binary_t*>();
+ }
+
/// @}
@@ -15680,7 +19069,7 @@ class basic_json
reference at(size_type idx)
{
// at only works for arrays
- if (JSON_LIKELY(is_array()))
+ if (JSON_HEDLEY_LIKELY(is_array()))
{
JSON_TRY
{
@@ -15727,7 +19116,7 @@ class basic_json
const_reference at(size_type idx) const
{
// at only works for arrays
- if (JSON_LIKELY(is_array()))
+ if (JSON_HEDLEY_LIKELY(is_array()))
{
JSON_TRY
{
@@ -15778,7 +19167,7 @@ class basic_json
reference at(const typename object_t::key_type& key)
{
// at only works for objects
- if (JSON_LIKELY(is_object()))
+ if (JSON_HEDLEY_LIKELY(is_object()))
{
JSON_TRY
{
@@ -15829,7 +19218,7 @@ class basic_json
const_reference at(const typename object_t::key_type& key) const
{
// at only works for objects
- if (JSON_LIKELY(is_object()))
+ if (JSON_HEDLEY_LIKELY(is_object()))
{
JSON_TRY
{
@@ -15883,7 +19272,7 @@ class basic_json
}
// operator[] only works for arrays
- if (JSON_LIKELY(is_array()))
+ if (JSON_HEDLEY_LIKELY(is_array()))
{
// fill up array with null values if given idx is outside range
if (idx >= m_value.array->size())
@@ -15921,7 +19310,7 @@ class basic_json
const_reference operator[](size_type idx) const
{
// const operator[] only works for arrays
- if (JSON_LIKELY(is_array()))
+ if (JSON_HEDLEY_LIKELY(is_array()))
{
return m_value.array->operator[](idx);
}
@@ -15967,7 +19356,7 @@ class basic_json
}
// operator[] only works for objects
- if (JSON_LIKELY(is_object()))
+ if (JSON_HEDLEY_LIKELY(is_object()))
{
return m_value.object->operator[](key);
}
@@ -16008,7 +19397,7 @@ class basic_json
const_reference operator[](const typename object_t::key_type& key) const
{
// const operator[] only works for objects
- if (JSON_LIKELY(is_object()))
+ if (JSON_HEDLEY_LIKELY(is_object()))
{
assert(m_value.object->find(key) != m_value.object->end());
return m_value.object->find(key)->second;
@@ -16045,6 +19434,7 @@ class basic_json
@since version 1.1.0
*/
template<typename T>
+ JSON_HEDLEY_NON_NULL(2)
reference operator[](T* key)
{
// implicitly convert null to object
@@ -16056,7 +19446,7 @@ class basic_json
}
// at only works for objects
- if (JSON_LIKELY(is_object()))
+ if (JSON_HEDLEY_LIKELY(is_object()))
{
return m_value.object->operator[](key);
}
@@ -16095,10 +19485,11 @@ class basic_json
@since version 1.1.0
*/
template<typename T>
+ JSON_HEDLEY_NON_NULL(2)
const_reference operator[](T* key) const
{
// at only works for objects
- if (JSON_LIKELY(is_object()))
+ if (JSON_HEDLEY_LIKELY(is_object()))
{
assert(m_value.object->find(key) != m_value.object->end());
return m_value.object->find(key)->second;
@@ -16140,6 +19531,8 @@ class basic_json
@return copy of the element at key @a key or @a default_value if @a key
is not found
+ @throw type_error.302 if @a default_value does not match the type of the
+ value at @a key
@throw type_error.306 if the JSON value is not an object; in that case,
using `value()` with a key makes no sense.
@@ -16156,11 +19549,12 @@ class basic_json
@since version 1.0.0
*/
template<class ValueType, typename std::enable_if<
- std::is_convertible<basic_json_t, ValueType>::value, int>::type = 0>
+ std::is_convertible<basic_json_t, ValueType>::value
+ and not std::is_same<value_t, ValueType>::value, int>::type = 0>
ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const
{
// at only works for objects
- if (JSON_LIKELY(is_object()))
+ if (JSON_HEDLEY_LIKELY(is_object()))
{
// if key is found, return value and given default value otherwise
const auto it = find(key);
@@ -16213,6 +19607,8 @@ class basic_json
@return copy of the element at key @a key or @a default_value if @a key
is not found
+ @throw type_error.302 if @a default_value does not match the type of the
+ value at @a ptr
@throw type_error.306 if the JSON value is not an object; in that case,
using `value()` with a key makes no sense.
@@ -16230,7 +19626,7 @@ class basic_json
ValueType value(const json_pointer& ptr, const ValueType& default_value) const
{
// at only works for objects
- if (JSON_LIKELY(is_object()))
+ if (JSON_HEDLEY_LIKELY(is_object()))
{
// if pointer resolves a value, return it or use default value
JSON_TRY
@@ -16250,6 +19646,7 @@ class basic_json
@brief overload for a default value of type const char*
@copydoc basic_json::value(const json_pointer&, ValueType) const
*/
+ JSON_HEDLEY_NON_NULL(3)
string_t value(const json_pointer& ptr, const char* default_value) const
{
return value(ptr, string_t(default_value));
@@ -16262,8 +19659,8 @@ class basic_json
container `c`, the expression `c.front()` is equivalent to `*c.begin()`.
@return In case of a structured type (array or object), a reference to the
- first element is returned. In case of number, string, or boolean values, a
- reference to the value is returned.
+ first element is returned. In case of number, string, boolean, or binary
+ values, a reference to the value is returned.
@complexity Constant.
@@ -16305,8 +19702,8 @@ class basic_json
@endcode
@return In case of a structured type (array or object), a reference to the
- last element is returned. In case of number, string, or boolean values, a
- reference to the value is returned.
+ last element is returned. In case of number, string, boolean, or binary
+ values, a reference to the value is returned.
@complexity Constant.
@@ -16372,7 +19769,7 @@ class basic_json
@complexity The complexity depends on the type:
- objects: amortized constant
- arrays: linear in distance between @a pos and the end of the container
- - strings: linear in the length of the string
+ - strings and binary: linear in the length of the member
- other types: constant
@liveexample{The example shows the result of `erase()` for different JSON
@@ -16394,7 +19791,7 @@ class basic_json
IteratorType erase(IteratorType pos)
{
// make sure iterator fits the current value
- if (JSON_UNLIKELY(this != pos.m_object))
+ if (JSON_HEDLEY_UNLIKELY(this != pos.m_object))
{
JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value"));
}
@@ -16408,8 +19805,9 @@ class basic_json
case value_t::number_integer:
case value_t::number_unsigned:
case value_t::string:
+ case value_t::binary:
{
- if (JSON_UNLIKELY(not pos.m_it.primitive_iterator.is_begin()))
+ if (JSON_HEDLEY_UNLIKELY(not pos.m_it.primitive_iterator.is_begin()))
{
JSON_THROW(invalid_iterator::create(205, "iterator out of range"));
}
@@ -16421,6 +19819,13 @@ class basic_json
std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.string, 1);
m_value.string = nullptr;
}
+ else if (is_binary())
+ {
+ AllocatorType<binary_t> alloc;
+ std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.binary);
+ std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.binary, 1);
+ m_value.binary = nullptr;
+ }
m_type = value_t::null;
assert_invariant();
@@ -16478,7 +19883,7 @@ class basic_json
- objects: `log(size()) + std::distance(first, last)`
- arrays: linear in the distance between @a first and @a last, plus linear
in the distance between @a last and end of the container
- - strings: linear in the length of the string
+ - strings and binary: linear in the length of the member
- other types: constant
@liveexample{The example shows the result of `erase()` for different JSON
@@ -16499,7 +19904,7 @@ class basic_json
IteratorType erase(IteratorType first, IteratorType last)
{
// make sure iterator fits the current value
- if (JSON_UNLIKELY(this != first.m_object or this != last.m_object))
+ if (JSON_HEDLEY_UNLIKELY(this != first.m_object or this != last.m_object))
{
JSON_THROW(invalid_iterator::create(203, "iterators do not fit current value"));
}
@@ -16513,9 +19918,10 @@ class basic_json
case value_t::number_integer:
case value_t::number_unsigned:
case value_t::string:
+ case value_t::binary:
{
- if (JSON_LIKELY(not first.m_it.primitive_iterator.is_begin()
- or not last.m_it.primitive_iterator.is_end()))
+ if (JSON_HEDLEY_LIKELY(not first.m_it.primitive_iterator.is_begin()
+ or not last.m_it.primitive_iterator.is_end()))
{
JSON_THROW(invalid_iterator::create(204, "iterators out of range"));
}
@@ -16527,6 +19933,13 @@ class basic_json
std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.string, 1);
m_value.string = nullptr;
}
+ else if (is_binary())
+ {
+ AllocatorType<binary_t> alloc;
+ std::allocator_traits<decltype(alloc)>::destroy(alloc, m_value.binary);
+ std::allocator_traits<decltype(alloc)>::deallocate(alloc, m_value.binary, 1);
+ m_value.binary = nullptr;
+ }
m_type = value_t::null;
assert_invariant();
@@ -16586,7 +19999,7 @@ class basic_json
size_type erase(const typename object_t::key_type& key)
{
// this erase only works for objects
- if (JSON_LIKELY(is_object()))
+ if (JSON_HEDLEY_LIKELY(is_object()))
{
return m_value.object->erase(key);
}
@@ -16621,9 +20034,9 @@ class basic_json
void erase(const size_type idx)
{
// this erase only works for arrays
- if (JSON_LIKELY(is_array()))
+ if (JSON_HEDLEY_LIKELY(is_array()))
{
- if (JSON_UNLIKELY(idx >= size()))
+ if (JSON_HEDLEY_UNLIKELY(idx >= size()))
{
JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range"));
}
@@ -16749,15 +20162,48 @@ class basic_json
@liveexample{The following code shows an example for `contains()`.,contains}
@sa @ref find(KeyT&&) -- returns an iterator to an object element
+ @sa @ref contains(const json_pointer&) const -- checks the existence for a JSON pointer
@since version 3.6.0
*/
- template<typename KeyT>
- bool contains(KeyT&& key) const
+ template<typename KeyT, typename std::enable_if<
+ not std::is_same<typename std::decay<KeyT>::type, json_pointer>::value, int>::type = 0>
+ bool contains(KeyT && key) const
{
return is_object() and m_value.object->find(std::forward<KeyT>(key)) != m_value.object->end();
}
+ /*!
+ @brief check the existence of an element in a JSON object given a JSON pointer
+
+ Check whether the given JSON pointer @a ptr can be resolved in the current
+ JSON value.
+
+ @note This method can be executed on any JSON value type.
+
+ @param[in] ptr JSON pointer to check its existence.
+
+ @return true if the JSON pointer can be resolved to a stored value, false
+ otherwise.
+
+ @post If `j.contains(ptr)` returns true, it is safe to call `j[ptr]`.
+
+ @throw parse_error.106 if an array index begins with '0'
+ @throw parse_error.109 if an array index was not a number
+
+ @complexity Logarithmic in the size of the JSON object.
+
+ @liveexample{The following code shows an example for `contains()`.,contains_json_pointer}
+
+ @sa @ref contains(KeyT &&) const -- checks the existence of a key
+
+ @since version 3.7.0
+ */
+ bool contains(const json_pointer& ptr) const
+ {
+ return ptr.contains(this);
+ }
+
/// @}
@@ -17099,7 +20545,7 @@ class basic_json
future 4.0.0 of the library. Please use @ref items() instead;
that is, replace `json::iterator_wrapper(j)` with `j.items()`.
*/
- JSON_DEPRECATED
+ JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items())
static iteration_proxy<iterator> iterator_wrapper(reference ref) noexcept
{
return ref.items();
@@ -17108,7 +20554,7 @@ class basic_json
/*!
@copydoc iterator_wrapper(reference)
*/
- JSON_DEPRECATED
+ JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items())
static iteration_proxy<const_iterator> iterator_wrapper(const_reference ref) noexcept
{
return ref.items();
@@ -17165,6 +20611,11 @@ class basic_json
element as string (see example). For primitive types (e.g., numbers),
`key()` returns an empty string.
+ @warning Using `items()` on temporary objects is dangerous. Make sure the
+ object's lifetime exeeds the iteration. See
+ <https://github.com/nlohmann/json/issues/2040> for more
+ information.
+
@return iteration proxy object wrapping @a ref with an interface to use in
range-based for loops
@@ -17213,6 +20664,7 @@ class basic_json
boolean | `false`
string | `false`
number | `false`
+ binary | `false`
object | result of function `object_t::empty()`
array | result of function `array_t::empty()`
@@ -17284,6 +20736,7 @@ class basic_json
boolean | `1`
string | `1`
number | `1`
+ binary | `1`
object | result of function object_t::size()
array | result of function array_t::size()
@@ -17358,6 +20811,7 @@ class basic_json
boolean | `1` (same as `size()`)
string | `1` (same as `size()`)
number | `1` (same as `size()`)
+ binary | `1` (same as `size()`)
object | result of function `object_t::max_size()`
array | result of function `array_t::max_size()`
@@ -17430,6 +20884,7 @@ class basic_json
boolean | `false`
string | `""`
number | `0`
+ binary | An empty byte vector
object | `{}`
array | `[]`
@@ -17487,6 +20942,12 @@ class basic_json
break;
}
+ case value_t::binary:
+ {
+ m_value.binary->clear();
+ break;
+ }
+
case value_t::array:
{
m_value.array->clear();
@@ -17527,7 +20988,7 @@ class basic_json
void push_back(basic_json&& val)
{
// push_back only works for null objects or arrays
- if (JSON_UNLIKELY(not(is_null() or is_array())))
+ if (JSON_HEDLEY_UNLIKELY(not(is_null() or is_array())))
{
JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name())));
}
@@ -17542,9 +21003,7 @@ class basic_json
// add element to array (move semantics)
m_value.array->push_back(std::move(val));
- // invalidate object: mark it null so we do not call the destructor
- // cppcheck-suppress accessMoved
- val.m_type = value_t::null;
+ // if val is moved from, basic_json move constructor marks it null so we do not call the destructor
}
/*!
@@ -17564,7 +21023,7 @@ class basic_json
void push_back(const basic_json& val)
{
// push_back only works for null objects or arrays
- if (JSON_UNLIKELY(not(is_null() or is_array())))
+ if (JSON_HEDLEY_UNLIKELY(not(is_null() or is_array())))
{
JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name())));
}
@@ -17614,7 +21073,7 @@ class basic_json
void push_back(const typename object_t::value_type& val)
{
// push_back only works for null objects or objects
- if (JSON_UNLIKELY(not(is_null() or is_object())))
+ if (JSON_HEDLEY_UNLIKELY(not(is_null() or is_object())))
{
JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name())));
}
@@ -17700,6 +21159,8 @@ class basic_json
@param[in] args arguments to forward to a constructor of @ref basic_json
@tparam Args compatible types to create a @ref basic_json object
+ @return reference to the inserted element
+
@throw type_error.311 when called on a type other than JSON array or
null; example: `"cannot use emplace_back() with number"`
@@ -17709,13 +21170,13 @@ class basic_json
elements to a JSON array. Note how the `null` value was silently converted
to a JSON array.,emplace_back}
- @since version 2.0.8
+ @since version 2.0.8, returns reference since 3.7.0
*/
template<class... Args>
- void emplace_back(Args&& ... args)
+ reference emplace_back(Args&& ... args)
{
// emplace_back only works for null objects or arrays
- if (JSON_UNLIKELY(not(is_null() or is_array())))
+ if (JSON_HEDLEY_UNLIKELY(not(is_null() or is_array())))
{
JSON_THROW(type_error::create(311, "cannot use emplace_back() with " + std::string(type_name())));
}
@@ -17729,7 +21190,12 @@ class basic_json
}
// add element to array (perfect forwarding)
+#ifdef JSON_HAS_CPP_17
+ return m_value.array->emplace_back(std::forward<Args>(args)...);
+#else
m_value.array->emplace_back(std::forward<Args>(args)...);
+ return m_value.array->back();
+#endif
}
/*!
@@ -17763,7 +21229,7 @@ class basic_json
std::pair<iterator, bool> emplace(Args&& ... args)
{
// emplace only works for null objects or arrays
- if (JSON_UNLIKELY(not(is_null() or is_object())))
+ if (JSON_HEDLEY_UNLIKELY(not(is_null() or is_object())))
{
JSON_THROW(type_error::create(311, "cannot use emplace() with " + std::string(type_name())));
}
@@ -17831,10 +21297,10 @@ class basic_json
iterator insert(const_iterator pos, const basic_json& val)
{
// insert only works for arrays
- if (JSON_LIKELY(is_array()))
+ if (JSON_HEDLEY_LIKELY(is_array()))
{
// check if iterator pos fits to this JSON value
- if (JSON_UNLIKELY(pos.m_object != this))
+ if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))
{
JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value"));
}
@@ -17882,10 +21348,10 @@ class basic_json
iterator insert(const_iterator pos, size_type cnt, const basic_json& val)
{
// insert only works for arrays
- if (JSON_LIKELY(is_array()))
+ if (JSON_HEDLEY_LIKELY(is_array()))
{
// check if iterator pos fits to this JSON value
- if (JSON_UNLIKELY(pos.m_object != this))
+ if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))
{
JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value"));
}
@@ -17930,24 +21396,24 @@ class basic_json
iterator insert(const_iterator pos, const_iterator first, const_iterator last)
{
// insert only works for arrays
- if (JSON_UNLIKELY(not is_array()))
+ if (JSON_HEDLEY_UNLIKELY(not is_array()))
{
JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name())));
}
// check if iterator pos fits to this JSON value
- if (JSON_UNLIKELY(pos.m_object != this))
+ if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))
{
JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value"));
}
// check if range iterators belong to the same JSON object
- if (JSON_UNLIKELY(first.m_object != last.m_object))
+ if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))
{
JSON_THROW(invalid_iterator::create(210, "iterators do not fit"));
}
- if (JSON_UNLIKELY(first.m_object == this))
+ if (JSON_HEDLEY_UNLIKELY(first.m_object == this))
{
JSON_THROW(invalid_iterator::create(211, "passed iterators may not belong to container"));
}
@@ -17983,13 +21449,13 @@ class basic_json
iterator insert(const_iterator pos, initializer_list_t ilist)
{
// insert only works for arrays
- if (JSON_UNLIKELY(not is_array()))
+ if (JSON_HEDLEY_UNLIKELY(not is_array()))
{
JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name())));
}
// check if iterator pos fits to this JSON value
- if (JSON_UNLIKELY(pos.m_object != this))
+ if (JSON_HEDLEY_UNLIKELY(pos.m_object != this))
{
JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value"));
}
@@ -18024,19 +21490,19 @@ class basic_json
void insert(const_iterator first, const_iterator last)
{
// insert only works for objects
- if (JSON_UNLIKELY(not is_object()))
+ if (JSON_HEDLEY_UNLIKELY(not is_object()))
{
JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name())));
}
// check if range iterators belong to the same JSON object
- if (JSON_UNLIKELY(first.m_object != last.m_object))
+ if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))
{
JSON_THROW(invalid_iterator::create(210, "iterators do not fit"));
}
// passed iterators must belong to objects
- if (JSON_UNLIKELY(not first.m_object->is_object()))
+ if (JSON_HEDLEY_UNLIKELY(not first.m_object->is_object()))
{
JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects"));
}
@@ -18073,11 +21539,11 @@ class basic_json
assert_invariant();
}
- if (JSON_UNLIKELY(not is_object()))
+ if (JSON_HEDLEY_UNLIKELY(not is_object()))
{
JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(type_name())));
}
- if (JSON_UNLIKELY(not j.is_object()))
+ if (JSON_HEDLEY_UNLIKELY(not j.is_object()))
{
JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(j.type_name())));
}
@@ -18124,20 +21590,20 @@ class basic_json
assert_invariant();
}
- if (JSON_UNLIKELY(not is_object()))
+ if (JSON_HEDLEY_UNLIKELY(not is_object()))
{
JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(type_name())));
}
// check if range iterators belong to the same JSON object
- if (JSON_UNLIKELY(first.m_object != last.m_object))
+ if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object))
{
JSON_THROW(invalid_iterator::create(210, "iterators do not fit"));
}
// passed iterators must belong to objects
- if (JSON_UNLIKELY(not first.m_object->is_object()
- or not last.m_object->is_object()))
+ if (JSON_HEDLEY_UNLIKELY(not first.m_object->is_object()
+ or not last.m_object->is_object()))
{
JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects"));
}
@@ -18200,7 +21666,7 @@ class basic_json
void swap(array_t& other)
{
// swap only works for arrays
- if (JSON_LIKELY(is_array()))
+ if (JSON_HEDLEY_LIKELY(is_array()))
{
std::swap(*(m_value.array), other);
}
@@ -18233,7 +21699,7 @@ class basic_json
void swap(object_t& other)
{
// swap only works for objects
- if (JSON_LIKELY(is_object()))
+ if (JSON_HEDLEY_LIKELY(is_object()))
{
std::swap(*(m_value.object), other);
}
@@ -18266,7 +21732,7 @@ class basic_json
void swap(string_t& other)
{
// swap only works for strings
- if (JSON_LIKELY(is_string()))
+ if (JSON_HEDLEY_LIKELY(is_string()))
{
std::swap(*(m_value.string), other);
}
@@ -18276,6 +21742,53 @@ class basic_json
}
}
+ /*!
+ @brief exchanges the values
+
+ Exchanges the contents of a JSON string with those of @a other. Does not
+ invoke any move, copy, or swap operations on individual elements. All
+ iterators and references remain valid. The past-the-end iterator is
+ invalidated.
+
+ @param[in,out] other binary to exchange the contents with
+
+ @throw type_error.310 when JSON value is not a string; example: `"cannot
+ use swap() with boolean"`
+
+ @complexity Constant.
+
+ @liveexample{The example below shows how strings can be swapped with
+ `swap()`.,swap__binary_t}
+
+ @since version 3.8.0
+ */
+ void swap(binary_t& other)
+ {
+ // swap only works for strings
+ if (JSON_HEDLEY_LIKELY(is_binary()))
+ {
+ std::swap(*(m_value.binary), other);
+ }
+ else
+ {
+ JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name())));
+ }
+ }
+
+ /// @copydoc swap(binary_t)
+ void swap(typename binary_t::container_type& other)
+ {
+ // swap only works for strings
+ if (JSON_HEDLEY_LIKELY(is_binary()))
+ {
+ std::swap(*(m_value.binary), other);
+ }
+ else
+ {
+ JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name())));
+ }
+ }
+
/// @}
public:
@@ -18294,13 +21807,13 @@ class basic_json
their stored values are the same according to their respective
`operator==`.
- Integer and floating-point numbers are automatically converted before
- comparison. Note than two NaN values are always treated as unequal.
+ comparison. Note that two NaN values are always treated as unequal.
- Two JSON null values are equal.
@note Floating-point inside JSON values numbers are compared with
`json::number_float_t::operator==` which is `double::operator==` by
default. To compare floating-point while respecting an epsilon, an alternative
- [comparison function](https://github.com/mariokonrad/marnav/blob/master/src/marnav/math/floatingpoint.hpp#L34-#L39)
+ [comparison function](https://github.com/mariokonrad/marnav/blob/master/include/marnav/math/floatingpoint.hpp#L34-#L39)
could be used, for instance
@code {.cpp}
template<typename T, typename = typename std::enable_if<std::is_floating_point<T>::value, T>::type>
@@ -18309,6 +21822,22 @@ class basic_json
return std::abs(a - b) <= epsilon;
}
@endcode
+ Or you can self-defined operator equal function like this:
+ @code {.cpp}
+ bool my_equal(const_reference lhs, const_reference rhs) {
+ const auto lhs_type lhs.type();
+ const auto rhs_type rhs.type();
+ if (lhs_type == rhs_type) {
+ switch(lhs_type)
+ // self_defined case
+ case value_t::number_float:
+ return std::abs(lhs - rhs) <= std::numeric_limits<float>::epsilon();
+ // other cases remain the same with the original
+ ...
+ }
+ ...
+ }
+ @endcode
@note NaN values never compare equal to themselves or to other NaN values.
@@ -18358,6 +21887,9 @@ class basic_json
case value_t::number_float:
return lhs.m_value.number_float == rhs.m_value.number_float;
+ case value_t::binary:
+ return *lhs.m_value.binary == *rhs.m_value.binary;
+
default:
return false;
}
@@ -18498,25 +22030,28 @@ class basic_json
return (*lhs.m_value.array) < (*rhs.m_value.array);
case value_t::object:
- return *lhs.m_value.object < *rhs.m_value.object;
+ return (*lhs.m_value.object) < (*rhs.m_value.object);
case value_t::null:
return false;
case value_t::string:
- return *lhs.m_value.string < *rhs.m_value.string;
+ return (*lhs.m_value.string) < (*rhs.m_value.string);
case value_t::boolean:
- return lhs.m_value.boolean < rhs.m_value.boolean;
+ return (lhs.m_value.boolean) < (rhs.m_value.boolean);
case value_t::number_integer:
- return lhs.m_value.number_integer < rhs.m_value.number_integer;
+ return (lhs.m_value.number_integer) < (rhs.m_value.number_integer);
case value_t::number_unsigned:
- return lhs.m_value.number_unsigned < rhs.m_value.number_unsigned;
+ return (lhs.m_value.number_unsigned) < (rhs.m_value.number_unsigned);
case value_t::number_float:
- return lhs.m_value.number_float < rhs.m_value.number_float;
+ return (lhs.m_value.number_float) < (rhs.m_value.number_float);
+
+ case value_t::binary:
+ return (*lhs.m_value.binary) < (*rhs.m_value.binary);
default:
return false;
@@ -18776,7 +22311,7 @@ class basic_json
instead; that is, replace calls like `j >> o;` with `o << j;`.
@since version 1.0.0; deprecated since version 3.0.0
*/
- JSON_DEPRECATED
+ JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator<<(std::ostream&, const basic_json&))
friend std::ostream& operator>>(const basic_json& j, std::ostream& o)
{
return o << j;
@@ -18795,29 +22330,13 @@ class basic_json
/*!
@brief deserialize from a compatible input
- This function reads from a compatible input. Examples are:
- - an array of 1-byte values
- - strings with character/literal type with size of 1 byte
- - input streams
- - container with contiguous storage of 1-byte values. Compatible container
- types include `std::vector`, `std::string`, `std::array`,
- `std::valarray`, and `std::initializer_list`. Furthermore, C-style
- arrays can be used with `std::begin()`/`std::end()`. User-defined
- containers can be used as long as they implement random-access iterators
- and a contiguous storage.
-
- @pre Each element of the container has a size of 1 byte. Violating this
- precondition yields undefined behavior. **This precondition is enforced
- with a static assertion.**
-
- @pre The container storage is contiguous. Violating this precondition
- yields undefined behavior. **This precondition is enforced with an
- assertion.**
-
- @warning There is no way to enforce all preconditions at compile-time. If
- the function is called with a noncompliant container and with
- assertions switched off, the behavior is undefined and will most
- likely yield segmentation violation.
+ @tparam InputType A compatible input, for instance
+ - an std::istream object
+ - a FILE pointer
+ - a C-style array of characters
+ - a pointer to a null-terminated string of single byte characters
+ - an object obj for which begin(obj) and end(obj) produces a valid pair of
+ iterators.
@param[in] i input to read from
@param[in] cb a parser callback function of type @ref parser_callback_t
@@ -18837,7 +22356,7 @@ class basic_json
@complexity Linear in the length of the input. The parser is a predictive
LL(1) parser. The complexity can be higher if the parser callback function
- @a cb has a super-linear complexity.
+ @a cb or reading from the input @a i has a super-linear complexity.
@note A UTF-8 byte order mark is silently ignored.
@@ -18855,19 +22374,107 @@ class basic_json
@since version 2.0.3 (contiguous containers)
*/
- JSON_NODISCARD
- static basic_json parse(detail::input_adapter&& i,
+ template<typename InputType>
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ static basic_json parse(InputType&& i,
+ const parser_callback_t cb = nullptr,
+ const bool allow_exceptions = true)
+ {
+ basic_json result;
+ parser(detail::input_adapter(std::forward<InputType>(i)), cb, allow_exceptions).parse(true, result);
+ return result;
+ }
+
+ /*!
+ @brief deserialize from a pair of character iterators
+
+ The value_type of the iterator must be a integral type with size of 1, 2 or
+ 4 bytes, which will be interpreted respectively as UTF-8, UTF-16 and UTF-32.
+
+ @param[in] first iterator to start of character range
+ @param[in] last iterator to end of character range
+ @param[in] cb a parser callback function of type @ref parser_callback_t
+ which is used to control the deserialization by filtering unwanted values
+ (optional)
+ @param[in] allow_exceptions whether to throw exceptions in case of a
+ parse error (optional, true by default)
+
+ @return deserialized JSON value; in case of a parse error and
+ @a allow_exceptions set to `false`, the return value will be
+ value_t::discarded.
+
+ @throw parse_error.101 if a parse error occurs; example: `""unexpected end
+ of input; expected string literal""`
+ @throw parse_error.102 if to_unicode fails or surrogate error
+ @throw parse_error.103 if to_unicode fails
+ */
+ template<typename IteratorType>
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ static basic_json parse(IteratorType first,
+ IteratorType last,
const parser_callback_t cb = nullptr,
const bool allow_exceptions = true)
{
basic_json result;
- parser(i, cb, allow_exceptions).parse(true, result);
+ parser(detail::input_adapter(std::move(first), std::move(last)), cb, allow_exceptions).parse(true, result);
return result;
}
- static bool accept(detail::input_adapter&& i)
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ JSON_HEDLEY_DEPRECATED_FOR(3.8.0, parse(ptr, ptr + len))
+ static basic_json parse(detail::span_input_adapter&& i,
+ const parser_callback_t cb = nullptr,
+ const bool allow_exceptions = true)
{
- return parser(i).accept(true);
+ basic_json result;
+ parser(i.get(), cb, allow_exceptions).parse(true, result);
+ return result;
+ }
+
+ /*!
+ @brief check if the input is valid JSON
+
+ Unlike the @ref parse(InputType&&, const parser_callback_t,const bool)
+ function, this function neither throws an exception in case of invalid JSON
+ input (i.e., a parse error) nor creates diagnostic information.
+
+ @tparam InputType A compatible input, for instance
+ - an std::istream object
+ - a FILE pointer
+ - a C-style array of characters
+ - a pointer to a null-terminated string of single byte characters
+ - an object obj for which begin(obj) and end(obj) produces a valid pair of
+ iterators.
+
+ @param[in] i input to read from
+
+ @return Whether the input read from @a i is valid JSON.
+
+ @complexity Linear in the length of the input. The parser is a predictive
+ LL(1) parser.
+
+ @note A UTF-8 byte order mark is silently ignored.
+
+ @liveexample{The example below demonstrates the `accept()` function reading
+ from a string.,accept__string}
+ */
+ template<typename InputType>
+ static bool accept(InputType&& i)
+ {
+ return parser(detail::input_adapter(std::forward<InputType>(i))).accept(true);
+ }
+
+ template<typename IteratorType>
+ static bool accept(IteratorType first, IteratorType last)
+ {
+ return parser(detail::input_adapter(std::move(first), std::move(last))).accept(true);
+ }
+
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ JSON_HEDLEY_DEPRECATED_FOR(3.8.0, accept(ptr, ptr + len))
+ static bool accept(detail::span_input_adapter&& i)
+ {
+ return parser(i.get()).accept(true);
}
/*!
@@ -18876,28 +22483,12 @@ class basic_json
The SAX event lister must follow the interface of @ref json_sax.
This function reads from a compatible input. Examples are:
- - an array of 1-byte values
- - strings with character/literal type with size of 1 byte
- - input streams
- - container with contiguous storage of 1-byte values. Compatible container
- types include `std::vector`, `std::string`, `std::array`,
- `std::valarray`, and `std::initializer_list`. Furthermore, C-style
- arrays can be used with `std::begin()`/`std::end()`. User-defined
- containers can be used as long as they implement random-access iterators
- and a contiguous storage.
-
- @pre Each element of the container has a size of 1 byte. Violating this
- precondition yields undefined behavior. **This precondition is enforced
- with a static assertion.**
-
- @pre The container storage is contiguous. Violating this precondition
- yields undefined behavior. **This precondition is enforced with an
- assertion.**
-
- @warning There is no way to enforce all preconditions at compile-time. If
- the function is called with a noncompliant container and with
- assertions switched off, the behavior is undefined and will most
- likely yield segmentation violation.
+ - an std::istream object
+ - a FILE pointer
+ - a C-style array of characters
+ - a pointer to a null-terminated string of single byte characters
+ - an object obj for which begin(obj) and end(obj) produces a valid pair of
+ iterators.
@param[in] i input to read from
@param[in,out] sax SAX event listener
@@ -18923,95 +22514,41 @@ class basic_json
@since version 3.2.0
*/
- template <typename SAX>
- static bool sax_parse(detail::input_adapter&& i, SAX* sax,
+ template <typename InputType, typename SAX>
+ JSON_HEDLEY_NON_NULL(2)
+ static bool sax_parse(InputType&& i, SAX* sax,
input_format_t format = input_format_t::json,
const bool strict = true)
{
- assert(sax);
+ auto ia = detail::input_adapter(std::forward<InputType>(i));
return format == input_format_t::json
- ? parser(std::move(i)).sax_parse(sax, strict)
- : detail::binary_reader<basic_json, SAX>(std::move(i)).sax_parse(format, sax, strict);
- }
-
- /*!
- @brief deserialize from an iterator range with contiguous storage
-
- This function reads from an iterator range of a container with contiguous
- storage of 1-byte values. Compatible container types include
- `std::vector`, `std::string`, `std::array`, `std::valarray`, and
- `std::initializer_list`. Furthermore, C-style arrays can be used with
- `std::begin()`/`std::end()`. User-defined containers can be used as long
- as they implement random-access iterators and a contiguous storage.
-
- @pre The iterator range is contiguous. Violating this precondition yields
- undefined behavior. **This precondition is enforced with an assertion.**
- @pre Each element in the range has a size of 1 byte. Violating this
- precondition yields undefined behavior. **This precondition is enforced
- with a static assertion.**
-
- @warning There is no way to enforce all preconditions at compile-time. If
- the function is called with noncompliant iterators and with
- assertions switched off, the behavior is undefined and will most
- likely yield segmentation violation.
-
- @tparam IteratorType iterator of container with contiguous storage
- @param[in] first begin of the range to parse (included)
- @param[in] last end of the range to parse (excluded)
- @param[in] cb a parser callback function of type @ref parser_callback_t
- which is used to control the deserialization by filtering unwanted values
- (optional)
- @param[in] allow_exceptions whether to throw exceptions in case of a
- parse error (optional, true by default)
-
- @return deserialized JSON value; in case of a parse error and
- @a allow_exceptions set to `false`, the return value will be
- value_t::discarded.
-
- @throw parse_error.101 in case of an unexpected token
- @throw parse_error.102 if to_unicode fails or surrogate error
- @throw parse_error.103 if to_unicode fails
-
- @complexity Linear in the length of the input. The parser is a predictive
- LL(1) parser. The complexity can be higher if the parser callback function
- @a cb has a super-linear complexity.
-
- @note A UTF-8 byte order mark is silently ignored.
-
- @liveexample{The example below demonstrates the `parse()` function reading
- from an iterator range.,parse__iteratortype__parser_callback_t}
-
- @since version 2.0.3
- */
- template<class IteratorType, typename std::enable_if<
- std::is_base_of<
- std::random_access_iterator_tag,
- typename std::iterator_traits<IteratorType>::iterator_category>::value, int>::type = 0>
- static basic_json parse(IteratorType first, IteratorType last,
- const parser_callback_t cb = nullptr,
- const bool allow_exceptions = true)
- {
- basic_json result;
- parser(detail::input_adapter(first, last), cb, allow_exceptions).parse(true, result);
- return result;
+ ? parser(std::move(ia)).sax_parse(sax, strict)
+ : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia)).sax_parse(format, sax, strict);
}
- template<class IteratorType, typename std::enable_if<
- std::is_base_of<
- std::random_access_iterator_tag,
- typename std::iterator_traits<IteratorType>::iterator_category>::value, int>::type = 0>
- static bool accept(IteratorType first, IteratorType last)
+ template<class IteratorType, class SAX>
+ JSON_HEDLEY_NON_NULL(3)
+ static bool sax_parse(IteratorType first, IteratorType last, SAX* sax,
+ input_format_t format = input_format_t::json,
+ const bool strict = true)
{
- return parser(detail::input_adapter(first, last)).accept(true);
+ auto ia = detail::input_adapter(std::move(first), std::move(last));
+ return format == input_format_t::json
+ ? parser(std::move(ia)).sax_parse(sax, strict)
+ : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia)).sax_parse(format, sax, strict);
}
- template<class IteratorType, class SAX, typename std::enable_if<
- std::is_base_of<
- std::random_access_iterator_tag,
- typename std::iterator_traits<IteratorType>::iterator_category>::value, int>::type = 0>
- static bool sax_parse(IteratorType first, IteratorType last, SAX* sax)
+ template <typename SAX>
+ JSON_HEDLEY_DEPRECATED_FOR(3.8.0, sax_parse(ptr, ptr + len, ...))
+ JSON_HEDLEY_NON_NULL(2)
+ static bool sax_parse(detail::span_input_adapter&& i, SAX* sax,
+ input_format_t format = input_format_t::json,
+ const bool strict = true)
{
- return parser(detail::input_adapter(first, last)).sax_parse(sax);
+ auto ia = i.get();
+ return format == input_format_t::json
+ ? parser(std::move(ia)).sax_parse(sax, strict)
+ : detail::binary_reader<basic_json, decltype(ia), SAX>(std::move(ia)).sax_parse(format, sax, strict);
}
/*!
@@ -19022,7 +22559,7 @@ class basic_json
instead; that is, replace calls like `j << i;` with `i >> j;`.
@since version 1.0.0; deprecated since version 3.0.0
*/
- JSON_DEPRECATED
+ JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator>>(std::istream&, basic_json&))
friend std::istream& operator<<(basic_json& j, std::istream& i)
{
return operator>>(i, j);
@@ -19080,6 +22617,7 @@ class basic_json
number | `"number"` (for all number types)
object | `"object"`
array | `"array"`
+ binary | `"binary"`
discarded | `"discarded"`
@exceptionsafety No-throw guarantee: this function never throws exceptions.
@@ -19095,6 +22633,7 @@ class basic_json
@since version 1.0.0, public since 2.1.0, `const char*` and `noexcept`
since 3.0.0
*/
+ JSON_HEDLEY_RETURNS_NON_NULL
const char* type_name() const noexcept
{
{
@@ -19110,6 +22649,8 @@ class basic_json
return "string";
case value_t::boolean:
return "boolean";
+ case value_t::binary:
+ return "binary";
case value_t::discarded:
return "discarded";
default:
@@ -19169,7 +22710,8 @@ class basic_json
number_unsigned | 256..65535 | Unsigned integer (2 bytes follow) | 0x19
number_unsigned | 65536..4294967295 | Unsigned integer (4 bytes follow) | 0x1A
number_unsigned | 4294967296..18446744073709551615 | Unsigned integer (8 bytes follow) | 0x1B
- number_float | *any value* | Double-Precision Float | 0xFB
+ number_float | *any value representable by a float* | Single-Precision Float | 0xFA
+ number_float | *any value NOT representable by a float* | Double-Precision Float | 0xFB
string | *length*: 0..23 | UTF-8 string | 0x60..0x77
string | *length*: 23..255 | UTF-8 string (1 byte follow) | 0x78
string | *length*: 256..65535 | UTF-8 string (2 bytes follow) | 0x79
@@ -19185,6 +22727,11 @@ class basic_json
object | *size*: 256..65535 | map (2 bytes follow) | 0xB9
object | *size*: 65536..4294967295 | map (4 bytes follow) | 0xBA
object | *size*: 4294967296..18446744073709551615 | map (8 bytes follow) | 0xBB
+ binary | *size*: 0..23 | byte string | 0x40..0x57
+ binary | *size*: 23..255 | byte string (1 byte follow) | 0x58
+ binary | *size*: 256..65535 | byte string (2 bytes follow) | 0x59
+ binary | *size*: 65536..4294967295 | byte string (4 bytes follow) | 0x5A
+ binary | *size*: 4294967296..18446744073709551615 | byte string (8 bytes follow) | 0x5B
@note The mapping is **complete** in the sense that any JSON value type
can be converted to a CBOR value.
@@ -19194,10 +22741,10 @@ class basic_json
function which serializes NaN or Infinity to `null`.
@note The following CBOR types are not used in the conversion:
- - byte strings (0x40..0x5F)
- UTF-8 strings terminated by "break" (0x7F)
- arrays terminated by "break" (0x9F)
- maps terminated by "break" (0xBF)
+ - byte strings terminated by "break" (0x5F)
- date/time (0xC0..0xC1)
- bignum (0xC2..0xC3)
- decimal fraction (0xC4)
@@ -19206,11 +22753,11 @@ class basic_json
- expected conversions (0xD5..0xD7)
- simple values (0xE0..0xF3, 0xF8)
- undefined (0xF7)
- - half and single-precision floats (0xF9-0xFA)
+ - half-precision floats (0xF9)
- break (0xFF)
@param[in] j JSON value to serialize
- @return MessagePack serialization as byte vector
+ @return CBOR serialization as byte vector
@complexity Linear in the size of the JSON value @a j.
@@ -19224,7 +22771,8 @@ class basic_json
@sa @ref to_ubjson(const basic_json&, const bool, const bool) for the
related UBJSON format
- @since version 2.0.9
+ @since version 2.0.9; compact representation of floating-point numbers
+ since version 3.8.0
*/
static std::vector<uint8_t> to_cbor(const basic_json& j)
{
@@ -19284,20 +22832,21 @@ class basic_json
object | *size*: 0..15 | fix map | 0x80..0x8F
object | *size*: 16..65535 | map 16 | 0xDE
object | *size*: 65536..4294967295 | map 32 | 0xDF
+ binary | *size*: 0..255 | bin 8 | 0xC4
+ binary | *size*: 256..65535 | bin 16 | 0xC5
+ binary | *size*: 65536..4294967295 | bin 32 | 0xC6
@note The mapping is **complete** in the sense that any JSON value type
can be converted to a MessagePack value.
@note The following values can **not** be converted to a MessagePack value:
- strings with more than 4294967295 bytes
+ - byte strings with more than 4294967295 bytes
- arrays with more than 4294967295 elements
- objects with more than 4294967295 elements
@note The following MessagePack types are not used in the conversion:
- - bin 8 - bin 32 (0xC4..0xC6)
- - ext 8 - ext 32 (0xC7..0xC9)
- float 32 (0xCA)
- - fixext 1 - fixext 16 (0xD4..0xD8)
@note Any MessagePack output created @ref to_msgpack can be successfully
parsed by @ref from_msgpack.
@@ -19400,6 +22949,12 @@ class basic_json
the benefit of this parameter is that the receiving side is
immediately informed on the number of elements of the container.
+ @note If the JSON data contains the binary type, the value stored is a list
+ of integers, as suggested by the UBJSON documentation. In particular,
+ this means that serialization and the deserialization of a JSON
+ containing binary values into UBJSON and back will result in a
+ different JSON object.
+
@param[in] j JSON value to serialize
@param[in] use_size whether to add size annotations to container types
@param[in] use_type whether to add type annotations to container types
@@ -19464,6 +23019,7 @@ class basic_json
string | *any value* | string | 0x02
array | *any value* | document | 0x04
object | *any value* | document | 0x03
+ binary | *any value* | binary | 0x05
@warning The mapping is **incomplete**, since only JSON-objects (and things
contained therein) can be serialized to BSON.
@@ -19545,7 +23101,11 @@ class basic_json
Negative integer | number_integer | 0x39
Negative integer | number_integer | 0x3A
Negative integer | number_integer | 0x3B
- Negative integer | number_integer | 0x40..0x57
+ Byte string | binary | 0x40..0x57
+ Byte string | binary | 0x58
+ Byte string | binary | 0x59
+ Byte string | binary | 0x5A
+ Byte string | binary | 0x5B
UTF-8 string | string | 0x60..0x77
UTF-8 string | string | 0x78
UTF-8 string | string | 0x79
@@ -19574,7 +23134,6 @@ class basic_json
@warning The mapping is **incomplete** in the sense that not all CBOR
types can be converted to a JSON value. The following CBOR types
are not supported and will yield parse errors (parse_error.112):
- - byte strings (0x40..0x5F)
- date/time (0xC0..0xC1)
- bignum (0xC2..0xC3)
- decimal fraction (0xC4)
@@ -19624,30 +23183,56 @@ class basic_json
@a strict parameter since 3.0.0; added @a allow_exceptions parameter
since 3.2.0
*/
- JSON_NODISCARD
- static basic_json from_cbor(detail::input_adapter&& i,
+ template<typename InputType>
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ static basic_json from_cbor(InputType&& i,
const bool strict = true,
const bool allow_exceptions = true)
{
basic_json result;
detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- const bool res = binary_reader(detail::input_adapter(i)).sax_parse(input_format_t::cbor, &sdp, strict);
+ auto ia = detail::input_adapter(std::forward<InputType>(i));
+ const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict);
return res ? result : basic_json(value_t::discarded);
}
/*!
@copydoc from_cbor(detail::input_adapter&&, const bool, const bool)
*/
- template<typename A1, typename A2,
- detail::enable_if_t<std::is_constructible<detail::input_adapter, A1, A2>::value, int> = 0>
- JSON_NODISCARD
- static basic_json from_cbor(A1 && a1, A2 && a2,
+ template<typename IteratorType>
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ static basic_json from_cbor(IteratorType first, IteratorType last,
const bool strict = true,
const bool allow_exceptions = true)
{
basic_json result;
detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- const bool res = binary_reader(detail::input_adapter(std::forward<A1>(a1), std::forward<A2>(a2))).sax_parse(input_format_t::cbor, &sdp, strict);
+ auto ia = detail::input_adapter(std::move(first), std::move(last));
+ const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict);
+ return res ? result : basic_json(value_t::discarded);
+ }
+
+ template<typename T>
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len))
+ static basic_json from_cbor(const T* ptr, std::size_t len,
+ const bool strict = true,
+ const bool allow_exceptions = true)
+ {
+ return from_cbor(ptr, ptr + len, strict, allow_exceptions);
+ }
+
+
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len))
+ static basic_json from_cbor(detail::span_input_adapter&& i,
+ const bool strict = true,
+ const bool allow_exceptions = true)
+ {
+ basic_json result;
+ detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
+ auto ia = i.get();
+ const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict);
return res ? result : basic_json(value_t::discarded);
}
@@ -19685,15 +23270,19 @@ class basic_json
array 32 | array | 0xDD
map 16 | object | 0xDE
map 32 | object | 0xDF
+ bin 8 | binary | 0xC4
+ bin 16 | binary | 0xC5
+ bin 32 | binary | 0xC6
+ ext 8 | binary | 0xC7
+ ext 16 | binary | 0xC8
+ ext 32 | binary | 0xC9
+ fixext 1 | binary | 0xD4
+ fixext 2 | binary | 0xD5
+ fixext 4 | binary | 0xD6
+ fixext 8 | binary | 0xD7
+ fixext 16 | binary | 0xD8
negative fixint | number_integer | 0xE0-0xFF
- @warning The mapping is **incomplete** in the sense that not all
- MessagePack types can be converted to a JSON value. The following
- MessagePack types are not supported and will yield parse errors:
- - bin 8 - bin 32 (0xC4..0xC6)
- - ext 8 - ext 32 (0xC7..0xC9)
- - fixext 1 - fixext 16 (0xD4..0xD8)
-
@note Any MessagePack output created @ref to_msgpack can be successfully
parsed by @ref from_msgpack.
@@ -19733,33 +23322,60 @@ class basic_json
@a strict parameter since 3.0.0; added @a allow_exceptions parameter
since 3.2.0
*/
- JSON_NODISCARD
- static basic_json from_msgpack(detail::input_adapter&& i,
+ template<typename InputType>
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ static basic_json from_msgpack(InputType&& i,
const bool strict = true,
const bool allow_exceptions = true)
{
basic_json result;
detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- const bool res = binary_reader(detail::input_adapter(i)).sax_parse(input_format_t::msgpack, &sdp, strict);
+ auto ia = detail::input_adapter(std::forward<InputType>(i));
+ const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict);
return res ? result : basic_json(value_t::discarded);
}
/*!
@copydoc from_msgpack(detail::input_adapter&&, const bool, const bool)
*/
- template<typename A1, typename A2,
- detail::enable_if_t<std::is_constructible<detail::input_adapter, A1, A2>::value, int> = 0>
- JSON_NODISCARD
- static basic_json from_msgpack(A1 && a1, A2 && a2,
+ template<typename IteratorType>
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ static basic_json from_msgpack(IteratorType first, IteratorType last,
const bool strict = true,
const bool allow_exceptions = true)
{
basic_json result;
detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- const bool res = binary_reader(detail::input_adapter(std::forward<A1>(a1), std::forward<A2>(a2))).sax_parse(input_format_t::msgpack, &sdp, strict);
+ auto ia = detail::input_adapter(std::move(first), std::move(last));
+ const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict);
return res ? result : basic_json(value_t::discarded);
}
+
+ template<typename T>
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len))
+ static basic_json from_msgpack(const T* ptr, std::size_t len,
+ const bool strict = true,
+ const bool allow_exceptions = true)
+ {
+ return from_msgpack(ptr, ptr + len, strict, allow_exceptions);
+ }
+
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len))
+ static basic_json from_msgpack(detail::span_input_adapter&& i,
+ const bool strict = true,
+ const bool allow_exceptions = true)
+ {
+ basic_json result;
+ detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
+ auto ia = i.get();
+ const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict);
+ return res ? result : basic_json(value_t::discarded);
+ }
+
+
/*!
@brief create a JSON value from an input in UBJSON format
@@ -19821,33 +23437,59 @@ class basic_json
@since version 3.1.0; added @a allow_exceptions parameter since 3.2.0
*/
- JSON_NODISCARD
- static basic_json from_ubjson(detail::input_adapter&& i,
+ template<typename InputType>
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ static basic_json from_ubjson(InputType&& i,
const bool strict = true,
const bool allow_exceptions = true)
{
basic_json result;
detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- const bool res = binary_reader(detail::input_adapter(i)).sax_parse(input_format_t::ubjson, &sdp, strict);
+ auto ia = detail::input_adapter(std::forward<InputType>(i));
+ const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict);
return res ? result : basic_json(value_t::discarded);
}
/*!
@copydoc from_ubjson(detail::input_adapter&&, const bool, const bool)
*/
- template<typename A1, typename A2,
- detail::enable_if_t<std::is_constructible<detail::input_adapter, A1, A2>::value, int> = 0>
- JSON_NODISCARD
- static basic_json from_ubjson(A1 && a1, A2 && a2,
+ template<typename IteratorType>
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ static basic_json from_ubjson(IteratorType first, IteratorType last,
const bool strict = true,
const bool allow_exceptions = true)
{
basic_json result;
detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- const bool res = binary_reader(detail::input_adapter(std::forward<A1>(a1), std::forward<A2>(a2))).sax_parse(input_format_t::ubjson, &sdp, strict);
+ auto ia = detail::input_adapter(std::move(first), std::move(last));
+ const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict);
return res ? result : basic_json(value_t::discarded);
}
+ template<typename T>
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len))
+ static basic_json from_ubjson(const T* ptr, std::size_t len,
+ const bool strict = true,
+ const bool allow_exceptions = true)
+ {
+ return from_ubjson(ptr, ptr + len, strict, allow_exceptions);
+ }
+
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len))
+ static basic_json from_ubjson(detail::span_input_adapter&& i,
+ const bool strict = true,
+ const bool allow_exceptions = true)
+ {
+ basic_json result;
+ detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
+ auto ia = i.get();
+ const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict);
+ return res ? result : basic_json(value_t::discarded);
+ }
+
+
/*!
@brief Create a JSON value from an input in BSON format
@@ -19908,35 +23550,57 @@ class basic_json
@sa @ref from_ubjson(detail::input_adapter&&, const bool, const bool) for the
related UBJSON format
*/
- JSON_NODISCARD
- static basic_json from_bson(detail::input_adapter&& i,
+ template<typename InputType>
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ static basic_json from_bson(InputType&& i,
const bool strict = true,
const bool allow_exceptions = true)
{
basic_json result;
detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- const bool res = binary_reader(detail::input_adapter(i)).sax_parse(input_format_t::bson, &sdp, strict);
+ auto ia = detail::input_adapter(std::forward<InputType>(i));
+ const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict);
return res ? result : basic_json(value_t::discarded);
}
/*!
@copydoc from_bson(detail::input_adapter&&, const bool, const bool)
*/
- template<typename A1, typename A2,
- detail::enable_if_t<std::is_constructible<detail::input_adapter, A1, A2>::value, int> = 0>
- JSON_NODISCARD
- static basic_json from_bson(A1 && a1, A2 && a2,
+ template<typename IteratorType>
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ static basic_json from_bson(IteratorType first, IteratorType last,
const bool strict = true,
const bool allow_exceptions = true)
{
basic_json result;
detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
- const bool res = binary_reader(detail::input_adapter(std::forward<A1>(a1), std::forward<A2>(a2))).sax_parse(input_format_t::bson, &sdp, strict);
+ auto ia = detail::input_adapter(std::move(first), std::move(last));
+ const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict);
return res ? result : basic_json(value_t::discarded);
}
+ template<typename T>
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len))
+ static basic_json from_bson(const T* ptr, std::size_t len,
+ const bool strict = true,
+ const bool allow_exceptions = true)
+ {
+ return from_bson(ptr, ptr + len, strict, allow_exceptions);
+ }
-
+ JSON_HEDLEY_WARN_UNUSED_RESULT
+ JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len))
+ static basic_json from_bson(detail::span_input_adapter&& i,
+ const bool strict = true,
+ const bool allow_exceptions = true)
+ {
+ basic_json result;
+ detail::json_sax_dom_parser<basic_json> sdp(result, allow_exceptions);
+ auto ia = i.get();
+ const bool res = binary_reader<decltype(ia)>(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict);
+ return res ? result : basic_json(value_t::discarded);
+ }
/// @}
//////////////////////////
@@ -19989,7 +23653,7 @@ class basic_json
Uses a JSON pointer to retrieve a reference to the respective JSON value.
No bound checking is performed. The function does not change the JSON
- value; no `null` values are created. In particular, the the special value
+ value; no `null` values are created. In particular, the special value
`-` yields an exception.
@param[in] ptr JSON pointer to the desired element
@@ -20298,7 +23962,7 @@ class basic_json
else
{
const auto idx = json_pointer::array_index(last_path);
- if (JSON_UNLIKELY(static_cast<size_type>(idx) > parent.size()))
+ if (JSON_HEDLEY_UNLIKELY(static_cast<size_type>(idx) > parent.size()))
{
// avoid undefined behavior
JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range"));
@@ -20329,7 +23993,7 @@ class basic_json
{
// perform range check
auto it = parent.find(last_path);
- if (JSON_LIKELY(it != parent.end()))
+ if (JSON_HEDLEY_LIKELY(it != parent.end()))
{
parent.erase(it);
}
@@ -20346,7 +24010,7 @@ class basic_json
};
// type check: top level value must be an array
- if (JSON_UNLIKELY(not json_patch.is_array()))
+ if (JSON_HEDLEY_UNLIKELY(not json_patch.is_array()))
{
JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects"));
}
@@ -20366,13 +24030,13 @@ class basic_json
const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'";
// check if desired value is present
- if (JSON_UNLIKELY(it == val.m_value.object->end()))
+ if (JSON_HEDLEY_UNLIKELY(it == val.m_value.object->end()))
{
JSON_THROW(parse_error::create(105, 0, error_msg + " must have member '" + member + "'"));
}
// check if result is of type string
- if (JSON_UNLIKELY(string_type and not it->second.is_string()))
+ if (JSON_HEDLEY_UNLIKELY(string_type and not it->second.is_string()))
{
JSON_THROW(parse_error::create(105, 0, error_msg + " must have string member '" + member + "'"));
}
@@ -20382,7 +24046,7 @@ class basic_json
};
// type check: every element of the array must be an object
- if (JSON_UNLIKELY(not val.is_object()))
+ if (JSON_HEDLEY_UNLIKELY(not val.is_object()))
{
JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects"));
}
@@ -20460,7 +24124,7 @@ class basic_json
}
// throw an exception if test fails
- if (JSON_UNLIKELY(not success))
+ if (JSON_HEDLEY_UNLIKELY(not success))
{
JSON_THROW(other_error::create(501, "unsuccessful: " + val.dump()));
}
@@ -20513,7 +24177,7 @@ class basic_json
@since version 2.0.0
*/
- JSON_NODISCARD
+ JSON_HEDLEY_WARN_UNUSED_RESULT
static basic_json diff(const basic_json& source, const basic_json& target,
const std::string& path = "")
{
@@ -20573,7 +24237,7 @@ class basic_json
result.push_back(
{
{"op", "add"},
- {"path", path + "/" + std::to_string(i)},
+ {"path", path + "/-"},
{"value", target[i]}
});
++i;
@@ -20717,6 +24381,21 @@ class basic_json
/// @}
};
+
+/*!
+@brief user-defined to_string function for JSON values
+
+This function implements a user-defined to_string for JSON objects.
+
+@param[in] j a JSON object
+@return a std::string object
+*/
+
+NLOHMANN_BASIC_JSON_TPL_DECLARATION
+std::string to_string(const NLOHMANN_BASIC_JSON_TPL& j)
+{
+ return j.dump();
+}
} // namespace nlohmann
///////////////////////
@@ -20748,7 +24427,7 @@ struct hash<nlohmann::json>
/// @note: do not remove the space after '<',
/// see https://github.com/nlohmann/json/pull/679
template<>
-struct less< ::nlohmann::detail::value_t>
+struct less<::nlohmann::detail::value_t>
{
/*!
@brief compare two value_t enum values
@@ -20790,6 +24469,7 @@ if no parse error occurred.
@since version 1.0.0
*/
+JSON_HEDLEY_NON_NULL(1)
inline nlohmann::json operator "" _json(const char* s, std::size_t n)
{
return nlohmann::json::parse(s, s + n);
@@ -20808,6 +24488,7 @@ object if no parse error occurred.
@since version 2.0.0
*/
+JSON_HEDLEY_NON_NULL(1)
inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n)
{
return nlohmann::json::json_pointer(std::string(s, n));
@@ -20829,14 +24510,156 @@ inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std
#undef JSON_CATCH
#undef JSON_THROW
#undef JSON_TRY
-#undef JSON_LIKELY
-#undef JSON_UNLIKELY
-#undef JSON_DEPRECATED
-#undef JSON_NODISCARD
#undef JSON_HAS_CPP_14
#undef JSON_HAS_CPP_17
#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION
#undef NLOHMANN_BASIC_JSON_TPL
+// #include <nlohmann/thirdparty/hedley/hedley_undef.hpp>
+#undef JSON_HEDLEY_ALWAYS_INLINE
+#undef JSON_HEDLEY_ARM_VERSION
+#undef JSON_HEDLEY_ARM_VERSION_CHECK
+#undef JSON_HEDLEY_ARRAY_PARAM
+#undef JSON_HEDLEY_ASSUME
+#undef JSON_HEDLEY_BEGIN_C_DECLS
+#undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE
+#undef JSON_HEDLEY_CLANG_HAS_BUILTIN
+#undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE
+#undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE
+#undef JSON_HEDLEY_CLANG_HAS_EXTENSION
+#undef JSON_HEDLEY_CLANG_HAS_FEATURE
+#undef JSON_HEDLEY_CLANG_HAS_WARNING
+#undef JSON_HEDLEY_COMPCERT_VERSION
+#undef JSON_HEDLEY_COMPCERT_VERSION_CHECK
+#undef JSON_HEDLEY_CONCAT
+#undef JSON_HEDLEY_CONCAT3
+#undef JSON_HEDLEY_CONCAT3_EX
+#undef JSON_HEDLEY_CONCAT_EX
+#undef JSON_HEDLEY_CONST
+#undef JSON_HEDLEY_CONSTEXPR
+#undef JSON_HEDLEY_CONST_CAST
+#undef JSON_HEDLEY_CPP_CAST
+#undef JSON_HEDLEY_CRAY_VERSION
+#undef JSON_HEDLEY_CRAY_VERSION_CHECK
+#undef JSON_HEDLEY_C_DECL
+#undef JSON_HEDLEY_DEPRECATED
+#undef JSON_HEDLEY_DEPRECATED_FOR
+#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL
+#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_
+#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
+#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES
+#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS
+#undef JSON_HEDLEY_DIAGNOSTIC_POP
+#undef JSON_HEDLEY_DIAGNOSTIC_PUSH
+#undef JSON_HEDLEY_DMC_VERSION
+#undef JSON_HEDLEY_DMC_VERSION_CHECK
+#undef JSON_HEDLEY_EMPTY_BASES
+#undef JSON_HEDLEY_EMSCRIPTEN_VERSION
+#undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK
+#undef JSON_HEDLEY_END_C_DECLS
+#undef JSON_HEDLEY_FLAGS
+#undef JSON_HEDLEY_FLAGS_CAST
+#undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE
+#undef JSON_HEDLEY_GCC_HAS_BUILTIN
+#undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE
+#undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE
+#undef JSON_HEDLEY_GCC_HAS_EXTENSION
+#undef JSON_HEDLEY_GCC_HAS_FEATURE
+#undef JSON_HEDLEY_GCC_HAS_WARNING
+#undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK
+#undef JSON_HEDLEY_GCC_VERSION
+#undef JSON_HEDLEY_GCC_VERSION_CHECK
+#undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE
+#undef JSON_HEDLEY_GNUC_HAS_BUILTIN
+#undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE
+#undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE
+#undef JSON_HEDLEY_GNUC_HAS_EXTENSION
+#undef JSON_HEDLEY_GNUC_HAS_FEATURE
+#undef JSON_HEDLEY_GNUC_HAS_WARNING
+#undef JSON_HEDLEY_GNUC_VERSION
+#undef JSON_HEDLEY_GNUC_VERSION_CHECK
+#undef JSON_HEDLEY_HAS_ATTRIBUTE
+#undef JSON_HEDLEY_HAS_BUILTIN
+#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE
+#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS
+#undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE
+#undef JSON_HEDLEY_HAS_EXTENSION
+#undef JSON_HEDLEY_HAS_FEATURE
+#undef JSON_HEDLEY_HAS_WARNING
+#undef JSON_HEDLEY_IAR_VERSION
+#undef JSON_HEDLEY_IAR_VERSION_CHECK
+#undef JSON_HEDLEY_IBM_VERSION
+#undef JSON_HEDLEY_IBM_VERSION_CHECK
+#undef JSON_HEDLEY_IMPORT
+#undef JSON_HEDLEY_INLINE
+#undef JSON_HEDLEY_INTEL_VERSION
+#undef JSON_HEDLEY_INTEL_VERSION_CHECK
+#undef JSON_HEDLEY_IS_CONSTANT
+#undef JSON_HEDLEY_IS_CONSTEXPR_
+#undef JSON_HEDLEY_LIKELY
+#undef JSON_HEDLEY_MALLOC
+#undef JSON_HEDLEY_MESSAGE
+#undef JSON_HEDLEY_MSVC_VERSION
+#undef JSON_HEDLEY_MSVC_VERSION_CHECK
+#undef JSON_HEDLEY_NEVER_INLINE
+#undef JSON_HEDLEY_NON_NULL
+#undef JSON_HEDLEY_NO_ESCAPE
+#undef JSON_HEDLEY_NO_RETURN
+#undef JSON_HEDLEY_NO_THROW
+#undef JSON_HEDLEY_NULL
+#undef JSON_HEDLEY_PELLES_VERSION
+#undef JSON_HEDLEY_PELLES_VERSION_CHECK
+#undef JSON_HEDLEY_PGI_VERSION
+#undef JSON_HEDLEY_PGI_VERSION_CHECK
+#undef JSON_HEDLEY_PREDICT
+#undef JSON_HEDLEY_PRINTF_FORMAT
+#undef JSON_HEDLEY_PRIVATE
+#undef JSON_HEDLEY_PUBLIC
+#undef JSON_HEDLEY_PURE
+#undef JSON_HEDLEY_REINTERPRET_CAST
+#undef JSON_HEDLEY_REQUIRE
+#undef JSON_HEDLEY_REQUIRE_CONSTEXPR
+#undef JSON_HEDLEY_REQUIRE_MSG
+#undef JSON_HEDLEY_RESTRICT
+#undef JSON_HEDLEY_RETURNS_NON_NULL
+#undef JSON_HEDLEY_SENTINEL
+#undef JSON_HEDLEY_STATIC_ASSERT
+#undef JSON_HEDLEY_STATIC_CAST
+#undef JSON_HEDLEY_STRINGIFY
+#undef JSON_HEDLEY_STRINGIFY_EX
+#undef JSON_HEDLEY_SUNPRO_VERSION
+#undef JSON_HEDLEY_SUNPRO_VERSION_CHECK
+#undef JSON_HEDLEY_TINYC_VERSION
+#undef JSON_HEDLEY_TINYC_VERSION_CHECK
+#undef JSON_HEDLEY_TI_ARMCL_VERSION
+#undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK
+#undef JSON_HEDLEY_TI_CL2000_VERSION
+#undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK
+#undef JSON_HEDLEY_TI_CL430_VERSION
+#undef JSON_HEDLEY_TI_CL430_VERSION_CHECK
+#undef JSON_HEDLEY_TI_CL6X_VERSION
+#undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK
+#undef JSON_HEDLEY_TI_CL7X_VERSION
+#undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK
+#undef JSON_HEDLEY_TI_CLPRU_VERSION
+#undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK
+#undef JSON_HEDLEY_TI_VERSION
+#undef JSON_HEDLEY_TI_VERSION_CHECK
+#undef JSON_HEDLEY_UNAVAILABLE
+#undef JSON_HEDLEY_UNLIKELY
+#undef JSON_HEDLEY_UNPREDICTABLE
+#undef JSON_HEDLEY_UNREACHABLE
+#undef JSON_HEDLEY_UNREACHABLE_RETURN
+#undef JSON_HEDLEY_VERSION
+#undef JSON_HEDLEY_VERSION_DECODE_MAJOR
+#undef JSON_HEDLEY_VERSION_DECODE_MINOR
+#undef JSON_HEDLEY_VERSION_DECODE_REVISION
+#undef JSON_HEDLEY_VERSION_ENCODE
+#undef JSON_HEDLEY_WARNING
+#undef JSON_HEDLEY_WARN_UNUSED_RESULT
+#undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG
+#undef JSON_HEDLEY_FALL_THROUGH
+
+
#endif // INCLUDE_NLOHMANN_JSON_HPP_