diff --git a/.github/workflows/contracts.yaml b/.github/workflows/contracts.yaml index a885d8631c..c924f6bec1 100644 --- a/.github/workflows/contracts.yaml +++ b/.github/workflows/contracts.yaml @@ -6,10 +6,13 @@ on: - master pull_request: paths: - - "packages/nouns-contracts/**" - - "packages/nouns-subgraph/**" + - 'packages/nouns-contracts/**' + - 'packages/nouns-subgraph/**' branches: - - "**" + - '**' + +env: + NODE_OPTIONS: --max_old_space_size=5120 jobs: build_and_test: @@ -50,4 +53,4 @@ jobs: - name: Run Forge tests run: | cd packages/nouns-contracts - forge test -vvv + forge test -vvv --ffi diff --git a/packages/nouns-assets/images/1-bodies/body-foggrey.png b/packages/nouns-assets/images/1-bodies/body-foggrey.png index f70f41b059..411b454372 100644 Binary files a/packages/nouns-assets/images/1-bodies/body-foggrey.png and b/packages/nouns-assets/images/1-bodies/body-foggrey.png differ diff --git a/packages/nouns-assets/images/3-heads/head-beer.png b/packages/nouns-assets/images/3-heads/head-beer.png index 3cdf8838c5..05e0132feb 100644 Binary files a/packages/nouns-assets/images/3-heads/head-beer.png and b/packages/nouns-assets/images/3-heads/head-beer.png differ diff --git a/packages/nouns-assets/images/3-heads/head-piggybank.png b/packages/nouns-assets/images/3-heads/head-piggybank.png index 5de578c722..b80093337b 100644 Binary files a/packages/nouns-assets/images/3-heads/head-piggybank.png and b/packages/nouns-assets/images/3-heads/head-piggybank.png differ diff --git a/packages/nouns-assets/images/4-glasses/glasses-square-green-blue-multi.png b/packages/nouns-assets/images/4-glasses/glasses-square-green-blue-multi.png index b711361fa3..6352f403ab 100644 Binary files a/packages/nouns-assets/images/4-glasses/glasses-square-green-blue-multi.png and b/packages/nouns-assets/images/4-glasses/glasses-square-green-blue-multi.png differ diff --git a/packages/nouns-assets/images/4-glasses/glasses-square-pink-purple-multi.png b/packages/nouns-assets/images/4-glasses/glasses-square-pink-purple-multi.png index 328964629b..e83cebfbf3 100644 Binary files a/packages/nouns-assets/images/4-glasses/glasses-square-pink-purple-multi.png and b/packages/nouns-assets/images/4-glasses/glasses-square-pink-purple-multi.png differ diff --git a/packages/nouns-assets/images/4-glasses/glasses-square-watermelon.png b/packages/nouns-assets/images/4-glasses/glasses-square-watermelon.png index 5acce275e7..e511ddbd86 100644 Binary files a/packages/nouns-assets/images/4-glasses/glasses-square-watermelon.png and b/packages/nouns-assets/images/4-glasses/glasses-square-watermelon.png differ diff --git a/packages/nouns-assets/images/4-glasses/glasses-square-yellow-orange-multi.png b/packages/nouns-assets/images/4-glasses/glasses-square-yellow-orange-multi.png index 90a2baefb9..04782f5572 100644 Binary files a/packages/nouns-assets/images/4-glasses/glasses-square-yellow-orange-multi.png and b/packages/nouns-assets/images/4-glasses/glasses-square-yellow-orange-multi.png differ diff --git a/packages/nouns-assets/images_test/1-bodies/body-green-reversed.png b/packages/nouns-assets/images_test/1-bodies/body-green-reversed.png new file mode 100644 index 0000000000..d91aed34c1 Binary files /dev/null and b/packages/nouns-assets/images_test/1-bodies/body-green-reversed.png differ diff --git a/packages/nouns-assets/images_test/2-accessories/accessory-txt-dao-black-reversed.png b/packages/nouns-assets/images_test/2-accessories/accessory-txt-dao-black-reversed.png new file mode 100644 index 0000000000..c6a3865a2a Binary files /dev/null and b/packages/nouns-assets/images_test/2-accessories/accessory-txt-dao-black-reversed.png differ diff --git a/packages/nouns-assets/images_test/3-heads/head-thumbsup-reversed.png b/packages/nouns-assets/images_test/3-heads/head-thumbsup-reversed.png new file mode 100644 index 0000000000..c4d58637ad Binary files /dev/null and b/packages/nouns-assets/images_test/3-heads/head-thumbsup-reversed.png differ diff --git a/packages/nouns-assets/images_test/4-glasses/glasses-hip-rose-reversed_reversed.png b/packages/nouns-assets/images_test/4-glasses/glasses-hip-rose-reversed_reversed.png new file mode 100644 index 0000000000..4b5c2328aa Binary files /dev/null and b/packages/nouns-assets/images_test/4-glasses/glasses-hip-rose-reversed_reversed.png differ diff --git a/packages/nouns-assets/images_test/create_duplicates.py b/packages/nouns-assets/images_test/create_duplicates.py new file mode 100644 index 0000000000..9c7f75b603 --- /dev/null +++ b/packages/nouns-assets/images_test/create_duplicates.py @@ -0,0 +1,28 @@ +""" +Copies all the images in the subfolders +This is just used for testing purposes +""" + +import os +import shutil + + +def get_subfolders(directory): + return [f.path for f in os.scandir(directory) if f.is_dir()] + + +def run(): + for folder in get_subfolders('.'): + print(f"Going into {folder}") + f = os.listdir(folder)[0] + print(f"Found {f}, duplicating it") + for i in range(100): + dst_file = f.replace('.png', '_%03d.png' % i) + shutil.copyfile(os.path.join(folder, f), + os.path.join(folder, dst_file)) + + print("Done") + + +if __name__ == "__main__": + run() diff --git a/packages/nouns-assets/package.json b/packages/nouns-assets/package.json index 5427785030..6c4fa6948c 100644 --- a/packages/nouns-assets/package.json +++ b/packages/nouns-assets/package.json @@ -1,6 +1,6 @@ { "name": "@nouns/assets", - "version": "0.2.0", + "version": "0.3.0", "description": "Nouns run-length encoded image data", "author": "Nounders", "homepage": "https://nouns.wtf", @@ -9,13 +9,15 @@ "types": "dist/index.d.ts", "scripts": { "encode": "ts-node scripts/encode.ts", + "encode-more": "ts-node scripts/encode-more.ts", + "append-image-data": "ts-node scripts/append-image-data.ts", "clean": "rimraf dist tsconfig.build.tsbuildinfo", "build": "tsc -p tsconfig.build.json", "prepare": "yarn build", "test": "mocha -r ts-node/register \"test/**/*.test.ts\"" }, "devDependencies": { - "@nouns/sdk": "^0.1.4", + "@nouns/sdk": "^0.2.0", "@types/pngjs": "^6.0.1", "chai": "^4.2.0", "mocha": "^8.4.0", diff --git a/packages/nouns-assets/scripts/append-image-data.ts b/packages/nouns-assets/scripts/append-image-data.ts new file mode 100644 index 0000000000..aba51c2901 --- /dev/null +++ b/packages/nouns-assets/scripts/append-image-data.ts @@ -0,0 +1,20 @@ +import { ImageData } from '@nouns/sdk/src/image/types'; +import { promises as fs } from 'fs'; + +/** + * Appends an image-data.json file to an existing one. + * The purpose is for the webapp to have one file with all the art, not split to pages like in the contracts storage + */ +const merge = async (baseFile: string, newFile: string, destinationFile: string) => { + const baseData: ImageData = JSON.parse((await fs.readFile(baseFile)).toString()); + const newData: ImageData = JSON.parse((await fs.readFile(newFile)).toString()); + + for (const [k, v] of Object.entries(newData.images)) { + baseData.images[k].push(...v); + } + + await fs.writeFile(destinationFile, JSON.stringify(baseData, null, 2)); + console.log(`Wrote merged file to: ${destinationFile}`); +}; + +merge(process.argv[2], process.argv[3], process.argv[4]); diff --git a/packages/nouns-assets/scripts/encode-more.ts b/packages/nouns-assets/scripts/encode-more.ts new file mode 100644 index 0000000000..2e0dd52106 --- /dev/null +++ b/packages/nouns-assets/scripts/encode-more.ts @@ -0,0 +1,37 @@ +import { PNGCollectionEncoder } from '@nouns/sdk'; +import { promises as fs } from 'fs'; +import path from 'path'; +import { readPngImage } from './utils'; +import { palette } from '../src/image-data.json'; + +/** + * @notice creates an additional art json file. it assumes it's not the first one. + * it also assumes the existing palette from the first one has all the needed colors. + * @sourceFolder a folder containing subfolders with the names: ['1-bodies', '2-accessories', '3-heads', '4-glasses'] + * @destinationFilepath where to save the new json file + */ +const encode = async (sourceFolder: string, destinationFilepath: string) => { + const encoder = new PNGCollectionEncoder(palette); + + const partfolders = ['1-bodies', '2-accessories', '3-heads', '4-glasses']; + for (const folder of partfolders) { + const folderpath = path.join(sourceFolder, folder); + const files = await fs.readdir(folderpath); + for (const file of files) { + const image = await readPngImage(path.join(folderpath, file)); + encoder.encodeImage(file.replace(/\.png$/, ''), image, folder.replace(/^\d-/, '')); + } + } + await fs.writeFile( + destinationFilepath, + JSON.stringify( + { + images: encoder.data.images, + }, + null, + 2, + ), + ); +}; + +encode(process.argv[2], process.argv[3]); diff --git a/packages/nouns-assets/scripts/encode.ts b/packages/nouns-assets/scripts/encode.ts index f12dadf311..0bfdf09d04 100644 --- a/packages/nouns-assets/scripts/encode.ts +++ b/packages/nouns-assets/scripts/encode.ts @@ -1,34 +1,10 @@ import { PNGCollectionEncoder, PngImage } from '@nouns/sdk'; import { promises as fs } from 'fs'; -import { PNG } from 'pngjs'; import path from 'path'; +import { readPngImage } from './utils'; const DESTINATION = path.join(__dirname, '../src/image-data.json'); -/** - * Read a PNG image file and return a `PngImage` object. - * @param path The path to the PNG file - */ -const readPngImage = async (path: string): Promise => { - const buffer = await fs.readFile(path); - const png = PNG.sync.read(buffer); - - return { - width: png.width, - height: png.height, - rgbaAt: (x: number, y: number) => { - const idx = (png.width * y + x) << 2; - const [r, g, b, a] = [png.data[idx], png.data[idx + 1], png.data[idx + 2], png.data[idx + 3]]; - return { - r, - g, - b, - a, - }; - }, - }; -}; - const encode = async () => { const encoder = new PNGCollectionEncoder(); diff --git a/packages/nouns-assets/scripts/utils.ts b/packages/nouns-assets/scripts/utils.ts new file mode 100644 index 0000000000..29a936cb54 --- /dev/null +++ b/packages/nouns-assets/scripts/utils.ts @@ -0,0 +1,27 @@ +import { PngImage } from '@nouns/sdk'; +import { promises as fs } from 'fs'; +import { PNG } from 'pngjs'; + +/** + * Read a PNG image file and return a `PngImage` object. + * @param path The path to the PNG file + */ +export const readPngImage = async (path: string): Promise => { + const buffer = await fs.readFile(path); + const png = PNG.sync.read(buffer); + + return { + width: png.width, + height: png.height, + rgbaAt: (x: number, y: number) => { + const idx = (png.width * y + x) << 2; + const [r, g, b, a] = [png.data[idx], png.data[idx + 1], png.data[idx + 2], png.data[idx + 3]]; + return { + r, + g, + b, + a, + }; + }, + }; +}; diff --git a/packages/nouns-assets/src/image-data.json b/packages/nouns-assets/src/image-data.json index a73610fe80..e8ca4a12cc 100644 --- a/packages/nouns-assets/src/image-data.json +++ b/packages/nouns-assets/src/image-data.json @@ -1,9 +1,12 @@ { - "bgcolors": ["d5d7e1", "e1d7d5"], + "bgcolors": [ + "d5d7e1", + "e1d7d5" + ], "palette": [ "", - "ffffff", "c5b9a1", + "ffffff", "cfc2ab", "63a0f9", "807f7e", @@ -11,6 +14,7 @@ "5648ed", "5a423f", "b9185c", + "cbc1bc", "b87b11", "fffdf2", "4b4949", @@ -159,7 +163,6 @@ "42ffb0", "d56333", "b8ced2", - "b91b43", "f39713", "e8e8e2", "ec5b43", @@ -239,412 +242,411 @@ "f8ce47", "395ed1", "ffc5f0", - "cbc1bc", "d4cfc0" ], "images": { "bodies": [ { "filename": "body-bege-bsod", - "data": "0x0015171f090e020e020e020e02020201000b02020201000b02020201000b02020201000b02020201000b02020201000b02020201000b02" + "data": "0x0015171f093a0101000d0101000d0101000d0101000d0101000d0101000d0101000b01" }, { "filename": "body-bege-crt", - "data": "0x0015171f090e030e030e030e03020301000b03020301000b03020301000b03020301000b03020301000b03020301000b03020301000b03" + "data": "0x0015171f093a0301000d0301000d0301000d0301000d0301000d0301000d0301000b03" }, { "filename": "body-blue-sky", - "data": "0x0015171f090e040e040e040e04020401000b04020401000b04020401000b04020401000b04020401000b04020401000b04020401000b04" + "data": "0x0015171f093a0401000d0401000d0401000d0401000d0401000d0401000d0401000b04" }, { "filename": "body-bluegrey", - "data": "0x0015171f090e050e050e050e05020501000b05020501000b05020501000b05020501000b05020501000b05020501000b05020501000b05" + "data": "0x0015171f093a0501000d0501000d0501000d0501000d0501000d0501000d0501000b05" }, { "filename": "body-cold", - "data": "0x0015171f090e060e060e060e06020601000b06020601000b06020601000b06020601000b06020601000b06020601000b06020601000b06" + "data": "0x0015171f093a0601000d0601000d0601000d0601000d0601000d0601000d0601000b06" }, { "filename": "body-computerblue", - "data": "0x0015171f090e070e070e070e07020701000b07020701000b07020701000b07020701000b07020701000b07020701000b07020701000b07" + "data": "0x0015171f093a0701000d0701000d0701000d0701000d0701000d0701000d0701000b07" }, { "filename": "body-darkbrown", - "data": "0x0015171f090e080e080e080e08020801000b08020801000b08020801000b08020801000b08020801000b08020801000b08020801000b08" + "data": "0x0015171f093a0801000d0801000d0801000d0801000d0801000d0801000d0801000b08" }, { "filename": "body-darkpink", - "data": "0x0015171f090e090e090e090e09020901000b09020901000b09020901000b09020901000b09020901000b09020901000b09020901000b09" + "data": "0x0015171f093a0901000d0901000d0901000d0901000d0901000d0901000d0901000b09" }, { "filename": "body-foggrey", - "data": "0x0015171f090e030e030e030e03020301000b03020301000b03020301000b03020301000b03020301000b03020301000b03020301000b03" + "data": "0x0015171f093a0a01000d0a01000d0a01000d0a01000d0a01000d0a01000d0a01000b0a" }, { "filename": "body-gold", - "data": "0x0015171f090e0a0e0a0e0a0e0a020a01000b0a020a01000b0a020a01000b0a020a01000b0a020a01000b0a020a01000b0a020a01000b0a" + "data": "0x0015171f093a0b01000d0b01000d0b01000d0b01000d0b01000d0b01000d0b01000b0b" }, { "filename": "body-grayscale-1", - "data": "0x0015171f090e0b0e0b0e0b0e0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b" + "data": "0x0015171f093a0c01000d0c01000d0c01000d0c01000d0c01000d0c01000d0c01000b0c" }, { "filename": "body-grayscale-7", - "data": "0x0015171f090e0c0e0c0e0c0e0c020c01000b0c020c01000b0c020c01000b0c020c01000b0c020c01000b0c020c01000b0c020c01000b0c" + "data": "0x0015171f093a0d01000d0d01000d0d01000d0d01000d0d01000d0d01000d0d01000b0d" }, { "filename": "body-grayscale-8", - "data": "0x0015171f090e0d0e0d0e0d0e0d020d01000b0d020d01000b0d020d01000b0d020d01000b0d020d01000b0d020d01000b0d020d01000b0d" + "data": "0x0015171f093a0e01000d0e01000d0e01000d0e01000d0e01000d0e01000d0e01000b0e" }, { "filename": "body-grayscale-9", - "data": "0x0015171f090e0e0e0e0e0e0e0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e" + "data": "0x0015171f093a0f01000d0f01000d0f01000d0f01000d0f01000d0f01000d0f01000b0f" }, { "filename": "body-green", - "data": "0x0015171f090e0f0e0f0e0f0e0f020f01000b0f020f01000b0f020f01000b0f020f01000b0f020f01000b0f020f01000b0f020f01000b0f" + "data": "0x0015171f093a1001000d1001000d1001000d1001000d1001000d1001000d1001000b10" }, { "filename": "body-gunk", - "data": "0x0015171f090e100e100e100e10021001000b10021001000b10021001000b10021001000b10021001000b10021001000b10021001000b10" + "data": "0x0015171f093a1101000d1101000d1101000d1101000d1101000d1101000d1101000b11" }, { "filename": "body-hotbrown", - "data": "0x0015171f090e110e110e110e11021101000b11021101000b11021101000b11021101000b11021101000b11021101000b11021101000b11" + "data": "0x0015171f093a1201000d1201000d1201000d1201000d1201000d1201000d1201000b12" }, { "filename": "body-magenta", - "data": "0x0015171f090e120e120e120e12021201000b12021201000b12021201000b12021201000b12021201000b12021201000b12021201000b12" + "data": "0x0015171f093a1301000d1301000d1301000d1301000d1301000d1301000d1301000b13" }, { "filename": "body-orange-yellow", - "data": "0x0015171f090e130e130e130e13021301000b13021301000b13021301000b13021301000b13021301000b13021301000b13021301000b13" + "data": "0x0015171f093a1401000d1401000d1401000d1401000d1401000d1401000d1401000b14" }, { "filename": "body-orange", - "data": "0x0015171f090e140e140e140e14021401000b14021401000b14021401000b14021401000b14021401000b14021401000b14021401000b14" + "data": "0x0015171f093a1501000d1501000d1501000d1501000d1501000d1501000d1501000b15" }, { "filename": "body-peachy-B", - "data": "0x0015171f090e150e150e150e15021501000b15021501000b15021501000b15021501000b15021501000b15021501000b15021501000b15" + "data": "0x0015171f093a1601000d1601000d1601000d1601000d1601000d1601000d1601000b16" }, { "filename": "body-peachy-a", - "data": "0x0015171f090e160e160e160e16021601000b16021601000b16021601000b16021601000b16021601000b16021601000b16021601000b16" + "data": "0x0015171f093a1701000d1701000d1701000d1701000d1701000d1701000d1701000b17" }, { "filename": "body-purple", - "data": "0x0015171f090e170e170e170e17021701000b17021701000b17021701000b17021701000b17021701000b17021701000b17021701000b17" + "data": "0x0015171f093a1801000d1801000d1801000d1801000d1801000d1801000d1801000b18" }, { "filename": "body-red", - "data": "0x0015171f090e180e180e180e18021801000b18021801000b18021801000b18021801000b18021801000b18021801000b18021801000b18" + "data": "0x0015171f093a1901000d1901000d1901000d1901000d1901000d1901000d1901000b19" }, { "filename": "body-redpinkish", - "data": "0x0015171f090e190e190e190e19021901000b19021901000b19021901000b19021901000b19021901000b19021901000b19021901000b19" + "data": "0x0015171f093a1a01000d1a01000d1a01000d1a01000d1a01000d1a01000d1a01000b1a" }, { "filename": "body-rust", - "data": "0x0015171f090e1a0e1a0e1a0e1a021a01000b1a021a01000b1a021a01000b1a021a01000b1a021a01000b1a021a01000b1a021a01000b1a" + "data": "0x0015171f093a1b01000d1b01000d1b01000d1b01000d1b01000d1b01000d1b01000b1b" }, { "filename": "body-slimegreen", - "data": "0x0015171f090e1b0e1b0e1b0e1b021b01000b1b021b01000b1b021b01000b1b021b01000b1b021b01000b1b021b01000b1b021b01000b1b" + "data": "0x0015171f093a1c01000d1c01000d1c01000d1c01000d1c01000d1c01000d1c01000b1c" }, { "filename": "body-teal-light", - "data": "0x0015171f090e1c0e1c0e1c0e1c021c01000b1c021c01000b1c021c01000b1c021c01000b1c021c01000b1c021c01000b1c021c01000b1c" + "data": "0x0015171f093a1d01000d1d01000d1d01000d1d01000d1d01000d1d01000d1d01000b1d" }, { "filename": "body-teal", - "data": "0x0015171f090e1d0e1d0e1d0e1d021d01000b1d021d01000b1d021d01000b1d021d01000b1d021d01000b1d021d01000b1d021d01000b1d" + "data": "0x0015171f093a1e01000d1e01000d1e01000d1e01000d1e01000d1e01000d1e01000b1e" }, { "filename": "body-yellow", - "data": "0x0015171f090e1e0e1e0e1e0e1e021e01000b1e021e01000b1e021e01000b1e021e01000b1e021e01000b1e021e01000b1e021e01000b1e" + "data": "0x0015171f093a1f01000d1f01000d1f01000d1f01000d1f01000d1f01000d1f01000b1f" } ], "accessories": [ { "filename": "accessory-1n", - "data": "0x0017141e0d0100011f0500021f05000100011f0300011f01000100011f0200011f02000300011f03000200011f0200021f0100011f0200011f0100011f0400011f0100011f" + "data": "0x0017141e0d0100012005000220060001200300012002000120020001200500012005000120020002200100012002000120010001200400012001000120" }, { "filename": "accessory-aardvark", - "data": "0x0018151a0d020003200100012001000100052002000120010001200100012001000220" + "data": "0x0018151a0d02000321010001210200052102000121010001210100012101000221" }, { "filename": "accessory-axe", - "data": "0x0017141d0e01010521010104210100010103210200010101210100012102000101020001210200030001210200030001210200" + "data": "0x0017141d0e010205220102042201000102032202000102012201000122020001020200012205000122050001220200" }, { "filename": "accessory-belly-chameleon", - "data": "0x0017121e0d010001220100012201000500022201000222050002220100022205000222010001220100010001220300" + "data": "0x0017121e0d0100012301000123060002230100022305000223010002230500022301000123020001230300" }, { "filename": "accessory-bird-flying", - "data": "0x0018151a0d0100022302000223010001230200022302000123030002230300" + "data": "0x0018151a0d0100022402000224010001240200022402000124030002240300" }, { "filename": "accessory-bird-side", - "data": "0x0017131c0d040001240100030002240100042401230125010004240100020003240100010001240400" + "data": "0x0017131c0d040001250400022501000425012401260100042503000325020001250400" }, { "filename": "accessory-bling-anchor", - "data": "0x0015141d0d01260500012601000126030001260100020001260100012602000300012603000300012603000200032602000300012603000100012601000126010001260100020003260200" + "data": "0x0015141d0d0127050001270100012703000127030001270100012705000127060001270500032705000127040001270100012701000127030003270200" }, { "filename": "accessory-bling-anvil", - "data": "0x0015161e0b0127090001270100012707000127010002000127050001270200030001270300012703000400032704000500010d05000200020d052702000300020d032703000400030d04000300020d03270300" + "data": "0x0015161e0b012809000128010001280700012803000128050001280500012803000128070003280900010e0700020e05280500020e03280700030e0700020e03280300" }, { "filename": "accessory-bling-arrow", - "data": "0x0018141e0d0400032605000226040001260100012603000126030001000226040003260400010001260500" + "data": "0x0018141e0d04000327050002270400012701000127030001270400022704000327050001270500" }, { "filename": "accessory-bling-cheese", - "data": "0x0015141e0c012606000126010001260400012601000200012602000126020003000226030002000126020001260200010006260100020001260128012601280126010003000426010004000126012801260100050002260100" + "data": "0x0015141e0c0127060001270100012704000127030001270200012705000227050001270200012703000627030001270129012701290127040004270500012701290127060002270100" }, { "filename": "accessory-bling-gold-ingot", - "data": "0x0015141b0c012606000126010001260400012601000200012602000126020003000226030001000629010001000426022901000100042602290100" + "data": "0x0015141b0c01270600012701000127040001270300012702000127050002270400062a02000427022a02000427022a0100" }, { "filename": "accessory-bling-love", - "data": "0x0015141d0c01260600012601000126040001260100020001260200012602000300022603000200012602000126020001000126012804260100010006260100020004260200030002260300" + "data": "0x0015141d0c0127060001270100012704000127030001270200012705000227050001270200012703000127012904270200062703000427050002270300" }, { "filename": "accessory-bling-mask", - "data": "0x0015141e0c01260600012601000126040001260100020001260200012602000300022603000100062601000100012601000226010001260100010006260100020004260200010001260100022601000126010001000126040001260100" + "data": "0x0015141e0c012706000127010001270400012703000127020001270500022704000627020001270100022701000127020006270300042703000127010002270100012702000127040001270100" }, { "filename": "accessory-bling-rings", - "data": "0x0017141d0d0300032a01000200012a0300012a0100032a0200012a012a0100012a0100012a0100012a012a0200032a0100012a0300012a02000100032a0300" + "data": "0x0017141d0d0300032b0300012b0300012b0100032b0200022b0100012b0100012b0100022b0200032b0100012b0300012b0300032b0300" }, { "filename": "accessory-bling-scissors", - "data": "0x0016131c0e012b0300012b012b0300012b0100012b0100012b01000100012b0100012b01000200012b0200022b0100022b022b0100022b" + "data": "0x0016131c0e012c0300022c0300012c0100012c0100012c0200012c0100012c0300012c0200022c0100042c0100022c" }, { "filename": "accessory-bling-sparkles", - "data": "0x0016141d0c010001260600032601000126020001260100012602000126030003000326020001000726030003260200040001260300040001260300" + "data": "0x0016141d0c01000127060003270100012702000127010001270200012706000327030007270300032706000127070001270300" }, { "filename": "accessory-body-gradient-checkerdisco", - "data": "0x0015171f09022c0223022c0223022c0223022c022c0223022c0223022c0223022c0223022d0223022d0223022d02230223022d0223022d0223022d0223022e01000123022e0223022e0223022e022e01000123022e0223022e0223022e02230100012f0223022f0223022f022302230100012f0223022f0223022f0223023001000123023002230230022302300230010001230230022302300223023002230100013102230231022302310223" + "data": "0x0015171f09022d0224022d0224022d0224042d0224022d0224022d0224022d0224022e0224022e0224022e0424022e0224022e0224022e0224022f01000124022f0224022f0224042f01000124022f0224022f0224022f02240100013002240230022402300424010001300224023002240230022402310100012402310224023102240431010001240231022402310224023102240100013202240232022402320224" }, { "filename": "accessory-body-gradient-dawn", - "data": "0x0015171f090e320e320e330e33021101000b11021101000b11023401000b34023401000b34023501000b35023501000b35023601000b36" + "data": "0x0015171f091c331c34021201000d1201000b12023501000d3501000b35023601000d3601000b36023701000b37" }, { "filename": "accessory-body-gradient-dusk", - "data": "0x0015171f090e320e320e240e24023701000b37023701000b37023701000b37023701000b37023801000b38023801000b38023901000b39" + "data": "0x0015171f091c331c25023801000d3801000d3801000d3801000b38023901000d3901000b39023a01000b3a" }, { "filename": "accessory-body-gradient-glacier", - "data": "0x0015171f090e3a013a013b013a013b013a013b013a013b013a013b013a013b013a013b0e3b013b0104013b0104013b0104013b0104013b0104013b0104013b0104020401000b04020401000b04020401000b040104013c0100013c0104013c0104013c0104013c0104013c0104013c023c01000b3c013c013d0100013d013c013d013c013d013c013d013c013d013c013d023d01000b3d" + "data": "0x0015171f090f3b013c013b013c013b013c013b013c013b013c013b013c013b103c0104013c0104013c0104013c0104013c0104013c0104013c030401000d0401000d0401000c04013d0100013d0104013d0104013d0104013d0104013d0104033d01000c3d013e0100013e013d013e013d013e013d013e013d013e013d033e01000b3e" }, { "filename": "accessory-body-gradient-ice", - "data": "0x0015171f090e3e0e3e0e3f0e3f023f01000b3f023f01000b3f023c01000b3c023c01000b3c023c01000b3c023c01000b3c024001000b40" + "data": "0x0015171f091c3f1e4001000d4001000b40023d01000d3d01000d3d01000d3d01000b3d024101000b41" }, { "filename": "accessory-body-gradient-pride", - "data": "0x0015171f090e410e410e420e42022a01000b2a022a01000b2a020f01000b0f020f01000b0f024301000b43024301000b43021201000b12" + "data": "0x0015171f091c421c43022b01000d2b01000b2b021001000d1001000b10024401000d4401000b44021301000b13" }, { "filename": "accessory-body-gradient-redpink", - "data": "0x0015171f090e440e440e440e09020901000b09020901000b09020901000b09020901000b09020901000b09024501000b45024501000b45" + "data": "0x0015171f092a45100901000d0901000d0901000d0901000d0901000b09024601000d4601000b46" }, { "filename": "accessory-body-gradient-sunset", - "data": "0x0015171f090e460e460e460e25024201000b42021401000b14024701000b47024701000b47024801000b48024801000b48024801000b48" + "data": "0x0015171f092a470e26024301000b43021501000b15024801000d4801000b48024901000d4901000d4901000b49" }, { "filename": "accessory-carrot", - "data": "0x0018131d0e0200011d0100011d0300011d010002000249010001000249020001000149030001490400" + "data": "0x0018131d0e0200011e0100011e0300011e0300024a0200024a0300014a0300014a0400" }, { "filename": "accessory-chain-logo", - "data": "0x0018171c09012601000326010003260100032601000100012603000126030001260300012602260200032601000326010002260100012603000126030001260300012601260200022601000326010003260100" + "data": "0x0018171c09012701000327010003270100032702000127030001270300012703000327020003270100032701000227010001270300012703000127030002270200022701000327010003270100" }, { "filename": "accessory-checker-RGB", - "data": "0x0015171f090224021c024a0224021c024a02240224021c024a0224021c024a0224024a0224021c024a0224021c024a024a0224021c024a0224021c024a021c0100014a0224021c024a0224021c021c0100014a0224021c024a0224021c02240100011c024a0224021c024a022402240100011c024a0224021c024a0224024a01000124021c024a0224021c024a024a01000124021c024a0224021c024a021c0100014a0224021c024a0224021c" + "data": "0x0015171f090225021d024b0225021d024b0425021d024b0225021d024b0225024b0225021d024b0225021d044b0225021d024b0225021d024b021d0100014b0225021d024b0225041d0100014b0225021d024b0225021d02250100011d024b0225021d024b04250100011d024b0225021d024b0225024b01000125021d024b0225021d044b01000125021d024b0225021d024b021d0100014b0225021d024b0225021d" }, { "filename": "accessory-checker-bigwalk-blue-prime", - "data": "0x0015171f09040003070100030701000207030701000307010003070300030701000307070003070700030701000600030701000307010003000207010003070100030701000107020002070100030705000107020002070700020701070700030701000207040003070100030701000207020702000307010003070300" + "data": "0x0015171f090400030701000307010005070100030701000307030003070100030707000307070003070700030701000307040002070100030701000307010001070200020701000307050001070200020707000307070003070100020704000307010003070100040702000307010003070300" }, { "filename": "accessory-checker-bigwalk-greylight", - "data": "0x0015171f090400034b0100034b0100024b034b0100034b0100034b0300034b0100034b0700034b0700034b01000600034b0100034b01000300024b0100034b0100034b0100014b0200024b0100034b0500014b0200024b0700024b014b0700034b0100024b0400034b0100034b0100024b024b0200034b0100034b0300" + "data": "0x0015171f090400034c0100034c0100054c0100034c0100034c0300034c0100034c0700034c0700034c0700034c0100034c0400024c0100034c0100034c0100014c0200024c0100034c0500014c0200024c0700034c0700034c0100024c0400034c0100034c0100044c0200034c0100034c0300" }, { "filename": "accessory-checker-bigwalk-rainbow", - "data": "0x0015171f090400034c010003460100021403120100034c01000346030003120100034c0400031203120400034d01000312030003140100034d010003120246010003140100034d040002460100031404000346010002460400034c010003460100030002120100034c010003460100014d020002120100034c04000112014d020002120400034d01000112" + "data": "0x0015171f090400034d010003470100021503130100034d01000347030003130100034d040006130400034e01000313030003150100034e010003130247010003150100034e040002470100031504000347010002470400034d01000347040002130100034d010003470100014e020002130100034d04000113014e020002130400034e01000113" }, { "filename": "accessory-checker-spaced-black", - "data": "0x0015171f0903000223040002230300030002230400022303000e0002230400022304000223022304000223040002230e0003000223040002230300030002230400022303000e000223040002230400022302230400022304000223" + "data": "0x0015171f09030002240400022406000224040002241100022404000224040004240400022404000224110002240400022406000224040002241100022404000224040004240400022404000224" }, { "filename": "accessory-checker-spaced-white", - "data": "0x0015171f0903000201040002010300030002010400020103000e0002010400020104000201020104000201040002010e0003000201040002010300030002010400020103000e000201040002010400020102010400020104000201" + "data": "0x0015171f09030002020400020206000202040002021100020204000202040004020400020204000202110002020400020206000202040002021100020204000202040004020400020204000202" }, { "filename": "accessory-checker-vibrant", - "data": "0x0015171f09024e0243024f024e0243024f024e024e0243024f024e0243024f024e024f024e0243024f024e0243024f024f024e0243024f024e0243024f02430100014f024e0243024f024e024302430100014f024e0243024f024e0243024e01000143024f024e0243024f024e024e01000143024f024e0243024f024e024f0100014e0243024f024e0243024f024f0100014e0243024f024e0243024f02430100014f024e0243024f024e0243" + "data": "0x0015171f09024f02440250024f02440250044f02440250024f02440250024f0250024f02440250024f02440450024f02440250024f02440250024401000150024f02440250024f044401000150024f02440250024f0244024f010001440250024f02440250044f010001440250024f02440250024f02500100014f02440250024f024404500100014f02440250024f02440250024401000150024f02440250024f0244" }, { "filename": "accessory-checkers-big-green", - "data": "0x0015171f09030f0300030f0300020f030f0300030f0300020f030f0300030f0300020f0300030f0300030f02000300030f0300030f02000300030f0300030f0200020f0400030f0300020f020f0400030f0300020f020f0400030f0300020f0300030f0300030f02000300030f0300030f0200" + "data": "0x0015171f09031003000310030005100300031003000510030003100300021003000310030003100500031003000310050003100300031002000210040003100300041004000310030004100400031003000210030003100300031005000310030003100200" }, { "filename": "accessory-checkers-big-red-cold", - "data": "0x0015171f090319030003190300021903190300031903000219031903000319030002190300031903000319020003000319030003190200030003190300031902000219040003190300021902190400031903000219021904000319030002190300031903000319020003000319030003190200" + "data": "0x0015171f09031a0300031a0300051a0300031a0300051a0300031a0300021a0300031a0300031a0500031a0300031a0500031a0300031a0200021a0400031a0300041a0400031a0300041a0400031a0300021a0300031a0300031a0500031a0300031a0200" }, { "filename": "accessory-checkers-black", - "data": "0x0015171f0902000223020002230200022302000200022302000223020002230200022302000223020002230200022302230200022302000223020002230300012302000223020002230200030001230200022302000223020002230200022302000223020002230223020002230200022302000223030001230200022302000223020003000123020002230200022302000223020002230200022302000223" + "data": "0x0015171f09020002240200022402000224040002240200022402000224020002240200022402000224020004240200022402000224020002240300012402000224020002240500012402000224020002240200022402000224020002240200042402000224020002240200022403000124020002240200022405000124020002240200022402000224020002240200022402000224" }, { "filename": "accessory-checkers-blue", - "data": "0x0015171f09024a0200024a0200024a0200024a024a0200024a0200024a0200024a0200024a0200024a0200024a02000200024a0200024a0200024a0200024a0200024a0200024a0200024a024a0200024a0200024a0200024a0300014a0200024a0200024a02000300014a0200024a0200024a0200024a0200024a0200024a0200024a024a0200024a0200024a0200024a0300014a0200024a0200024a0200" + "data": "0x0015171f09024b0200024b0200024b0200044b0200024b0200024b0200024b0200024b0200024b0200024b0400024b0200024b0200024b0200024b0200024b0200024b0200044b0200024b0200024b0200024b0300014b0200024b0200024b0500014b0200024b0200024b0200024b0200024b0200024b0200044b0200024b0200024b0200024b0300014b0200024b0200024b0200" }, { "filename": "accessory-checkers-magenta-80", - "data": "0x0015171f0902000220020002200200022002000200022002000220020002200200022002000220020002200200022002200200022002000220020002200300012002000220020002200200030001200200022002000220020002200200022002000220020002200220020002200200022002000220030001200200022002000220020003000120020002200200022002000220020002200200022002000220" + "data": "0x0015171f09020002210200022102000221040002210200022102000221020002210200022102000221020004210200022102000221020002210300012102000221020002210500012102000221020002210200022102000221020002210200042102000221020002210200022103000121020002210200022105000121020002210200022102000221020002210200022102000221" }, { "filename": "accessory-chicken", - "data": "0x0018131d0d0300024701000201020001010150010004010100020002010200020001010300020001500300" + "data": "0x0018131d0d0300024801000202020001020151010004020300020204000102050001510300" }, { "filename": "accessory-cloud", - "data": "0x0018131a0d020003010100010005010601" + "data": "0x0018131a0d0200030202000b02" }, { "filename": "accessory-clover", - "data": "0x0017151e0d0200021d04000200031d03000100011d0100011d0100021d0100031d0100031d0100021d0100011d0100011d02000200031d03000200021d0100011d02000600021d" + "data": "0x0017151e0d0200021e0600031e0400011e0100011e0100021e0100031e0100031e0100021e0100011e0100011e0400031e0500021e0100011e0800021e" }, { "filename": "accessory-collar-sunset", - "data": "0x00151717090e190e260e42" + "data": "0x00151717090e1a0e270e43" }, { "filename": "accessory-cow", - "data": "0x0018141c0d0500015101000100035101230151013801510100015101230251010001510100015102380151010002000151020001510100" + "data": "0x0018141c0d05000152020003520124015201390152010001520124025201000152010001520239015203000152020001520100" }, { "filename": "accessory-decay-gray-dark", - "data": "0x0015171f090e27020006270300032702000b270100010009270100022701000227010001270100032702000427022701000827030001270200012702000327050003000827030003000127040002270100022701000100012701000b2703000b27" + "data": "0x0015171f090e28020006280300032802000b2802000928010002280100022801000128010003280200062801000828030001280200012802000328080008280600012804000228010002280200012801000b2803000b28" }, { "filename": "accessory-decay-pride", - "data": "0x0015171f090e27024106270341032702420b27014201420927014202270142022701000127012a0327022a0427022701000827032a0127010f01000127020f0327050f020f01000827030f024301000127044302270143022701430143012701000b27021201000b27" + "data": "0x0015171f090e28024206280342032802430b2802430928014302280143022801000128012b0328022b062801000828032b012801100100012802100328071001000828031002440100012804440228014402280244012801000b28021301000b28" }, { "filename": "accessory-dinosaur", - "data": "0x0017131d0d020003520100020001520100015201000200045202000352010001520100035201000652030001520200" + "data": "0x0017131d0d0200035303000153010001530300045302000353010001530100035301000653030001530200" }, { "filename": "accessory-dollar-bling", - "data": "0x0015141e0c01260600012601260600012601000126040001260100020004260200030002260300020004260200020002260400040002260200020004260200030002260300" + "data": "0x0015141e0c012706000227060001270100012704000127030004270500022705000427040002270800022704000427050002270300" }, { "filename": "accessory-dragon", - "data": "0x0017141e0d020f0100030f01000100030f0100020f020f0300010f01000300030f01000100020f0400010f0300020f01000100030f0200010f0200010f0400" + "data": "0x0017141e0d021001000310020003100100041003000110040003100200021004000110030002100200031002000110020001100400" }, { "filename": "accessory-ducky", - "data": "0x0018131a0e0128010002280100010003280114010003280100" + "data": "0x0018131a0e012901000229020003290115010003290100" }, { "filename": "accessory-eth", - "data": "0x0018131d0e020001530200020001530200010001530154015301000554010003530100020001530200" + "data": "0x0018131d0e020001540400015403000154015501540100055501000354030001540200" }, { "filename": "accessory-eye", - "data": "0x0018151c0d02000454020001000154010002540100015401000154020002540200015401000154040001540100020004540200" + "data": "0x0018151c0d020004550300015501000255010001550100015502000255020001550100015504000155030004550200" }, { "filename": "accessory-flash", - "data": "0x0017151d0d0100010106000200020104000300030102000801020003010300040002010200060001010100" + "data": "0x0017151d0d010001020800020207000302020008020200030207000202080001020100" }, { "filename": "accessory-fries", - "data": "0x0017131d0e0126010a0126010a01260126010a0126010a012605550155032601550155022602550155012603550555" + "data": "0x0017131d0e0127010b0127010b0227010b0127010b01270656032702560227035601270856" }, { "filename": "accessory-glasses-logo-sun", - "data": "0x0018161a0d0723020003230100052303230100032301000123" + "data": "0x0018161a0d072402000324010008240100032401000124" }, { "filename": "accessory-glasses-logo", - "data": "0x0018161a0d07560200015601000156010001560100035603560100035601000156" + "data": "0x0018161a0d0757020001570100015701000157010006570100035701000157" }, { "filename": "accessory-glasses", - "data": "0x0017141d0d07560156010002560100025602000256010002560700071d011d0100021d0100021d0200021d0100021d" + "data": "0x0017141d0d0857010002570100025702000257010002570700081e0100021e0100021e0200021e0100021e" }, { "filename": "accessory-grid-simple-bege", - "data": "0x0016171e09015701000157010001570100015701000157010001570100015701000e00010001570100015701000157010001570100015701000157010001570e000157030001570100015701000157010001570100015701000e00010001570100015701000157010001570100015701000157010001570e00015703000157010001570100015701000157010001570100" + "data": "0x0016171e090158010001580100015801000158010001580100015801000158100001580100015801000158010001580100015801000158010001580e0001580300015801000158010001580100015801000158100001580100015801000158010001580100015801000158010001580e00015803000158010001580100015801000158010001580100" }, { "filename": "accessory-heart", - "data": "0x0018141d0d0100025801000258010007580758010005580100020003580200030001580300" + "data": "0x0018141d0d010002590100025901000e590100055903000359050001590300" }, { "filename": "accessory-hoodiestrings-uneven", - "data": "0x0016121b0f0101010001010101010001010101010001010101010001590101020001590200" + "data": "0x0016121b0f01020100020201000202010002020100015a01020200015a0200" }, { "filename": "accessory-id", - "data": "0x0017151a10020001010200052605010501" + "data": "0x0017151a1002000102020005270a02" }, { "filename": "accessory-infinity", - "data": "0x0017141e0d0100020b0400010b0200010b0300010b06000100030b03000300030b01000600010b0300010b0200010b0400020b0100" + "data": "0x0017141e0d0100020c0400010c0200010c0300010c0700030c0600030c0700010c0300010c0200010c0400020c0100" }, { "filename": "accessory-insignia", - "data": "0x0016131d0e0200015b02000100015b012b015b01000200015b02000100035b0100015b032b015b025b022b015b015b032b015b0100035b0100" + "data": "0x0016131d0e0200015c0300015c012c015c0300015c0300035c0100015c032c035c022c025c032c015c0100035c0100" }, { "filename": "accessory-leaf", - "data": "0x0018141d0d0300045c0200055c0200055c0200055c0200045c0100025c0500" + "data": "0x0018141d0d0300045d0200055d0200055d0200055d0200045d0100025d0500" }, { "filename": "accessory-lightbulb", - "data": "0x0017121c0e045d045d045d0100025d01000100025e01000100025e0100" + "data": "0x0017121c0e0c5e0100025e0200025f0200025f0100" }, { "filename": "accessory-lines-45-greens", - "data": "0x0015171f090200010f0200010f0200010f0200010f0200015c0200015c0200015c0200015c0200015c01000100010f0200010f0200010f0200010f0200010f0200015c0200015c0200015c0200015c0200010f0200010f0200010f0200010f0200010f01000100015c0200015c0200015c0200015c0200015c0500010f0200010f0200010f0200015c0200015c0200015c0200015c0200015c01000100010f0200010f0200010f0200010f0200010f0500015c0200015c0200015c0200010f0200010f0200010f0200010f0200010f0100" + "data": "0x0015171f09020001100200011002000110020001100200015d0200015d0200015d0200015d0200015d02000110020001100200011002000110020001100200015d0200015d0200015d0200015d02000110020001100200011002000110020001100200015d0200015d0200015d0200015d0200015d0500011002000110020001100200015d0200015d0200015d0200015d0200015d02000110020001100200011002000110020001100500015d0200015d0200015d02000110020001100200011002000110020001100100" }, { "filename": "accessory-lines-45-rose", - "data": "0x0015171f090200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f01000100015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f01000100015f0200015f0200015f0200015f0200015f0500015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f01000100015f0200015f0200015f0200015f0200015f0500015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0100" + "data": "0x0015171f09020001600200016002000160020001600200016002000160020001600200016002000160020001600200016002000160020001600200016002000160020001600200016002000160020001600200016002000160020001600200016002000160020001600200016002000160020001600500016002000160020001600200016002000160020001600200016002000160020001600200016002000160020001600200016005000160020001600200016002000160020001600200016002000160020001600100" }, { "filename": "accessory-lp", - "data": "0x0016161e0d03000323030001000723010001000723010003230301032303230101010001010323032303010323010007230100010007230100030003230300" + "data": "0x0016161e0d03000324040007240200072401000324030206240102010001020624030203240100072402000724040003240300" }, { "filename": "accessory-marsface", - "data": "0x0018131d0e040001230223010002230300022302000323030002230523" + "data": "0x0018131d0e0400032401000224030002240200032403000724" }, { "filename": "accessory-matrix-white", - "data": "0x0018131c0e010b0100010b0100010b0500010b0100010b0100010b0500010b0100010b0100010b" + "data": "0x0018131c0e010c0100010c0100010c0500010c0100010c0100010c0500010c0100010c0100010c" }, { "filename": "accessory-moon-block", - "data": "0x0017131d0e056001600100016001000160010001600100016001000160010001600100016001000160010001600100036001000160016001000360" + "data": "0x0017131d0e0661010001610100016101000161010001610100016101000161010001610100016101000161010003610100026101000361" }, { "filename": "accessory-none", @@ -652,457 +654,457 @@ }, { "filename": "accessory-oldshirt", - "data": "0x0015171f090e610e610461075803610e6102620100026103580261015803610261010001610158036102580461026201000361015807610261010001610258016104580361026201000b6102610100016107580361026201000b61" + "data": "0x0015171f09206207591162026301000262035902620159056201000162015903620259046202630100036201590962010001620259016204590362026301000d620100016207590362026301000b62" }, { "filename": "accessory-pizza-bling", - "data": "0x0015141d0c0126060001260100012604000126010002000126020001260200030002260300030002260300020004260200020004260200010006260100010006260100" + "data": "0x0015141d0c012706000127010001270400012703000127020001270500022706000227050004270400042703000627020006270100" }, { "filename": "accessory-pocket-pencil", - "data": "0x00171519100100013703000100010103000563" + "data": "0x0017151910010001380400010203000564" }, { "filename": "accessory-rain", - "data": "0x0018131d0e040001430100014302000143010001430300030001430100014302000143010001430400" + "data": "0x0018131d0e04000144010001440200014401000144060001440100014402000144010001440400" }, { "filename": "accessory-rainbow-steps", - "data": "0x0017171c090b000312070004180312030004140418031202460100041404180300024601000414070002460c00" + "data": "0x0017171c090b000313070004190313030004150419031302470100041504190300024701000415070002470c00" }, { "filename": "accessory-rgb", - "data": "0x0018151e0d030002640300020004640200020004640200010002650264025a01000465045a0465045a010002650200025a0100" + "data": "0x0018151e0d030002650500046504000465030002660265025b01000466045b0466045b010002660200025b0100" }, { "filename": "accessory-robot", - "data": "0x0019171b0901230200012302000123020001230200012301000e00022301000b23" + "data": "0x0019171b090124020001240200012402000124020001240f00022401000b24" }, { "filename": "accessory-safety-vest", - "data": "0x0015171f0b0413030005130413030005130413030005130413030005130100036603000566010003660300056601000366030005660100036603000566010003130300051301000313030005130100031303000513" + "data": "0x0015171f0b0414030009140300091403000914030005140100036703000567010003670300056701000367030005670100036703000567010003140300051401000314030005140100031403000514" }, { "filename": "accessory-scarf-clown", - "data": "0x0015151f0c031c0300031c031c0300031c031c0300031c032303000323032303000323032303000323031c0300031c031c0300031c031c0300031c032303000323032303000323" + "data": "0x0015151f0c031d0300061d0300061d0300031d0324030006240300062403000324031d0300061d0300061d0300031d03240300062403000324" }, { "filename": "accessory-secret-x", - "data": "0x0018121b0e016702000167010002670100010002670100016702000167" + "data": "0x0018121b0e01680200016801000268020002680100016802000168" }, { "filename": "accessory-shirt-black", - "data": "0x0015151f0c0923052301000323022301000223020002230123020001230168030001230300022304000300022304000300022304000300022304000300012301680400030002230400030002230400" + "data": "0x0015151f0c0e24010005240100022402000324020001240169030001240300022407000224070002240700022407000124016907000224070002240400" }, { "filename": "accessory-shrimp", - "data": "0x0018121c0e0100025f0100035f0100025f02000100015f0220020001200100" + "data": "0x0018121c0e010002600100036001000260030001600221020001210100" }, { "filename": "accessory-slimesplat", - "data": "0x0017121d0d0200014e0100014e014e0100024e01000100034e01000100024e0100014e014e0100014e02000300014e01000100014e0300" + "data": "0x0017121d0d0200014f0100024f0100024f0200034f0200024f0100024f0100014f0500014f0200014f0300" }, { "filename": "accessory-small-bling", - "data": "0x001514170d01260500012601000126030001260100020003260200" + "data": "0x001514170d0127050001270100012703000127030003270200" }, { "filename": "accessory-snowflake", - "data": "0x0017141d0d01000101030001010100020101000101010002010200030102000100050101000200030102000201010001010100020101000101030001010100" + "data": "0x0017141d0d010001020300010201000202010001020100020202000302030005020300030202000202010001020100020201000102030001020100" }, { "filename": "accessory-stains-blood", - "data": "0x0016151d0d05000219010002000119010004190400041905000219010001190100021904000200021904000800010001190600" + "data": "0x0016151d0d0500021a0300011a0100041a0400041a0500021a0100011a0100021a0600021a0d00011a0600" }, { "filename": "accessory-stains-zombie", - "data": "0x0017151e0d0100010f060008000200020f0400010f0100020f04000500020f01000400040f0200010f0100040f0500020f0100" + "data": "0x0017151e0d0100011010000210040001100100021009000210050004100200011001000410050002100100" }, { "filename": "accessory-stripes-and-checks", - "data": "0x0015171f090e690e430e280e1c02010100012302010223020102230201020101000123020102230201022302010223010001010223020102230201022302230100010102230201022302010223026901000b69024301000b43022801000b28" + "data": "0x0015171f090e6a0e440e290e1d020201000124020202240202022404020100012402020224020202240202022401000102022402020224020204240100010202240202022402020224026a01000b6a024401000b44022901000b29" }, { "filename": "accessory-stripes-big-red", - "data": "0x0015171d090e240e240e240e000e000e00022401000b24022401000b24022401000b24" + "data": "0x0015171d092a252a00022501000d2501000d2501000b25" }, { "filename": "accessory-stripes-blit", - "data": "0x0015171b090e5a0e5a0e5a0e00026a01000b6a0e00022a01000b2a" + "data": "0x0015171b092a5b0e00026b01000b6b0e00022b01000b2b" }, { "filename": "accessory-stripes-blue-med", - "data": "0x0015171f090e430e000e430e00024301000b430e00024301000b430e00024301000b430e00024301000b43" + "data": "0x0015171f090e440e000e440e00024401000b440e00024401000b440e00024401000b440e00024401000b44" }, { "filename": "accessory-stripes-brown", - "data": "0x0015171f090e350e000e350e00023501000b350e00023501000b350e00023501000b350e00023501000b35" + "data": "0x0015171f090e360e000e360e00023601000b360e00023601000b360e00023601000b360e00023601000b36" }, { "filename": "accessory-stripes-olive", - "data": "0x0015171f090e6b0e000e6b0e00026b01000b6b0e00026b01000b6b0e00026b01000b6b0e00026b01000b6b" + "data": "0x0015171f090e6c0e000e6c0e00026c01000b6c0e00026c01000b6c0e00026c01000b6c0e00026c01000b6c" }, { "filename": "accessory-stripes-red-cold", - "data": "0x0015171f090e190e000e190e00021901000b190e00021901000b190e00021901000b190e00021901000b19" + "data": "0x0015171f090e1a0e000e1a0e00021a01000b1a0e00021a01000b1a0e00021a01000b1a0e00021a01000b1a" }, { "filename": "accessory-sunset", - "data": "0x0017141a0d0300012603000100012603000126010002000326020001260100032601000126" + "data": "0x0017141a0d03000127040001270300012703000327020001270100032701000127" }, { "filename": "accessory-taxi-checkers", - "data": "0x0017171a090266020d0266020d0266020d02660266020d0266020d0266020d0266020d01000166020d0266020d0266020d020d01000166020d0266020d0266020d" + "data": "0x0017171a090267020e0267020e0267020e0467020e0267020e0267020e0267020e01000167020e0267020e0267040e01000167020e0267020e0267020e" }, { "filename": "accessory-tee-yo", - "data": "0x0015171f0902280200012804000128030001280228030004280400012803280900022803280900022802280200012801000128030001280100022802280300012801000228010001280100022802280300012801000228030002280228080001280100022802280a00022802280a00022802280a000228" + "data": "0x0015171f09022902000129040001290300032903000429040004290900052909000429020001290100012903000129010004290300012901000229010001290100042903000129010002290300042908000129010004290a0004290a0004290a000229" }, { "filename": "accessory-text-yolo", - "data": "0x0017131d0d014e0100014e010002570100014e020002570100014e02000257060001570200024e010001570200024e010002570100024e0100" + "data": "0x0017131d0d014f0100014f010002580100014f020002580100014f02000258060001580200024f010001580200024f010002580100024f0100" }, { "filename": "accessory-think", - "data": "0x0018131c0e0301020003010200050002000101020004000101" + "data": "0x0018131c0e0302020003020900010206000102" }, { "filename": "accessory-tie-black-on-white", - "data": "0x0015121f0e0423014b0223014b014b0223014b014b0223014b014b0223014b014b0223014b014b0223014b014b0223014b014b0223014b014b0223014b014b0223014b" + "data": "0x0015121f0e0424014c0224024c0224024c0224024c0224024c0224024c0224024c0224024c0224024c0224024c0224014c" }, { "filename": "accessory-tie-dye", - "data": "0x0016151f0b0200023b0100016c0200016c0100013b0100033b0200016c02000100013b0300013b0200026c0300026d0100013b0100026c0200016d0100011c016d013b0100016c01000100016d0100011c016c013b0100016c0100011c0100016d0100011c0100026c03000100016d0200011c0300011c01000200016d0200031c0100011c0100016d0200016d0100021c0200" + "data": "0x0016151f0b0200023c0100016d0200016d0100013c0100033c0200016d0300013c0300013c0200026d0300026e0100013c0100026d0200016e0100011d016e013c0100016d0200016e0100011d016d013c0100016d0100011d0100016e0100011d0100026d0400016e0200011d0300011d0300016e0200031d0100011d0100016e0200016e0100021d0200" }, { "filename": "accessory-tie-purple-on-white", - "data": "0x0015121f0e046e014b026e014b014b026e014b014b026e014b014b026e014b014b026e014b014b026e014b014b026e014b014b026e014b014b026e014b014b026e014b" + "data": "0x0015121f0e046f014c026f024c026f024c026f024c026f024c026f024c026f024c026f024c026f024c026f024c026f014c" }, { "filename": "accessory-tie-red", - "data": "0x0016111e0f024102410200024102410241024102410241" + "data": "0x0016111e0f044202000c42" }, { "filename": "accessory-txt-a2+b2", - "data": "0x0017151d0d0200016f0500026f0600026f0100016f04000200036f03000300016f0100016f0100016f0500026f01000500026f0100" + "data": "0x0017151d0d020001700500027006000270010001700600037006000170010001700100017005000270060002700100" }, { "filename": "accessory-txt-cc", - "data": "0x0017151d0c010007700100017007000170017001000270010002700100017001700100017002000170020001700170010002700100027001000170017007000170010007700100" + "data": "0x0017151d0c01000771010001710700027101000271010002710100027101000171020001710200027101000271010002710100027107000171010007710100" }, { "filename": "accessory-txt-cc2", - "data": "0x0017141c0d0371010003710171030001710200017103000171020001710300017102000171030001710200037101000371" + "data": "0x0017141c0d037201000472030001720200017203000172020001720300017202000172030001720200037201000372" }, { "filename": "accessory-txt-copy", - "data": "0x0017131d0d02720100027201000172020002720100027201000272010006000272010001720100017202720100027201000172020001720200" + "data": "0x0017131d0d027301000273010001730200027301000273010002730700027301000173010003730100027301000173020001730200" }, { "filename": "accessory-txt-dao-black", - "data": "0x0018151b0c02230200012302000123010001230100022301000223010001230123010005230100012302230100012301000123010001230100" + "data": "0x0018151b0c022402000124020001240100012401000224010002240100022401000524010003240100012401000124010001240100" }, { "filename": "accessory-txt-doom", - "data": "0x0016161d0b0200012308000323080001230100032306000100022301000323040003000223010003230200050002230100032308000123010001230a000123" + "data": "0x0016161d0b0200012408000324080001240100032407000224010003240700022401000324070002240100032408000124010001240a000124" }, { "filename": "accessory-txt-dope-text", - "data": "0x0017131d0d01000173020001730100027301000173010001730273020001730100060002730100017302000273010002730100017302000373" + "data": "0x0017131d0d010001740200017401000274010001740100037402000174070002740100017402000274010002740100017402000374" }, { "filename": "accessory-txt-foo-black", - "data": "0x0019151b0d0523010002230223010002230100022301230200022301000223" + "data": "0x0019151b0d05240100042401000224010003240200022401000224" }, { "filename": "accessory-txt-ico", - "data": "0x0019171d09027401000b74027401000b74027401000b74027401000b74027401000b74" + "data": "0x0019171d09027501000d7501000d7501000d7501000d7501000b75" }, { "filename": "accessory-txt-io", - "data": "0x0018131c0d01560300015601000156020001560200015601000156010002560100015602000256015603000256" + "data": "0x0018131c0d0157030001570100015702000157020001570100015701000257010001570200035703000257" }, { "filename": "accessory-txt-lmao", - "data": "0x0017131d0d013e0300023e013e0200023e0100023e0100013e020006000100013e0200023e013e0100013e0100023e013e0100013e0100023e" + "data": "0x0017131d0d013f0300033f0200023f0100023f0100013f0900013f0200033f0100013f0100033f0100013f0100023f" }, { "filename": "accessory-txt-lol", - "data": "0x001715190d01010200020101000101010001010200020101000101010002010100020101000201" + "data": "0x001715190d01020200020201000102010001020200020201000102010002020100020201000202" }, { "filename": "accessory-txt-mint", - "data": "0x0016141c0d0600011407000214010001140200011401140100011401000114010001140700021402000314011401000114020001140100" + "data": "0x0016141c0d06000115070002150100011502000215010001150100011501000115070002150200041501000115020001150100" }, { "filename": "accessory-txt-nil-grey-dark", - "data": "0x0018151a0d037501000175010001750100017501000175010001750100017501000175010001750100017501000275" + "data": "0x0018151a0d037601000176010001760100017601000176010001760100017601000176010001760100017601000276" }, { "filename": "accessory-txt-noun-f0f", - "data": "0x0017131e0d010002690100016901000100016901000269010006000269010001690100016902690100036906000100026901000169010001000169010002690100" + "data": "0x0017131e0d0100026a0100016a0200016a0100026a0700026a0100016a0100036a0100036a0700026a0100016a0200016a0100026a0100" }, { "filename": "accessory-txt-noun-green", - "data": "0x0017131e0d0100023e0100013e01000100013e0100023e01000600023e0100013e0100013e023e0100033e06000100023e0100013e01000100013e0100023e0100" + "data": "0x0017131e0d0100023f0100013f0200013f0100023f0700023f0100013f0100033f0100033f0700023f0100013f0200013f0100023f0100" }, { "filename": "accessory-txt-noun-multicolor", - "data": "0x0017131e0d010002170100011701000100011701000217010006000276010001140100011402760100031406000100020f0100010f01000100010f0100020f0100" + "data": "0x0017131e0d01000218010001180200011801000218070002770100011501000115027701000315070002100100011002000110010002100100" }, { "filename": "accessory-txt-noun", - "data": "0x0016131d0d0100026c0100016c01000100016c0100026c01000600026c0100016c0100016c026c0100036c06000100026c0100016c01000100016c0100026c0100" + "data": "0x0016131d0d0100026d0100016d0200016d0100026d0700026d0100016d0100036d0100036d0700026d0100016d0200016d0100026d0100" }, { "filename": "accessory-txt-pi", - "data": "0x0018131b0d0100051f011f0100011f0100011f01000200011f0100011f01000200011f0200011f" + "data": "0x0018131b0d01000620010001200100012003000120010001200300012002000120" }, { "filename": "accessory-txt-pop", - "data": "0x0017131d0d022804000228040001280100022802000200022802000400022804000228040001280100" + "data": "0x0017131d0d0229040002290400012901000229040002290600022904000229040001290100" }, { "filename": "accessory-txt-rofl", - "data": "0x0017131d0d02010200027702010200027701010100010101000277060003370100012601000237020001260100013703000226" + "data": "0x0017131d0d02020200027802020200027801020100010201000278060003380100012701000238020001270100013803000227" }, { "filename": "accessory-txt-we", - "data": "0x0018151d0c0700011c0100040001560100011c0100011c02000156010001560100031c015601000156010001560100011c0200015601000156010001560200011c010001000156010001560500" + "data": "0x0018151d0c0700011d050001570100011d0100011d02000157010001570100031d015701000157010001570100011d0200015701000157010001570200011d02000157010001570500" }, { "filename": "accessory-txt-yay", - "data": "0x0018151a0c0143010001430100011c0100014301000143010001430100031c010001430100010001430100011c0100011c010001430100" + "data": "0x0018151a0c0144010001440100011d0100014401000144010001440100031d01000144020001440100011d0100011d010001440100" }, { "filename": "accessory-wall", - "data": "0x0015171f090a00016203000a0001620300026201000b62040001620900040001620900026201000462010006620a00016203000a0001620300026201000b62040001620900040001620900" + "data": "0x0015171f090a0001630d0001630300026301000b63040001630d0001630900026301000463010006630a0001630d0001630300026301000b63040001630d0001630900" }, { "filename": "accessory-wave", - "data": "0x0017151b0d0100035604000256020001560300020001560200015602000200015603000256010001560600" + "data": "0x0017151b0d01000357040002570200015705000157020001570400015703000257010001570600" }, { "filename": "accessory-wet-money", - "data": "0x0018141e0d017802790178037902790178017a0178027902790178017a0178027903790178027901780100010401000104010001040100010001040500050001040100" + "data": "0x0018141e0d0179027a0179057a0179017b0179047a0179017b0179057a0179027a0179010001040100010401000104020001040a0001040100" }, { "filename": "accessory-woolweave-bicolor", - "data": "0x0015171f09037b010003140100037b0100027b0e00017b010003140100037b010003140100010001140300017b030001140300017b01140200027b010003140100037b01000e00027b020003140100037b01000214030001140300017b030001140200017b01140200037b010003140100027b0e00017b0200027b010003140100037b0100" + "data": "0x0015171f09037c010003150100037c0100027c0e00017c010003150100037c01000315020001150300017c030001150300017c01150200027c010003150100037c0f00027c020003150100037c01000215030001150300017c030001150200017c01150200037c010003150100027c0e00017c0200027c010003150100037c0100" }, { "filename": "accessory-woolweave-dirt", - "data": "0x0015171f09037c0100037c0100037c0100027c0e00017c0100037c0100037c0100037c01000100017c0300017c0300017c0300017c017c0200027c0100037c0100037c01000e00027c0200037c0100037c0100027c0300017c0300017c0300017c0200027c0200037c0100037c0100027c0e00017c0200027c0100037c0100037c0100" + "data": "0x0015171f09037d0100037d0100037d0100027d0e00017d0100037d0100037d0100037d0200017d0300017d0300017d0300027d0200027d0100037d0100037d0f00027d0200037d0100037d0100027d0300017d0300017d0300017d0200027d0200037d0100037d0100027d0e00017d0200027d0100037d0100037d0100" }, { "filename": "accessory-yingyang", - "data": "0x0018121b0e040d020d024b020d024b044b" + "data": "0x0018121b0e060e024c020e064c" }, { "filename": "body-bege", - "data": "0x0015171f090e020e020e020e02020201000b02020201000b02020201000b02020201000b02020201000b02020201000b02020201000b02" + "data": "0x0015171f093a0101000d0101000d0101000d0101000d0101000d0101000d0101000b01" }, { "filename": "body-gray-scale-1", - "data": "0x0015171f090e0b0e0b0e0b0e0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b" + "data": "0x0015171f093a0c01000d0c01000d0c01000d0c01000d0c01000d0c01000d0c01000b0c" }, { "filename": "body-gray-scale-9", - "data": "0x0015171f090e0e0e0e0e0e0e0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e" + "data": "0x0015171f093a0f01000d0f01000d0f01000d0f01000d0f01000d0f01000d0f01000b0f" }, { "filename": "body-ice-cold", - "data": "0x0015171f090e060e060e060e06020601000b06020601000b06020601000b06020601000b06020601000b06020601000b06020601000b06" + "data": "0x0015171f093a0601000d0601000d0601000d0601000d0601000d0601000d0601000b06" } ], "heads": [ { "filename": "head-aardvark", - "data": "0x00021e140605000137020001370f0004000237020002370e0003000337020003370d0002000437020004370c0003000337020003370d0004000237020002370e0005000137020001370f000d370b000d370b000d370b000d370b000d370b000d370b000d370600057d0d370600017d017e017d017e017d0b37097d017e017d017e017d0b370d7d0a370523097d0b370d7d" + "data": "0x00021e14060500013802000138130002380200023811000338020003380f000438020004380f00033802000338110002380200023813000138020001380f000d380b000d380b000d380b000d380b000d380b000d380b000d380600057e0d380600017e017f017e017f017e0b38097e017f017e017f017e0b380d7e0a380524097e0b380d7e" }, { "filename": "head-abstract", - "data": "0x00041a1405045c01000447010004470100017f01000114010001140100045c01230447012304470123017f01230114012301140123045c01230447012304470123017f01230114012301140123045c01230447012304470123017f01230114012301140123045c01230447012304470123017f012301140123011401230100142301230158012301580123017f012304460123047f0123044601230158012301580123017f012304460123047f0123044601230158012301580123017f012304460123047f0123044601230158012301580123017f012304460123047f0123044601230158012301580123017f012304460123047f012304460100132301000123015401230154012301540123040701230455012304550123015401230154012301540123040701230455012304550123015401230154012301540123010703540123045501230455012301540123015401230154012304070123045501230455012301540123015401230154012304070123045501230455" + "data": "0x00041a1405045d01000448010004480100018001000115010001150100045d01240448012404480124018001240115012401150124045d01240448012404480124018001240115012401150124045d01240448012404480124018001240115012401150124045d0124044801240448012401800124011501240115012401001524015901240159012401800124044701240480012404470124015901240159012401800124044701240480012404470124015901240159012401800124044701240480012404470124015901240159012401800124044701240480012404470124015901240159012401800124044701240480012404470100132401000124015501240155012401550124040701240456012404560124015501240155012401550124040701240456012404560124015501240155012401550124010703550124045601240456012401550124015501240155012404070124045601240456012401550124015501240155012404070124045601240456" }, { "filename": "head-ape", - "data": "0x0005191406030004800c0002000980080001000e80040002000f80020001001080020002000f80020002000f800200020001800e810200020001800e810200020001800e810200020001800e81020003800e8102000180018101800f8101000180018103800d82018005800d81018002001180" + "data": "0x0005191406030004810e00098109000e8106000f810300108104000f8104000f81040001810e82040001810e82040001810e82040001810e82020003810e8202000181018201810f8201000181018203810d8306810d82018102001181" }, { "filename": "head-bag", - "data": "0x00031c140306000e3a050006000e3a05000400023a0e00023a03000400023a0e00023a03000400023a0e00023a030002000207023a0e07023a02070100020001070126023a040706260407023a01260107010001000126010702260607042606070226010701000100012608070626080701000100013a16070100013a0100013a15070100013a0100013a15070100013a0107013a1607013a0107013a1607010018070100070703760e0701001807020016070100" + "data": "0x00031c140306000e3b0b000e3b0900023b0e00023b0700023b0e00023b0700023b0e00023b05000207023b0e07023b0207030001070127023b040706270407023b01270107020001270107022706070427060702270107020001270807062708070200013b16070100013b0100013b15070100013b0100013b15070100013b0107013b1607013b0107013b1607010018070100070703770e0701001807020016070100" }, { "filename": "head-bagpipe", - "data": "0x00011d19050a0001830d000a00030f0b000a0001830200010f0100018308000a00020f0300010f017a07000a000108010f017a020f0108017a010f06000a00020f017a020f0183017a020f050001000183080001830100017a010f010001080100020f018304000200010807000108040001080200010f017a010f030003000108060001080300010803000183017a010f0300040001080500010803000108020001080100017a010f0200010f0200017a030f017a030f010803000108020001080200020f017a01000100010f017a030f017a030f017a03000108010001080400010f017a010f0100010f017a030f017a030f017a010f01000108020001080400010f02000100010f017a030f017a030f017a020f01080100010808000100010f017a030f017a030f017a030f017a020f07000100010f017a030f017a030f017a030f017a030f017a050001000108017a030f017a030f017a030f017a030f017a010f0400010001080200020f017a030f0211020f017a030f017a010f0400010001080400017a030f017a030f017a030f017a010f0400010001080400017a030f017a030f017a030f017a0500010001080500030f017a030f017a030f017a0500010001080700010f017a030f017a020f070001000108160001000183160003831500" + "data": "0x00011d19050a000184170003101500018402000110010001841200021003000110017b110001080110017b02100108017b011010000210017b02100184017b021006000184080001840100017b01100100010801000210018406000108070001080400010802000110017b011006000108060001080300010803000184017b0110070001080500010803000108020001080100017b0110020001100200017b0310017b03100108030001080200010802000210017b02000110017b0310017b0310017b030001080100010804000110017b011001000110017b0310017b0310017b011001000108020001080400011003000110017b0310017b0310017b021001080100010809000110017b0310017b0310017b0310017b021008000110017b0310017b0310017b0310017b0310017b06000108017b0310017b0310017b0310017b0310017b01100500010802000210017b031002120210017b0310017b0110050001080400017b0310017b0310017b0310017b0110050001080400017b0310017b0310017b0310017b0600010805000310017b0310017b0310017b0600010807000110017b0310017b02100800010817000184160003841500" }, { "filename": "head-banana", - "data": "0x00041d140304000523047903260a0005000323047905260900060001230479072608000700037909260700070002790226012b07260700070001790326012b0326022b0226070007000226012b0526022b02260700012606000826022b022606000126022605000826022b022605000226032604000c26040003260126012b022602000e26020004260226012b022601000e26010005260326012b1226012b032601001426012b0326010002000a26032b0926020003000626015706260157062603000400042603570526025704260400" + "data": "0x00041d140304000524047a03270f000324047a05270f000124047a07270f00037a09270e00027a0227012c07270e00017a0327012c0327022c02270e000227012c0527022c02270700012706000827022c02270600032705000827022c02270500052704000c2704000427012c022702000e2702000627012c022701000e2701000827012c1227012c032701001427012c032703000a27032c09270500062701580627015806270700042703580527025804270400" }, { "filename": "head-bank", - "data": "0x00031c15040b00021f0b000900061f09000700031f0472031f07000500021f020c011f0472011f020c021f05000300021f020c031f0472031f020c021f03000100161f01000100167201000200031f0272041f0272041f0272031f02000200011f010c011f0272041f0272041f0272011f010c011f02000200031f0272041f0272041f0272031f02000200031f0272041f0272041f0272031f02000200031f0272041f0272041f0272031f02000200031f0272041f0272041f0272031f02000200031f0272041f0272041f0272031f02000200031f0272041f0272041f0272031f02000200031f0272041f0272041f0272031f02000200011f1272011f02000100161f0100021f1472021f" + "data": "0x00031c15040b0002201400062010000320047303200c000220020d012004730120020d022008000220020d032004730320020d022004001620020016730300032002730420027304200273032004000120010d0120027304200273042002730120010d0120040003200273042002730420027303200400032002730420027304200273032004000320027304200273042002730320040003200273042002730420027303200400032002730420027304200273032004000320027304200273042002730320040003200273042002730420027303200400012012730120030016200100022014730220" }, { "filename": "head-baseball-gameball", - "data": "0x00041a17060800040b08000600080b0600040001240b0b04000300020b01240a0b0124010b02000200030b01240a0b0124010b02000200030b01240a0b0124010b02000100040b01240a0b0124020b01000100030b01240c0b0124010b0100040b01240c0b0124020b030b01240e0b0124010b030b01240e0b0124010b030b01240e0b0124010b0100030b01240c0b0124010b01000100030b01240c0b0124010b01000200030b01240a0b0124010b02000200040b0224060b0224020b02000300050b0624030b030004000c0b04000600080b06000800040b0800" + "data": "0x00041a17060800040c0e00080c0a0001250b0c0700020c01250a0c0125010c0400030c01250a0c0125010c0400030c01250a0c0125010c0300040c01250a0c0125020c0200030c01250c0c0125010c0100040c01250c0c0125050c01250e0c0125040c01250e0c0125040c01250e0c0125010c0100030c01250c0c0125010c0200030c01250c0c0125010c0300030c01250a0c0125010c0400040c0225060c0225020c0500050c0625030c07000c0c0a00080c0e00040c0800" }, { "filename": "head-basketball", - "data": "0x00031a160607000542011a070005000442011a0242011a0242050003000242021a0542011a0442030002000542011a0442011a0442011a020002000142011a0442011a0342011a0342011a0142020001000842011a0242011a0242011a0342010001000142011a0742051a044201000c42011a07420c42011a07420c42011a0742141a0c42011a07420c42011a074201000b42011a0642010001000942051a04420100020004420166010e0166010e0166010e011a0242011a0242020002000642011a0342011a0342011a0142020003000442011a0442011a044203000500021a0542011a0242050007000542011a0700" + "data": "0x00031a160607000543011b0c000443011b0243011b024308000243021b0543011b044305000543011b0443011b0443011b04000143011b0443011b0343011b0343011b014303000843011b0243011b0243011b034302000143011b0743051b044301000c43011b1343011b1343011b0743141b0c43011b1343011b074301000b43011b064302000943051b0443030004430167010f0167010f0167010f011b0243011b024304000643011b0343011b0343011b014305000443011b0443011b04430800021b0543011b02430c000543011b0700" }, { "filename": "head-bat", - "data": "0x00031e14020900018408000184090009000184080001840900080003840600038408000400018402000284018501840600018401850284020001840400040005840185028404000284018505840400030001840185038401850a84018503840185018403000300058401850a8401850584030002000184018514840185018402000200018401851484018501840200010001840185168401850184010001000184018516840185018401000100018401851684018501840100010001840185168401850184010001840185188401850184018401851884018501840784018504840223016201230162022301840185078402840300028401850384032301010123010101230284018502840300028401840500108405000184" + "data": "0x00031e14020900018508000185120001850800018511000385060003850c000185020002850186018506000185018602850200018508000585018602850400028501860585070001850186038501860a8501860385018601850600058501860a850186058505000185018614850186018504000185018614850186018503000185018616850186018502000185018616850186018502000185018616850186018502000185018616850186018501000185018618850186028501861885018608850186048502240163012401630224018501860985030002850186038503240102012401020124028501860285030003850500108505000185" }, { "filename": "head-bear", - "data": "0x0005181508058606000586018602370286060002860237018610861086108610861086108610861086108610860208028602080223018701230187022301080286020802860208072301080286020802860208028602080286020802860208028602080286020802860208028601000e080100" + "data": "0x000518150805870600068702380287060002870238a1870208028702080224018801240188022401080287020802870208072401080287020802870208028702080287020802870208028702080287020802870208028701000e080100" }, { "filename": "head-beer", - "data": "0x00021914060500028702000387070004000b87040003000f87010003000f870100020011870200018701420c87016d02870300024201680287016802470587016d018701000388024201680247016802470168014702870168016d0187010003880342024701680247016802470268016d0200028801000342024701680247016802470268016d0200028801000342024701680247016802470268016d0200028801000342024701680247016802470268016d0200028801000342024701420247016802470268016d0200028801000342024701420247016802470268016d020003880342024701420247016802470268016d0200010002880342024701420247014202470268016d020003000c420168016d02000300058807850288020003000e880200" + "data": "0x000219140605000288020003880b000b8807000f8804000f88030011880200018801430c88016e0288030003430288014302480588016e01880100038903430248014302480143014802880143016e0188010003890343024801430248014302480243016e0200028901000343024801430248014302480243016e0200028901000343024801430248014302480243016e0200028901000343024801430248014302480243016e0200028901000343024801430248014302480243016e0200028901000343024801430248014302480243016e020003890343024801430248014302480243016e030002890343024801430248014302480243016e05000d43016e050005890786028905000e890200" }, { "filename": "head-beet", - "data": "0x00021a14060400031d0200028009000400011d0119021d0280010c018008000400021d0119011d0180010c028008000500021d0119010c028009000600011d0119010c01800a00070002850b000200108902000100091901890119018901190189011903890100148903191089011914891489128902191489148902190f89031901000a8902200689010002000419018901190789011901890119020003000e890300" + "data": "0x00021a14060400031e020002810d00011e011a021e0281010d01810c00021e011a011e0181010d02810d00021e011a010d02810f00011e011a010d0181110002860d00108a0300091a018a011a018a011a018a011a038a0100148a031a108a011a3a8a021a288a021a0f8a031a01000a8a0221068a0300041a018a011a078a011a018a011a05000e8a0300" }, { "filename": "head-bell", - "data": "0x00011c14040b0002260b000b0002260b0008000826080007000226010107260700060002260101092606000500022601010b26050005000e26050005000e2605000400102604000400102604000400102604000400102604000400102604000400108a04000400108a0400020014260200020001260101122602000c26033709261826010016260100" + "data": "0x00011c14040b00022716000227130008270f000227010207270d000227010209270b00022701020b270a000e270a000e2709001027080010270800102708001027080010270800108b0800108b06001427040001270102122702000c2703382127010016270100" }, { "filename": "head-bigfoot-yeti", - "data": "0x00021d14020d00047f0a000d00067f08000c00037f0156017f0156017f08000c00027f0156015a0156015a017f08000c00027f028b0156018b017f08000900057f018b0156015a0156017f080008000b7f080007000b7f090006000d7f080005000e7f018c07000400047f01000a7f038c05000300047f02000a7f058c03000200047f02000b7f078c0100047f03000c7f0300058c037f04000c7f0400018c0100018c010007000b7f09000700087f028d027f08000800028c0a7f07000700068c087f0600" + "data": "0x00021d14020d00048017000680140003800157018001570180140002800157015b0157015b018014000280028c0157018c018011000580018c0157015b0157018010000b800f000b800f000d800d000e80018d0b00048001000a80038d0800048002000a80058d0500048002000b80078d0100048003000c800300058d038004000c800400018d0100018d08000b8010000880028e02801000028d0a800e00068d08800600" }, { "filename": "head-bigfoot", - "data": "0x00021d14020d0004340a000d00063408000c000334012b0134012b013408000c000234012b0136012b0136013408000c000234028e012b018e0134080009000534018e012b0136012b0134080008000b34080007000b34090006000d34080005000e34013607000400043401000a34033605000300043402000a34053603000200043402000b3407360100043403000c3403000536033404000c340400013601000136010007000b34090007000834021602340800080002360a3407000700063608340600" + "data": "0x00021d14020d0004351700063514000335012c0135012c013514000235012c0137012c0137013514000235028f012c018f013511000535018f012c0137012c013510000b350f000b350f000d350d000e3501370b00043501000a3503370800043502000a3505370500043502000b3507370100043503000c3503000537033504000c35040001370100013708000b351000083502170235100002370a350e00063708350600" }, { "filename": "head-blackhole", - "data": "0x00011d17030e00018f0b000d00018f0c000400018f15000300018f0600015f0600015f0400018f03000300018f0500015f0600015f0600018f02000800015f0300045f0300015f06000800015f01190120015f0320031908000400015f0200015f01190220045f0220025f07000400015f0100015f01190120025f0490025f01200119015f06000400015f0100015f0120015f029004230290015f01200119015f0100015f03000200015f0200025f0120015f019006230190015f022001190300018f010005000119025f019008230190025f01190400018f018f0500025f019008230190015f0120015f01190300018f018f0400015f0120015f019008230190015f0120015f05000100018f0300015f0120015f019008230190015f0120015f05000500015f01190120015f019006230190015f02200119015f04000300015f0200035f029004230290025f02190100015f03000400025f02190120025f0490025f0220015f01190100015f03000700015f01190220045f0120015f01200119015f060006000219055f0320015f02190200015f04000200018f0700015f01000319015f0a000300018f0900015f0900018f02001600018f0300" + "data": "0x00011d17030e000190180001901000019018000190060001600600016004000190060001900500016006000160060001900a00016003000460030001600e000160011a012101600321031a0c00016002000160011a02210460022102600b00016001000160011a01210260049102600121011a01600a000160010001600121016002910424029101600121011a01600100016005000160020002600121016001910624019101600221011a030001900600011a02600191082401910260011a0400029005000260019108240191016001210160011a0300029004000160012101600191082401910160012101600600019003000160012101600191082401910160012101600a000160011a0121016001910624019101600221011a016007000160020003600291042402910260021a0100016007000260021a012102600491026002210160011a010001600a000160011a02210460012101600121011a01600c00021a056003210160021a0200016006000190070001600100031a01600d0001900900016009000190180001900300" }, { "filename": "head-blueberry", - "data": "0x00041a1706070006430700050005430691040003000143019101560591035403910300020002430691015403770154039102000200014306910254047701540291020001000243079101540477015403910100010001430156089104540491010002431291034311910343119102431291024312910243129101000143039106770891010001000143049102920991014301910100020002430e910200020004430c9102000400024309910143040004000543069101430400070006430700" + "data": "0x00041a1706070006440c000544069207000144019201570592035503920500024406920155037801550392040001440692025504780155029203000244079201550478015503920200014401570892045504920100024412920344119203441192024412920244129202441292010001440392067808920200014404920293099201440192030002440e92040004440c92060002440992014408000544069201440b0006440700" }, { "filename": "head-bomb", - "data": "0x00041c16070f00010d05000600060d0200030d028302000400040d0172090d0100018301000300020d02720a0d030001830200030d0272090d040001830100100d030001830100100d03000193120d02000141120d0300120d0300120d0300120d0300120d03000100100d04000100100d04000200060d0572030d050003000c0d060004000a0d07000600060d0900" + "data": "0x00041c16070f00010e0b00060e0200030e02840600040e0173090e010001840400020e02730a0e030001840200030e0273090e040001840100100e030001840100100e03000194120e02000142120e0300120e0300120e0300120e0300120e0400100e0500100e0600060e0573030e08000c0e0a000a0e0d00060e0900" }, { "filename": "head-bonsai", - "data": "0x00021e15030c00070f08000a00030f031c040f07000800050f031c010f021c020f06000600040f011c020f031c010f021c020f06000500100f060006000e0f0200030f02000a00080f0300020f011c020f01000100070f0600027c0300080f020f021c060f0400037c060f021c020f020f021c010f011c050f0400017c070f021c020f0b0f0400037c080f01000b0f0300097c04000100080f087c0a000200030f047c0300047c0b000a00067c0b000900087c0a00040012940500040005940d0e050004001294050006000e940700" + "data": "0x00021e15030c00071012000310031d04100f000510031d0110021d02100c000410011d0210031d0110021d02100b0010100c000e10020003100c00081003000210011d0210020007100600027d03000a10021d06100400037d0610021d0410021d0110011d05100400017d0710021d0d100400037d081001000b100300097d05000810087d0c000310047d0300047d1500067d1400087d0e001295090005950d0f090012950b000e950700" }, { "filename": "head-boombox", - "data": "0x00041b1f06040002580f00060002580d00080002580b00020008950258079502000200019509000258040001950200020001950b0002580200019502000296136f0296016f011c016f0195016f090e016f0195016f0124016f0296136f0296036f030e026f0195016f0195026f030e036f0296026f050e056f050e026f0296016f070e016f0195016f070e016f0296016f070e036f070e016f0296016f070e016f0195016f070e016f0296026f050e056f050e026f0296036f030e026f0195016f0195026f030e036f0296136f1200020e01001300010e01001300010e01001300010e01001300010e01001300010e01001300010e01001300010e01001300010e01001300010e01001300010e0100" + "data": "0x00041b1f060400025915000259150002590d00089602590796040001960900025904000196040001960b0002590200019602000297137002970170011d017001960170090f017001960170012501700297137002970370030f02700196017001960270030f037002970270050f0570050f027002970170070f017001960170070f017002970170070f0370070f017002970170070f017001960170070f017002970270050f0570050f027002970370030f02700196017001960270030f0370029713701200020f1400010f1400010f1400010f1400010f1400010f1400010f1400010f1400010f1400010f1400010f0100" }, { "filename": "head-boot", - "data": "0x00061c140701000697030002970900010006970208010001970198090001000797020801970198090001000897010801970198090001000b97090001000b97090001000b9709000d9708000e9707001497010015971597049703260e971597010013830100" + "data": "0x00061c140701000698030002980a00069802080100019801990a0007980208019801990a0008980108019801990a000b980a000b980a000b9809000d9808000e980700149801002e9803272398010013840100" }, { "filename": "head-box", - "data": "0x00061c1403040003970f9901080200030004970f99010802000200049701080f99020801000200049701080f99020801000100049702080f9902080100059702080f990308040003080f990308040003080f990300040003080f9903000400029901080f9903000400029901080f99030004000299010805990a0203000400030805990a0203000400030805990a020300040003080f990300" + "data": "0x00061c1403040003980f9a0108050004980f9a01080400049801080f9a02080300049801080f9a02080200049802080f9a02080100059802080f9a0308040003080f9a0308040003080f9a070003080f9a0700029a01080f9a0700029a01080f9a0700029a0108059a0a0107000308059a0a0107000308059a0a01070003080f9a0300" }, { "filename": "head-boxingglove", - "data": "0x000418140504000d55020002000a55043802550100010012551355135513550255018901550607095502550189015506070955025501890155060709550255018901550607095502550189015506070955030001550607095503000f550100040003550b26010004000355012605010123010103260100040003550b26010004000e550100" + "data": "0x000418140504000d5604000a560439025602004d56018a015606070b56018a015606070b56018a015606070b56018a015606070b56018a015606070956030001560607095603000f56050003560b270500035601270502012401020327050003560b2705000e560100" }, { "filename": "head-brain", - "data": "0x00051a14060600086a06000300036a0320016a0420036a03000200016a0320036a0120046a0320016a02000100016a0120026a0120016a0120016a0120016a0120026a0120026a0120016a01000100016a0120016a0120026a0120026a0120026a0120056a0100066a0120036a0120026a0120026a0120016a0120016a016a0120046a0120066a0120046a0120016a016a0120026a0120026a0120036a0120066a0120016a046a0120026a0120046a0120016a0220026a0120016a016a0120026a0120036a0120096a0120016a016a0120036a0120056a0120066a0120016a066a0120056a0220046a0120016a0100126a01000100016a0120036a0220026a0120056a0220016a01000200016a0120016a0120026a0220046a0220026a020003000e6a0300" + "data": "0x00051a14060600086b0900036b0321016b0421036b0500016b0321036b0121046b0321016b0300016b0121026b0121016b0121016b0121016b0121026b0121026b0121016b0200016b0121016b0121026b0121026b0121026b0121056b0100066b0121036b0121026b0121026b0121016b0121026b0121046b0121066b0121046b0121026b0121026b0121026b0121036b0121066b0121056b0121026b0121046b0121016b0221026b0121026b0121026b0121036b0121096b0121026b0121036b0121056b0121066b0121076b0121056b0221046b0121016b0100126b0200016b0121036b0221026b0121056b0221016b0300016b0121016b0121026b0221046b0221026b05000e6b0300" }, { "filename": "head-bubble-speech", - "data": "0x00041b160504000e010400020012010200010014010100010014010100160116011601160116011601160101001401010001001401010002001201020004000f0103000f00030104000f00020105000e00020106000e0001010700" + "data": "0x00041b160504000e0206001202030014020200140201009a0201001402020014020300120206000f02120003021300020213000202140001020700" }, { "filename": "head-bubblegum", - "data": "0x00021b170508000669080006000369029a0569060004000269029a046902010469040003000269019a056904010469030002000269019a066904010569020002000a690201026902010269020001000f690201036901000100026901011169010016691669166916691669166901001469010001001469010002000a69019a0769020002000b69019a0669020003000169019a0769019a0469019a0169030004000169039a0669039a0169040006000a9a06000800069a0800" + "data": "0x00021b17050800066a0e00036a029b056a0a00026a029b046a0202046a0700026a019b056a0402046a0500026a019b066a0402056a04000a6a0202026a0202026a03000f6a0202036a0200026a0102116a0100846a0100146a0200146a03000a6a019b076a04000b6a019b066a0500016a019b076a019b046a019b016a0700016a039b066a039b016a0a000a9b0e00069b0800" }, { "filename": "head-burger-dollarmenu", - "data": "0x00071a14060600080a06000400060a0125050a04000300040a0125050a0125030a03000200020a01250d0a020002000e0a0125010a02000100120a01000100120a0100010012260100082601970626029701260197012601970226019704260c97029701260c97012604970100129701000200100a02000200100a0200" + "data": "0x00071a14060600080b0a00060b0126050b0700040b0126050b0126030b0500020b01260d0b04000e0b0126010b0300120b0200120b020012270100082701980627029801270198012701980227019804270e9801270c9801270498010012980300100b0400100b0200" }, { "filename": "head-cake", - "data": "0x00021a140605000137040001370300013705000400013701290137020001370129013701000137012901370400040001370129012602000137012901260100013701290126040005000126040001260300012605000400033c0200033c0100033c040004000156023c02000156023c01000156023c0400020010200200010005200601072001000100042008010620010001000420080105200101010001000101032009010320020101000100020102200e0101000100020102200e0101000100020101200f01010001001201010001001201010001000120010102200201052002010220020101200100012001010120020102200501022002010220010101201420" + "data": "0x00021a140605000138040001380300013809000138012a013802000138012a013801000138012a013808000138012a012702000138012a012701000138012a01270900012704000127030001270900033d0200033d0100033d08000157023d02000157023d01000157023d0600102103000521060207210200042108020621020004210802052101020200010203210902032102020200020202210e020200020202210e020200020201210f0202001202020012020200012101020221020205210202022102020121010001210102012102020221050202210202022101021521" }, { "filename": "head-calculator", - "data": "0x00051a16060200120302001203020001030488010303880103070701030200060303880103070701030200010304880d03020006030388010303880103038801030200010304880d03020006030388010303880103038801030200010304180d0302000103041801030388010303880103038801030200120302000103105c010302080103015c019b035c019b035c019b015c019b015c029b015c010302080103015c039b015c029b025c019b015c019b015c029b015c010302080103015c019b015c019b015c039b015c019b015c019b015c029b015c010302080103105c010302000103109c010302001203" + "data": "0x00051a16060200120302001203020001030489010303890103070701030200060303890103070701030200010304890d03020006030389010303890103038901030200010304890d03020006030389010303890103038901030200010304190d0302000103041901030389010303890103038901030200120302000103105d010302080103015d019c035d019c035d019c015d019c015d029c015d010302080103015d039c015d029c025d019c015d019c015d029c015d010302080103015d019c015d019c015d039c015d019c015d019c015d029c015d010302080103105d010302000103109d010302001203" }, { "filename": "head-calendar", - "data": "0x00041a14050100029d0200029d0200029d0200029d0200029d02000201019d0301019d0301019d0301019d0301019d02011501010101230101012301010123010101230101012301010123010101230101059f01010f01029f0101029f010101010da00101019f0101019f0101019f0101020101a0010101a0010101a0010101a0010101a0010101a00201059f010101010da00101059f0101020101a0010101a0010101a0010101a0010101a0010101a00201059f010101010da00101059f0101020101a0010101a0010101a0010101a0010101a0010101a00201059f010101010da00101059f0101020101a0010101a0010101a0010101a0010101a0010101a00201059f010101010da00101059f0101020101a0010101a0010101a0062301a00101059f010101010da00101059f01011501" + "data": "0x00041a14050100029e0200029e0200029e0200029e0200029e02000202019e0302019e0302019e0302019e0302019e180201240102012401020124010201240102012401020124010201240102059f1002029f0102029f02020da00102019f0102019f0102019f030201a0010201a0010201a0010201a0010201a0010201a00202059f02020da00102059f030201a0010201a0010201a0010201a0010201a0010201a00202059f02020da00102059f030201a0010201a0010201a0010201a0010201a0010201a00202059f02020da00102059f030201a0010201a0010201a0010201a0010201a0010201a00202059f02020da00102059f030201a0010201a0010201a0062401a00102059f02020da00102059f1602" }, { "filename": "head-camcorder", - "data": "0x00091c14050400047e0500047e060001230100117c030001230123017e017c01240f7c020002230123017e117c027e022301230100117c027e02230200117c027e02230200117c027e022302001123027e022302001123027e022302000e23027e0123027e0223020001230b7c0223027e0123020002230200112303000123" + "data": "0x00091c14050400047f0500047f060001240100117d03000224017f017d01250f7d02000324017f117d027f03240100117d027f02240200117d027f02240200117d027f022402001124027f022402001124027f022402000e24027f0124027f0224020001240b7d0224027f0124020002240200112403000124" }, { "filename": "head-cannedham", - "data": "0x00041a14060f00017a04000c000383017a04000e00027a04000b00047a05000700067a030002390200097a0500053901001483148c148c148c148c14a2140714070507010e0151010e0151010e0151010e0151070714071483" + "data": "0x00041a14060f00017b10000384017b1200027b0f00047b0c00067b0300023a0200097b0500053a01001484508d14a22d07010f0152010f0152010f0152010f01521b071484" }, { "filename": "head-car", - "data": "0x00091c140605000855090004000155080401550800030003550804015507000200055508040155060001000755060401a30104015505000e5502a304550200145501570100145501570155035501230227095502270123045502a30155012702a30127015502230455012702a30127025502a302a30100012702a3012707a3012702a30127010002a3010004000227090002270500" + "data": "0x00091c1406050008560d000156080401560b00035608040156090005560804015607000756060401a30104015605000e5602a30456020014560158010014560158045601240228095602280124045602a30156012802a30128015602240456012802a30128025604a30100012802a3012807a3012802a30128010002a305000228090002280500" }, { "filename": "head-cash-register", - "data": "0x00021a1408010004580d0001000158026201580d000100045802000a2701000161015801620258026101270843012701610161045802610127014306540143012701610161016f0262016f026101270843012701610161046f0261012701430354044301270161016104270261012708430127016112611261126112611261126112610f61022a0161016102870161028701610287016102870161042a0161016102870161028701610287016102870161042a01611261" + "data": "0x00021a1408010004590e000159026301590e00045902000a280100016201590163025902620128084401280262045902620128014406550144012802620170026301700262012808440128026204700262012801440355044401280262042802620128084401288e62022b026202880162028801620288016202880162042b026202880162028801620288016202880162042b1362" }, { "filename": "head-cassettetape", - "data": "0x00071b14050100140e0100020e1201020e020e0101010e1001020e010e0101010e0101010e1001010e010e05a4010103a4020103a4010105a4010e010e04a4030103a4010102a4030104a4010e010e04a4030103a4010102a4030104a4010e010e05a4010103a4020103a4010105a4010e010e14a4010e010e1426010e010e1426010e060c0a1f060c050c021f0100061f0100021f050c040c0e1f040c" + "data": "0x00071b14050100140f0100020f1202040f0102010f1002030f0102010f0102010f1002020f05a4010203a4020203a4010205a4020f04a4030203a4010202a4030204a4020f04a4030203a4010202a4030204a4020f05a4010203a4020203a4010205a4020f14a4020f1427020f1427010f060d0a200b0d02200100062001000220090d0e20040d" }, { "filename": "head-cat", - "data": "0x00031a14060100020e0d00020e02000100040e0900040e02000100010e0106040e0500040e0106010e02000100010e0306020e0500020e0306010e02000100010e0406070e0406010e02000100010e0306090e0306010e02000100010e01060d0e0106010e02000100110e02000200100e02000200100e02000200100e02000200100e02000200100e02000200100e0200053c0506026c0406043c02000806019607060200053c030604960406043c020010060200" + "data": "0x00031a14060100020f0d00020f0300040f0900040f0300010f0106040f0500040f0106010f0300010f0306020f0500020f0306010f0300010f0406070f0406010f0300010f0306090f0306010f0300010f01060d0f0106010f0300110f0400100f0400100f0400100f0400100f0400100f0400100f0200053d0506026d0406043d02000806019707060200053d030604970406043d020010060200" }, { "filename": "head-cd", - "data": "0x00031b1805080006a40800060002a4066702a40600040002a40a6702a40400030001a40e6701a40300020001a401220f6701a40200020001a402220e6701a40200010001a405220b67024301a40100010001a40622016704080367044301a4010001a404200322010804a40108074301a401a40620010806a40108064301a401a40620010802a4020002a40108064301a401a40620010802a4020002a40108069a01a401a40626010806a40108069a01a401a40726010804a40108026e059a01a4010001a40426036704080167046e029a01a40100010001a402260b67056e01a40100020001a40d67036e01a40200020001a40f67016e01a40200030001a40e6701a40300040002a40a6702a40400060002a4066702a40600080006a40800" + "data": "0x00031b1805080006a40e0002a4066802a40a0002a40a6802a4070001a40e6801a4050001a401230f6801a4040001a402230e6801a4030001a405230b68024401a4020001a40623016804080368044401a4010001a404210323010804a40108074402a40621010806a40108064402a40621010802a4020002a40108064402a40621010802a4020002a40108069b02a40627010806a40108069b02a40727010804a40108026f059b01a4010001a40427036804080168046f029b01a4020001a402270b68056f01a4030001a40d68036f01a4040001a40f68016f01a4050001a40e6801a4070002a40a6802a40a0002a4066802a40e0006a40800" }, { "filename": "head-chain", - "data": "0x00051e160203000484010006840100068401000384030003000493018406930184069301840393030003000484010a0684010a0684010a0384030004000184010a0184010a018402000184010a0184010a018402000184010a0184010a018405000200038401930684019306840193068402000200039301840101059301840101059301840101059302000200038401000684010006840100068402001c001c001c001c000300068401000684010006840100048402000184010105930184010105930184010105930184010103930100018401930684010a0684010a06840193048401000184010a0184010a018402000184010a0184010a018402000184010a0184010a018402000184010a0184010a01840100048401930684019306840193068401930184010004930184069301840693018406930184020004840100068401000684010006840300" + "data": "0x00051e1602030004850100068501000685010003850600049401850694018506940185039406000485010b0685010b0685010b038507000185010b0185010b018502000185010b0185010b018502000185010b0185010b01850700038501940685019406850194068504000394018501020594018501020594018501020594040003850100068501000685010006857500068501000685010006850100048502000185010205940185010205940185010205940185010203940100018501940685010b0685010b06850194048501000185010b0185010b018502000185010b0185010b018502000185010b0185010b018502000185010b0185010b01850100048501940685019406850194068501940185010004940185069401850694018506940185020004850100068501000685010006850300" }, { "filename": "head-chainsaw", - "data": "0x00051d1604030003631300020001630300016312000200016303000163120008630200010d0200010d0200010d0200010d05000863010d0100020d0100020d0100020d0100020d04000863020d0263010d0263010d0263010d0263020d02000100010d06630e0d0163020d08630e0d0163010d01000100010d06630f0d020008630e0d0163020d0100010d06630e0d0163010d010008630f0d020008630e0d0163020d03630101010d0101010d01630e0d0163010d010001000263010d0101010d010101630f0d020002000863010d0263010d0263010d0263010d0263010d020003000563020d0100020d0100020d0100020d0100020d0300040004630100010d0200010d0200010d0200010d0200010d0300" + "data": "0x00051d16040300036415000164030001641400016403000164120008640200010e0200010e0200010e0200010e05000864010e0100020e0100020e0100020e0100020e04000864020e0264010e0264010e0264010e0264020e0300010e06640e0e0164020e08640e0e0164010e0200010e06640f0e020008640e0e0164020e0100010e06640e0e0164010e010008640f0e020008640e0e0164020e03640102010e0102010e01640e0e0164010e02000264010e0102010e010201640f0e04000864010e0264010e0264010e0264010e0264010e05000564020e0100020e0100020e0100020e0100020e070004640100010e0200010e0200010e0200010e0200010e0300" }, { "filename": "head-chameleon", - "data": "0x00021c16040b00021d0b000b00021d0b000a00041d0a000900061d090005000184031d0184041d0184031d018405000300030f0184031d0484031d0184030f03000200010f0222020f0184011d0184041d0184011d0184050f02000100010f0423010f0184021d0484021d0184060f01000100010f012202230122020f0184061d0184050f022201000100020f0222030f0184061d0184040f032301000100070f0184061d0184040f0122022301000100070f0184061d0184050f022201000200040f0284081d0284040f0200030003840c1d038403000200141d02000100161d01000100041d048406230484041d0100021d03840e220384021d011d01840522010f0122060f0122010f05220184011d010016220100020003220e0003220200" + "data": "0x00021c16040b00021e1600021e1500041e1300061e0e000185031e0185041e0185031e0185080003100185031e0485031e0185031005000110022302100185011e0185041e0185011e0185051003000110042401100185021e0485021e018506100200011001230224012302100185061e01850510022302000210022303100185061e018504100324020007100185061e0185041001230224020007100185061e018505100223030004100285081e02850410050003850c1e03850500141e0300161e0200041e048506240485041e0100021e03850e230385031e018505230110012306100123011005230185011e01001623030003230e0003230200" }, { "filename": "head-chart-bars", - "data": "0x00041a1406100004730800041c040004730800041c040004730800041c0469047304000428041c0469047304000428041c0469047304000428041c0469047304190428041c0469047304190428041c0469047304190428041c0469047304190428041c0469047304190428041c0469047304190428041c0469047304190428041c0469047304190428011c06230169047304190428041c0469047304190428041c04690473" + "data": "0x00041a1406100004740800041d040004740800041d040004740800041d046a047404000429041d046a047404000429041d046a047404000429041d046a0474041a0429041d046a0474041a0429041d046a0474041a0429041d046a0474041a0429041d046a0474041a0429041d046a0474041a0429041d046a0474041a0429041d046a0474041a0429011d0624016a0474041a0429041d046a0474041a0429041d046a0474" }, { "filename": "head-cheese", - "data": "0x00031a140605000226012b0226022908000500052602290800050005260329070004000226012902260229012b01290700040001260129022b01260129012b03290600040001260129022b01260129012603290600030005260329022602290500030005260729050003000526082904000200052609290400020005260a290300020005260a290300010005260c290200010005260c29020001000126012903260d29010001260129012b02260429012b012903230529010001260129012b02260229022607290126032905260f29" + "data": "0x00031a140605000227012c0227022a0d000527022a0d000527032a0b000227012a0227022a012c012a0b000127012a022c0127012a012c032a0a000127012a022c0127012a0127032a09000527032a0227022a08000527072a08000527082a06000527092a060005270a2a050005270a2a040005270c2a030005270c2a03000127012a03270d2a01000127012a012c0227042a012c012a0324052a01000127012a012c0227022a0227072a0127032a05270f2a" }, { "filename": "head-chefhat", - "data": "0x00051c1404050006010d0003000b010a000200090103a4080102000100060104a40c0101000100030103a41001010018010d0101a4060101a4030101000b0101a4050102a4030101000200030101a4060101a4030102a4040102000300030101a4050101a4020101a40501030005000e7c050005000ea4050005000ea40500050001010c550101050005000e01050005000e010500" + "data": "0x00051c14040500060210000b020c00090203a408020300060204a40c020200030203a410020100250201a4060201a4030201000b0201a4050202a403020300030201a4060201a4030202a404020500030201a4050201a4020201a4050208000e7d0a000ea40a000ea40a0001020c5601020a000e020a000e020500" }, { "filename": "head-cherry", - "data": "0x00011b15050900030f0a000400010f0200070f080005000b0f06000500010f0100070f08000600010f0200030f0a000600010f0300010f0b000700010f0300010f0a000700010f0400010f090004000318010f01180400010f044104000200091809410200010009180b41010001000918094101010141010009180d4109180d4109180d4109180d4109180d410100091806410318024101000100091805410118020103410100020009180941020004000518040005410400" + "data": "0x00011b1505090003100e000110020007100d000b100b000110010007100e000110020003101000011003000110120001100300011011000110040001100d00031901100119040001100442060009190942030009190b4202000919094201020142010009190d4209190d4209190d4209190d4209190d420100091906420319024202000919054201190202034203000919094206000519040005420400" }, { "filename": "head-chicken", - "data": "0x00031814080500015501000355060004000755050003000855050002000287075503870200010006870455048701000100098701550487010010871087108710871087108710871087088704130487088706130287088704550487088704550487" + "data": "0x000318140805000156010003560a000756080008560700028807560388030006880456048802000988015604880100888804140c8806140a8804560c8804560488" }, { "filename": "head-chilli", - "data": "0x00041c16050600081c090004000a1c09000200081c0d0001000a1c0c000100071c0224011c0c00041c07240c00011c0a240c0001000a240c0001000a240c0001000b240b0001000b240b0002000b240900012402000c240700022403000d2404000324040005240523092405001124010006000f24020007000c2404000a0007240600" + "data": "0x00041c16050600081d0d000a1d0b00081d0e000a1d0d00071d0225011d0c00041d07250c00011d0a250d000a250d000a250d000b250c000b250d000b250900012502000c250700022503000d250400032504000525052409250500112507000f2509000c250e0007250600" }, { "filename": "head-chipboard", @@ -1110,834 +1112,834 @@ }, { "filename": "head-chips", - "data": "0x00021c19040d0001230a000c000107022309000b000307022308000a000207010102070223070009000287050702230600080004870507022305000700028701010387050703420300060002870101058705070242030005000a87050701420123020004000c8705070223010003000e8705070223020001070f8705070123010003070f870407010005070f870207020006070f870300010006070d870200014201000200060703870214068702000242010003000607098702000342010004000607078707001800180015000342150002420100150001420200" + "data": "0x00021c19040d0001241600010702241400030702241200020701020207022410000288050702240e000488050702240c000288010203880507034309000288010205880507024308000a8805070143012406000c880507022404000e8805070224020001070f8805070124010003070f880407010005070f880207020006070f88040006070d88020001430300060703880215068802000243040006070988020003430500060707884c00034315000243160001430200" }, { "filename": "head-chocolate", - "data": "0x000319140701000185010e039701850397080001000185010e028501970385019708000100020e0985060001000185010e03970185039701850197060001000185010e028501970385019703850197018503000100020e0c85030001000185010e03970185039701850397018502970100038c0f06128c128c128c128c128c010002890e190100010010190100010010190100010003190c8901190100010010190100" + "data": "0x000319140701000186010f03980186039809000186010f02860198038601980900020f098607000186010f0398018603980186019807000186010f02860198038601980386019801860400020f0c8604000186010f03980186039801860398018602980100038d0f065a8d0100028a0e1a0200101a0200101a0200031a0c8a011a0200101a0100" }, { "filename": "head-cloud", - "data": "0x00041c14040b000501080009000901060008000b01050007000d01040006000f0103000400110103000200140102000100150102000100150102001601020017010100180118010100170101001701020015010100040012010200" + "data": "0x00041c14040b000502110009020e000b020c000d020a000f0207001102050014020300150203001502020016020200170201003002010017020100170202001502050012020200" }, { "filename": "head-clover", - "data": "0x00041d16070400031d0500031c07000300051d0300051c06000300051d0300051c06000100031c051d0100061c021d0400041c061d041c051d0300051c051d031c061d0300061c010f021d031c010f061d03000100061c010f011d021c010f061d04000300051c010f011c010f051d06000400021d031c010f031c021d07000300051d010f011c010f051c06000100061d010f021c011d010f061c0400061d010f031c021d010f061c0300061d031c051d051c0300051d041c011d055c041c0100020f0100021d061c010f051d031c040f0300051c030f051d050f01000300051c0300051d06000400031c0500031d0700" + "data": "0x00041d16070400031e0500031d0a00051e0300051d0900051e0300051d0700031d051e0100061d021e0400041d061e041d051e0300051d051e031d061e0300061d0110021e031d0110061e0400061d0110011e021d0110061e0700051d0110011d0110051e0a00021e031d0110031d021e0a00051e0110011d0110051d0700061e0110021d011e0110061d0400061e0110031d021e0110061d0300061e031d051e051d0300051e041d011e055d041d010002100100021e061d0110051e031d04100300051d0310051e05100400051d0300051e0a00031d0500031e0700" }, { "filename": "head-clutch", - "data": "0x00071b14030b0004120900020009760412097602000876015b0412015b087602000876065b087602000812015b04ad015b0812010001120876015b0412015b087601000112097604120976015b0100097604120976015b0100097604120976020009760412097602000976041209760200097601010123010101230101087602000976041209760200097604120976" + "data": "0x00071b14030b0004130b0009770413097702000877015c0413015c087702000877065c087702000813015c04ad015c0813010001130877015c0413015c087701000113097704130977015c0100097704130977015c0100097704130977020009770413097702000977041309770200097701020124010201240102087702000977041309770200097704130977" }, { "filename": "head-coffeebean", - "data": "0x0005191608040004ae010004ae0400020005ae01340135013405ae0200010002ae013403ae01340123013406ae010002ae013404ae01340123013407ae01ae013405ae01340123013407ae01ae013405ae01340123013407ae01ae013405ae01340123013407ae07ae01340123013407ae07ae01340123013407ae07ae01340123013407ae07ae01340123013407ae07ae01340123013407ae07ae01340123013407ae04ae032301340123013407ae07ae01340123013407ae010006ae01340123013406ae0100020005ae01340135013405ae0200040004ae010004ae0400" + "data": "0x0005191608040004ae010004ae060005ae01350136013505ae030002ae013503ae01350124013506ae010002ae013504ae01350124013508ae013505ae01350124013508ae013505ae01350124013508ae013505ae0135012401350eae0135012401350eae0135012401350eae0135012401350eae0135012401350eae0135012401350eae0135012401350bae03240135012401350eae01350124013507ae010006ae01350124013506ae030005ae01350136013505ae060004ae010004ae0400" }, { "filename": "head-cone", - "data": "0x0003191407080002240800080002240800070004240700070004240700070004240700060006240600060006af0600060006af0600050008af050005000824050005000824050004000a24040004000aaf040004000aaf040003000caf030003000c24030004240c4802241224" + "data": "0x000319140708000225100002250f0004250e0004250e0004250d0006250c0006af0c0006af0b0008af0a0008250a00082509000a2508000aaf08000aaf07000caf06000c25030004250c491425" }, { "filename": "head-console-handheld", - "data": "0x00031914071203010310100103010301100f79010301030110077901b0077901030103011005790510017901b0011001b00179010301030110067903b00279011001b0011001790103010301100179021001790110017901b0017901b0027901b0011001b001790103010301100f790103010301100f790103010301100f790103010301100f790103010301100f790103010301100f7901031203020301b10f03010303b1020301b1010301b1010303b2010303240103020301b1020301b1010301b1020303b20103032401031203" + "data": "0x000319140713031011020301110f7a02030111077a01b0077a02030111057a0511017a01b0011101b0017a02030111067a03b0027a011101b00111017a02030111017a0211017a0111017a01b0017a01b0027a01b0011101b0017a020301110f7a020301110f7a020301110f7a020301110f7a020301110f7a020301110f7a150301b1100303b1020301b1010301b1010303b201030325030301b1020301b1010301b1020303b2010303251303" }, { "filename": "head-cookie", - "data": "0x00031a160607000698070005000a98050003000e9803000200079801850898020002000d98018502980200010012980100010012980100149814981498149814980f980285039801000e98028502980100010003980285029801850a980100020002980285029805850598020002000698018509980200030004980185049801850498030005000a980500070006980700" + "data": "0x00031a1606070006990c000a9908000e99050007990186089904000d99018602990300129902001299010073990286039901000e9902860299020003990286029901860a99030002990286029905860599040006990186099905000499018604990186049908000a990c0006990700" }, { "filename": "head-cordlessphone", - "data": "0x000a1d1402020009030db10303020005030389010301b1028801b1028801b1028802b1018901b103030200020301b102030389010301b1028801b1028801b1028802b1018901b1030302000503038901030db1010301230103020005030389010301b1028801b1028801b1028804b10103012301030200010301b1010301b101030389010301b1028801b1028801b1028804b1010301230103020005030389010301b1028801b1028801b1028804b101030123010302230503038901030db10103012301030223020301b102030389010301b1028801b1028801b1028802b1018801b1010301230103020005030389010301b1028801b1028801b1028802b1018801b10303020009030db10303" + "data": "0x000a1d1402020009030db1030302000503038a010301b1028901b1028901b1028902b1018a01b103030200020301b10203038a010301b1028901b1028901b1028902b1018a01b1030302000503038a01030db101030124010302000503038a010301b1028901b1028901b1028904b10103012401030200010301b1010301b10103038a010301b1028901b1028901b1028904b101030124010302000503038a010301b1028901b1028901b1028904b101030124010302240503038a01030db10103012401030224020301b10203038a010301b1028901b1028901b1028902b1018901b101030124010302000503038a010301b1028901b1028901b1028902b1018901b10303020009030db10303" }, { "filename": "head-cottonball", - "data": "0x00021c16040a0001010d0009000301014b02010200010106000400010102000201014b0701070005000501014b0401014b030102000101020004000101014b0401014b0501014b0401030004000201014b0a01014b0201040003000301014b0601014b0301014b0301030003000101014b0201014b0601014b0401014b0101030001000201014b0301014b0601014b0701020002000501014b0d01014b020002000401014b0f01020002001101014b02010100010101001201014b03010100010101000301014b0d01014b0201020003000101014b0d01014b0201030003000401014b0201014b0201014b0301014b0301030004000301014b0301024b070101000101020003000301014b0301014b0201014b0401014b010104000500014b0d01050007000801014b0101070009000101014b0301014b0900" + "data": "0x00021c16040a00010216000302014c0202020001020a00010202000202014c07020c000502014c0402014c03020200010206000102014c0402014c0502014c040207000202014c0a02014c020207000302014c0602014c0302014c030206000102014c0202014c0602014c0402014c010204000202014c0302014c0602014c070204000502014c0d02014c04000402014c0f0204001102014c02020100010201001202014c03020100010201000302014c0d02014c020205000102014c0d02014c020206000402014c0202014c0202014c0302014c030207000302014c0302024c07020100010205000302014c0302014c0202014c0402014c01020900014c0d020c000802014c010210000102014c0302014c0900" }, { "filename": "head-cow", - "data": "0x00061914060300017f0323057f052302000300017f0323057f052302000100037f0323057f0523017f01000c7f0523027f137f047f02230d7f030003230b7f020003000323047f0323047f02000300077f0323047f02000300077f0323047f02000300027f0e5f03000123017f045f0208035f0208035f030002230e5f03000223035f0908025f030002230e5f" + "data": "0x0006191406030001800324058005240500018003240580052403000380032405800524018001000c800524198002240d80030003240b800500032404800324048005000780032404800500078003240480050002800e6003000124018004600208036002080360030002240e6003000224036009080260030002240e60" }, { "filename": "head-crab", - "data": "0x00021b1405040004130600041304000200071304000713020001000913020009130100031302b30c0002b303130a1302000a130913040009130213010005130600051301000213021307000123020001230700021302130100101301000213021301001013010002131613161316130300101303000300101303000300101303000300061304b306130300030010130300030010130300" + "data": "0x00021b14050400041406000414060007140400071403000914020009140100031402b30c0002b30d140200131404000b14010005140600051401000414070001240200012407000414010010140100041401001014010044140300101406001014060010140600061404b3061406001014060010140300" }, { "filename": "head-crane", - "data": "0x00061f1405060005b40f0004000ab40c0003000cb40b00020003b4050106230a00010002b406010823090001b40801092308000901072304b606000a01052308b60300060109230bb6050107230e00040108230e00010002010a230d00020002010323040105230a00030002010d230800040002010c230800" + "data": "0x00061f1405060005b413000ab40f000cb40d0003b4050206240b0002b406020824090001b40802092408000902072404b606000a02052408b60300060209240bb6050207240e00040208240f0002020a240f0002020324040205240d0002020d240c0002020c240800" }, { "filename": "head-croc-hat", - "data": "0x00061e150801000e23070001000e2307001023060001000e1d070001000e1d070001000e1d070001000e1d070001000e1d070001000e1d070001000e1d07000100151d0100151d0100031d0323021d0423021d0423031d0100051d0123021d0123021d0123021d0123021d0123031d0100051d0423021d0423021d0323011d0100151d" + "data": "0x00061e150801000e2408000e240700102407000e1e08000e1e08000e1e08000e1e08000e1e08000e1e08000e1e0800151e0100151e0100031e0324021e0424021e0424031e0100051e0124021e0124021e0124021e0124021e0124031e0100051e0424021e0424021e0324011e0100151e" }, { "filename": "head-crown", - "data": "0x00041a14060100015b0700025b0700015b01000100015b0700025b0700015b01000100025b0500045b0500025b0100028b012b015b0300015b041d015b0300015b012b0241018b0154012b025b0100025b011d029b010f025b0100025b012b011801410254012b055b021d020f055b012b02180100125b01000100125b01000100125b01000100125b01000100125b01000100125b01000100125b01000100125b010002000135052b0435052b013502000100125b01000100125b0100" + "data": "0x00041a14060100015c0700025c0700015c0200015c0700025c0700015c0200025c0500045c0500025c0100028c012c015c0300015c041e015c0300015c012c0242018c0155012c025c0100025c011e029c0110025c0100025c012c011901420255012c055c021e0210055c012c02190100125c0200125c0200125c0200125c0200125c0200125c0200125c0200125c03000136052c0436052c01360300125c0200125c0100" }, { "filename": "head-crt-bsod", - "data": "0x00051a15040400120204001202020004020166025a01660a5a02020602025a01660b5a020206020166025a01660a5a020206020e5a020206020e5a020206020e5a020206020e5a020202b104020e5a020206020e5a020202b104020e5a020206020e5a020202b104020e5a02020d02012301020123060202000a0201230102012301020123050204001202" + "data": "0x00051a15040400120104001201020004010167025b01670a5b0801025b01670b5b08010167025b01670a5b08010e5b08010e5b08010e5b08010e5b020102b104010e5b08010e5b020102b104010e5b08010e5b020102b104010e5b0f01012401010124060102000a0101240101012401010124050104001201" }, { "filename": "head-crystalball", - "data": "0x00021a14060700062d07000500022d06b7022d05000400012d0ab7012d04000300012d07b7012d04b7012d03000200012d03b7012d0ab7012d02000100012d03b7012d01b7012d05b7012d04b7012d01000100012d04b7012d05b7032d03b7012d0100012d0cb7012d05b7012d012d07b7012d0ab7012d012d12b7012d012d12b7012d012d12b7012d012d12b7012d0100012d10b7012d01000100012d10b7012d01000200012d0eb7012d0200020010b80200020005b8072304b80200020010b80200" + "data": "0x00021a14060700062e0c00022e06b7022e0900012e0ab7012e0700012e07b7012e04b7012e0500012e03b7012e0ab7012e0300012e03b7012e01b7012e05b7012e04b7012e0200012e04b7012e05b7032e03b7012e0100012e0cb7012e05b7022e07b7012e0ab7022e12b7022e12b7022e12b7022e12b7012e0100012e10b7012e0200012e10b7012e0300012e0eb7012e040010b8040005b8072404b8040010b80200" }, { "filename": "head-diamond-blue", - "data": "0x00051a18060500024a0104044a0104024a05000400034a0104044a0104034a04000300034a0104064a0104034a03000200044a0104064a0104044a02000100044a0101084a0104044a01000204010101040301010401010b04054a0101084a0104054a054a0104084a0104054a054a0104084a0104054a054a0104084a0104054a14040100054a0104064a0104054a01000200044a0104064a0104044a02000300044a0104044a0104044a03000400034a0104044a0104034a04000500024a0104044a0104024a05000600024a0104024a0104024a06000700014a0104024a0104014a070008000104024a010408000900024a0900" + "data": "0x00051a18060500024b0104044b0104024b0900034b0104044b0104034b0700034b0104064b0104034b0500044b0104064b0104044b0300044b0102084b0104044b01000204010201040302010401020b04054b0102084b01040a4b0104084b01040a4b0104084b01040a4b0104084b0104054b14040100054b0104064b0104054b0300044b0104064b0104044b0500044b0104044b0104044b0700034b0104044b0104034b0900024b0104044b0104024b0b00024b0104024b0104024b0d00014b0104024b0104014b0f000104024b01041100024b0900" }, { "filename": "head-diamond-red", - "data": "0x00051a1806050002b9014204b9014202b90500040003b9014204b9014203b90400030003b9014206b9014203b90300020004b9014206b9014204b90200010004b9010108b9014204b901000242010101420301014201010b4205b9010108b9014205b905b9014208b9014205b905b9014208b9014205b905b9014208b9014205b91442010005b9014206b9014205b90100020004b9014206b9014204b90200030004b9014204b9014204b90300040003b9014204b9014203b90400050002b9014204b9014202b90500060002b9014202b9014202b90600070001b9014202b9014201b907000800014202b901420800090002b90900" + "data": "0x00051a1806050002b9014304b9014302b9090003b9014304b9014303b9070003b9014306b9014303b9050004b9014306b9014304b9030004b9010208b9014304b901000243010201430302014301020b4305b9010208b901430ab9014308b901430ab9014308b901430ab9014308b9014305b91443010005b9014306b9014305b9030004b9014306b9014304b9050004b9014304b9014304b9070003b9014304b9014303b9090002b9014304b9014302b90b0002b9014302b9014302b90d0001b9014302b9014301b90f00014302b90143110002b90900" }, { "filename": "head-dictionary", - "data": "0x00051b150501000801040008010100014a01010372010103720101020001010372010103720101014a014a1401014a014a010103720101037204010372010103720101014a014a1401014a014a010103720101037204010372010103720101014a014a1401014a014a010103720d0102720101014a014a1401014a014a010103720d0102720101014a014a1401014a014a010103720d0102720101014a014a070106410701014a014a1401014a014a1401014a0a4a02010a4a0900044a0900" + "data": "0x00051b150501000802040008020100014b01020373010203730102020001020373010203730102024b1402024b010203730102037304020373010203730102024b1402024b010203730102037304020373010203730102024b1402024b010203730d0202730102024b1402024b010203730d0202730102024b1402024b010203730d0202730102024b070206420702024b1402024b14020b4b02020a4b0900044b0900" }, { "filename": "head-dino", - "data": "0x00071d15080300061d0c000300061d0c00151d151d151d151d151d151d151d151d151d0100051d0301011d0301011d0301011d03010100051d0301011d0301011d0301011d03010100141d0100141d" + "data": "0x00071d15080300061e0f00061e0c00bd1e0100051e0302011e0302011e0302011e03020100051e0302011e0302011e0302011e03020100141e0100141e" }, { "filename": "head-dna", - "data": "0x00091d160304431200045501000126010004430c00045501000151010001000126010001550100044308000355014301000126010001510100010001260100015501000143010001510243060002550143010001430100012601000151010001000126010001550100014301000151010002430400025501000143010001430100012601000151010001000126010001550100014301000151010003430200025501430100014301000143010001260100015101000100012601000155010001430100015101000143010002430255010001430100014301000143010001260100015101000100014301000151010001260100015501000143020002550200014301000143010001550100014301000155010001000143010001510100012601000155010001430100025502430100014301000143010001550100014301000155010001000143010001510100012601000155010001430255020003430100014301000155010001430100015501000100014301000151010001260100015501000255040002430100014301000155010001430100015501000100014301000151010001260100035506000343010001550100014301000155010001000143010005550a000543010001550100055510000543" + "data": "0x00091d160304441200045601000127010004440c000456010001520200012701000156010004440800035601440100012701000152020001270100015601000144010001520244060002560144010001440100012701000152020001270100015601000144010001520100024404000256010001440100014401000127010001520200012701000156010001440100015201000344020002560144010001440100014401000127010001520200012701000156010001440100015201000144010002440256010001440100014401000144010001270100015202000144010001520100012701000156010001440200025602000144010001440100015601000144010001560200014401000152010001270100015601000144010002560244010001440100014401000156010001440100015602000144010001520100012701000156010001440256020003440100014401000156010001440100015602000144010001520100012701000156010002560400024401000144010001560100014401000156020001440100015201000127010003560600034401000156010001440100015602000144010005560a000544010001560100055610000544" }, { "filename": "head-dog", - "data": "0x00061a140603000e970300010004850d970185010005850d97028504850e97028504850e97028504850e97028504850e97028504850e9702850485049706380497028504850497063804970285048503970838039702850485019708380223020d013802850200039708380423013802000200039704380223010103230101012301380200020003970d380200" + "data": "0x00061a140603000e98040004860d980186010005860d9806860e9806860e9806860e9806860e9806860e980686049806390498068604980639049806860398083903980686019808390224020e0139028602000398083904240139040003980439022401020324010201240139040003980d390200" }, { "filename": "head-doughnut", - "data": "0x00031a160607000156056c07000500026c0156046c01ba026c050003000a6c01ba036c03000200086c016d056c021902000200026c02ba016c0119036c016d066c02000100076c0119016c0138056c0156026c01000100076c0538026c0156036c0100046c016d026c013804000138066c011c016c021c016c016d016c013806000138026d036c011c066c013806000138066c066c013806000138066c026c0156036c013806000138036c02ba016c026c0156036c023804000138026c0156046c0100076c0538036c0156026c01000100046c01ba066c0219056c01000200026c01ba046c0156086c02000200076c0156040e016d036c02000300026c0119096c016d016c030005000119096c05000700016c021c036c0700" + "data": "0x00031a160607000157056d0c00026d0157046d01ba026d08000a6d01ba036d0500086d016e056d021a0400026d02ba016d011a036d016e066d0300076d011a016d0139056d0157026d0200076d0539026d0157036d0100046d016e026d013904000139066d011d016d021d016d016e016d013906000139026e036d011d066d0139060001390c6d013906000139086d0157036d013906000139036d02ba036d0157036d023904000139026d0157046d0100076d0539036d0157026d0200046d01ba066d021a056d0300026d01ba046d0157086d0400076d0157040f016e036d0500026d011a096d016e016d0800011a096d0c00016d021d036d0700" }, { "filename": "head-drill", - "data": "0x00071c140502000e1401a4060001000f1401a4017e050001000f1401a4017e017c017e017c017e017c101401a4027e017c017e017c017e101401a4017e050001000f1401a4060001000f1401a4060002000e1401a406000500057e01a40c000500057e02a40b000500057e03a40a000500077e0b0004000114012301260123012601230814050004000e140500" + "data": "0x00071c140502000e1501a407000f1501a4017f06000f1501a4017f017d017f017d017f017d101501a4027f017d017f017d017f101501a4017f06000f1501a407000f1501a408000e1501a40b00057f01a41100057f02a41000057f03a40f00077f0f00011501240127012401270124081509000e150500" }, { "filename": "head-duck", - "data": "0x00041d1407070006010900050005010c001001060011010500110105001101050011010500110105001101050011010500110105001101050011010500050110460100050104460142014601420a4605011146010005011046" + "data": "0x00041d1407070006020e0005020c001002060011020500110205001102050011020500110205001102050011020500110205001102050011020500050210470100050204470143014701430a4705021147010005021047" }, { "filename": "head-ducky", - "data": "0x00031c14040c00082604000a000526045102260300090005260251022302510126030009000526025102230251012601140200090006260451022603140100022607000a26031401000100052605000a260300162602001726010018261826182601001726010017260200162602000b26018a0926010003000726038a09260200050010260300" + "data": "0x00031c14040c0008270e000527045202270c00052702520224025201270c000527025202240252012701150b0006270452022703150100022707000a2703150200052705000a2703001627020017270100482701001727010017270200162702000b27018b092704000727038b0927070010270300" }, { "filename": "head-earth", - "data": "0x00031a160607000643070005000a43050003000343011c0543011c0243021c030002000243031c0543061c020002000243021c0543071c02000100011c0243031c0343091c01000100021c0243011c0443091c0100031c0843091c031c0d43041c041c0743091c051c0543091c0143061c0443081c0243061c0443071c03430100031c0643071c024301000100021c0843041c044301000200011c0943041c024302000200011c0443081c0343020003000e43030005000a430500070006430700" + "data": "0x00031a1606070006440c000a4408000344011d0544011d0244021d05000244031d0544061d04000244021d0544071d0300011d0244031d0344091d0200021d0244011d0444091d0100031d08440c1d0d44081d07440e1d0544091d0144061d0444081d0244061d0444071d03440100031d0644071d02440200021d0844041d04440300011d0944041d02440400011d0444081d034405000e4408000a440c0006440700" }, { "filename": "head-egg", - "data": "0x00011915070700040107000500020102af040105000400010101af010102af020102af0101040003000c0103000200010101af020101af020101af060102000200010101af060102af020101af010102000100010101af020101af040102af030101af010101000100010101af0c0101af010101000100010101af0b0101af02010100100101af0101050101af0a0101af0101020101af0a0101af020101af0101020101af0a0101af020101af0101120112010e0102af02010100100101000100030101af080101af0301010002000501021e0701020003000c0103000500050101af02010500" + "data": "0x0001191507070004020c00020202af04020900010201af010202af020202af010207000c020500010201af020201af020201af06020400010201af060202af020201af01020300010201af020201af040202af030201af01020200010201af0c0201af01020200010201af0b0201af02020100100201af060201af0a0201af030201af0a0201af020201af030201af0a0201af020201af330202af0202010010020200030201af080201af030203000502021f070205000c020800050201af02020500" }, { "filename": "head-faberge", - "data": "0x000119140608000326080005000126020701260107012602070126050005000207012603070126020705000400010f0407010f0407010f040003000d07030003000107012604070126040701260107030002000107012601890126020701260189012602070126018901260107020002000207012604070126040701260207020001001107010001001126010013260100118a010001001107010001001107010002000f07020002000f07020002000f07020003000d070300030006260323032604000500098a0500" + "data": "0x0001191406080003270d0001270207012701070127020701270a000207012703070127020709000110040701100407011007000d0706000107012704070127040701270107050001070127018a012702070127018a012702070127018a01270107040002070127040701270407012702070300110702001127010013270100118b020011070200110703000f0704000f0704000f0705000d0706000627032403270900098b0500" }, { "filename": "head-factory-dark", - "data": "0x00031a14080300057c0a000100010e0300087c05000100020e0b00047c010002240f000100020e0400010e0300010e0300010e02000100020e0300020e0200020e0200020e0200040e0100030e0100030e0100030e0200100e0200100e0200100e0200100e0200100e0200100e0200100e0200100e0200020e0172010e026d010e026d010e0172050e0200100e0200100e0200" + "data": "0x00031a14080300057d0b00010f0300087d0600020f0b00047d010002251000020f0400010f0300010f0300010f0300020f0300020f0200020f0200020f0200040f0100030f0100030f0100030f0200100f0200100f0200100f0200100f0200100f0200100f0200100f0200100f0200020f0173010f026e010f026e010f0173050f0200100f0200100f0200" }, { "filename": "head-fan", - "data": "0x00031a160607000651070005000351010001510200035105000300035102000151020001510200035103000200035102000151027e0151027e01510200025102000200025102000151027e0151027e0151027e015101000151020001000251020001510100017e0151027e0151027e0151017e010002510100010001510200015102000151027e0151027e0151017e01000151010001510100025101000151020001510100017e0262017e0151017e0100015102000251015101000151027e0151020004620200015102000151010001510251027e0151027e06620151027e01510200015101510100017e0151027e01510662027e0151017e01000251015101000151027e0151027e0462027e0151027e01510100015102510100017e0151027e0151017e0262027e0151027e0151017e02510100015101000151027e0151027e01510100017e0151027e0151027e01510100010002510100017e0151027e01510100017e0151027e0151027e025101000200015101000151027e015102000151027e0151017e010002510200020002510200015102000151027e01510200035102000300035102000151020001510200035103000500035102000151010003510500070006510700" + "data": "0x00031a1606070006520c0003520100015202000352080003520200015202000152020003520500035202000152027f0152027f0152020002520400025202000152027f0152027f0152027f01520100015203000252020001520100017f0152027f0152027f0152017f01000252020001520200015202000152027f0152027f0152017f01000152010001520100025201000152020001520100017f0263017f0152017f010001520200035201000152027f015202000463020001520200015201000352027f0152027f06630152027f0152020002520100017f0152027f01520663027f0152017f0100035201000152027f0152027f0463027f0152027f0152010003520100017f0152027f0152017f0263027f0152027f0152017f02520100015201000152027f0152027f01520100017f0152027f0152027f0152020002520100017f0152027f01520100017f0152027f0152027f02520300015201000152027f015202000152027f0152017f01000252040002520200015202000152027f015202000352050003520200015202000152020003520800035202000152010003520c0006520700" }, { "filename": "head-fence", - "data": "0x00041d1403020001bb060001bb060001bb060001340200010003bb0400013402bb040003bb040001bb013401bb010005bb020001bb013403bb020005bb020002bb013402bb05bb020001bb013403bb020003bb013401bb020002bb013402bb03bb013401bb020001bb013403bb020003bb013401bb020005bb03bb013401bb023401bb013403bb023403bb013401bb023402bb013402bb03bb013401bb023401bb013403bb023405bb023405bb03bb013401bb023401bb013403bb023405bb023405bb03bb013401bb020005bb020005bb020005bb013404bb020005bb020001bb013403bb020003bb013401bb013404bb020005bb020001bb013403bb020003bb013401bb013402bb013401bb023405bb023401bb013403bb023403bb013401bb013404bb023405bb023401bb013403bb023401bb013401bb013401bb013404bb023405bb023401bb013403bb023403bb013401bb013404bb020005bb02000585020003bb013401bb05bb020003bb013401bb02000585020003bb013401bb05bb020003bb013401bb020001bb013403bb020005bb" + "data": "0x00041d1403020001bb060001bb060001bb06000135030003bb0400013502bb040003bb040001bb013501bb010005bb020001bb013503bb020005bb020002bb013507bb020001bb013503bb020003bb013501bb020002bb013505bb013501bb020001bb013503bb020003bb013501bb020008bb013501bb023501bb013503bb023503bb013501bb023502bb013505bb013501bb023501bb013503bb023505bb023508bb013501bb023501bb013503bb023505bb023508bb013501bb020005bb020005bb020005bb013504bb020005bb020001bb013503bb020003bb013501bb013504bb020005bb020001bb013503bb020003bb013501bb013502bb013501bb023505bb023501bb013503bb023503bb013501bb013504bb023505bb023501bb013503bb023501bb013501bb013501bb013504bb023505bb023501bb013503bb023503bb013501bb013504bb020005bb02000586020003bb013506bb020003bb013501bb02000586020003bb013506bb020003bb013501bb020001bb013503bb020005bb" }, { "filename": "head-film-35mm", - "data": "0x00031814050800062305000800062305000300102303420726078702260100014201000726078702260342072607870226034207260787022603420726078702260342072607870226034207260787022603420726078702260342072607870226034207260787022603420726078702260342072607870226010001420100022603ae022607870226034207260787022603001023" + "data": "0x0003181405080006240d0006240800102403430727078802270100014301000727078802270343072707880227034307270788022703430727078802270343072707880227034307270788022703430727078802270343072707880227034307270788022703430727078802270343072707880227010001430100022703ae022707880227034307270788022703001024" }, { "filename": "head-film-strip", - "data": "0x00051b140516bc010002bc010002bc010002bc010002bc010002bc010002bc010002bc010016bc02bd01bc10bd01bc02bd02bd01bc10bd01bc02bd02bd01bc10bd01bc02bd02bd01bc10bd01bc02bd01bd017b01bc10bd01bc02bd02bd01bc10bd01bc02bd02bd01bc10bd01bc02bd02bd01bc10bd01bc02bd02bd01bc10bd01bc02bd02bd01bc10bd01bc02bd16bc010002bc010002bc010002bc010002bc010002bc010002bc010002bc010016bc" + "data": "0x00051b140516bc010002bc010002bc010002bc010002bc010002bc010002bc010002bc010016bc02bd01bc10bd01bc04bd01bc10bd01bc04bd01bc10bd01bc04bd01bc10bd01bc03bd017c01bc10bd01bc04bd01bc10bd01bc04bd01bc10bd01bc04bd01bc10bd01bc04bd01bc10bd01bc04bd01bc10bd01bc02bd16bc010002bc010002bc010002bc010002bc010002bc010002bc010002bc010016bc" }, { "filename": "head-fir", - "data": "0x00011f18010e00020f0e000d00040f0d000c00060f0c000b00030f015c040f0b000a00030f015c060f0a000900030f015c040f015c030f090008000a0f015c030f080007000c0f015c030f07000600120f06000500140f05000400160f04000300180f030002001a0f020001001c0f01001e0f0600120f06000500140f05000400160f04000300060f065c0c0f030002001a0f02001e000700010f0e00010f07000600020f0e00020f06000500030f0e00030f0500" + "data": "0x00011f18010e0002101b0004101900061017000310015d041015000310015d061013000310015d0410015d031011000a10015d03100f000c10015d03100d0012100b001410090016100700181005001a1003001c1001001e10060012100b0014100900161007000610065d0c1005001a10270001100e0001100d0002100e0002100b0003100e0003100500" }, { "filename": "head-firehydrant", - "data": "0x00021c14040b0002be0b00090006be0900080002bf01be02bf01be02bf0800070003bf01be02bf01be03bf0700060003bf01be04bf01be03bf0600060003bf01be04bf01be03bf0600050003bf01be06bf01be03bf0500050003bf01be06bf01be03bf0500030012be0300030012be030005000ebf050005000ebf0500010002bf012310be012302bf0100010002bf012310be012302bf010001be02bf012310be012302bf01be01be02bf012310be012302bf01be010002bf012303be0b2302be012302bf0100010002bf012310be012302bf010005000ebf0500" + "data": "0x00021c14040b0002be140006be110002bf01be02bf01be02bf0f0003bf01be02bf01be03bf0d0003bf01be04bf01be03bf0c0003bf01be04bf01be03bf0b0003bf01be06bf01be03bf0a0003bf01be06bf01be03bf080012be060012be08000ebf0a000ebf060002bf012410be012402bf020002bf012410be012402bf010001be02bf012410be012402bf02be02bf012410be012402bf01be010002bf012403be0b2402be012402bf020002bf012410be012402bf06000ebf0500" }, { "filename": "head-flamingo", - "data": "0x00031b14050c00042003ba03000a00062001ba012301ba012002000900072003ba022001000800042005000320025f070004200800035f070004200800025f010e070005200800020e080006200600020e090008200300010e01000a00092003000b00092002000d00082001000f00062001000100156a166a0b20060905201620010014200100" + "data": "0x00031b14050c00042103ba0d00062101ba012401ba01210b00072103ba02210900042105000321026007000421080003600700042108000260010f070005210800020f080006210600020f090008210300010f0b0009210e0009210f0008211000062102002b6b0b2106091b21010014210100" }, { "filename": "head-flower", - "data": "0x00031b18050a00024f0a000900044f0900040002ba0200019a044f019a020002ba0400030005ba019a044f019a05ba0300020007ba019a024f019a07ba0200020007ba041307ba0200030004ba0213046d021304ba0300030003ba0113086d011303ba03000200029a02ba0113086d011302ba029a02000100034f019a01130a6d0113019a034f0100054f01130a6d0113054f054f01130a6d0113054f0100034f019a01130a6d0113019a034f01000200029a02ba0113086d011302ba029a0200030003ba0113086d011303ba0300030004ba0213016d0385021304ba0300020007ba041307ba0200020007ba019a024f019a07ba0200030005ba019a044f019a05ba0300040002ba0200019a044f019a020002ba04000900044f09000a00024f0a00" + "data": "0x00031b18050a000250130004500d0002ba0200019b0450019b020002ba070005ba019b0450019b05ba050007ba019b0250019b07ba040007ba041407ba050004ba0214046e021404ba060003ba0114086e011403ba0500029b02ba0114086e011402ba029b03000350019b01140a6e0114019b03500100055001140a6e01140a5001140a6e0114055001000350019b01140a6e0114019b03500300029b02ba0114086e011402ba029b050003ba0114086e011403ba060004ba0214016e0386021404ba050007ba041407ba040007ba019b0250019b07ba050005ba019b0450019b05ba070002ba0200019b0450019b020002ba0d000450130002500a00" }, { "filename": "head-fox", - "data": "0x00031c1904050003011000040005010f000300014205010800022301000223020002000242050108000242010002420200010004420301090006420100074204000223064201110142011102420542070006010642044209000b01054209000a010100054209000901020004420a00080104000f4205010400104204010400114203010400124202010400054207010742010104000542062302010642010004000542090104420200040001420e0002420300010004420e00014204000100014211000242030001000123120002420223010001231600" + "data": "0x00031c190405000302140005021200014305020800022401000224040002430502080002430100024303000443030209000643010007430400022406430112014301120743070006020a4309000b02054309000a020100054309000902020004430a00080204000f43050204001043040204001143030204001243020204000543070207430102040005430624020206430500054309020443060001430e000243040004430e000143050001431100024304000124120002430224010001241600" }, { "filename": "head-frog", - "data": "0x00061914070300051c0300041c03000200071c0100061c02000100041c020f0a1c01000100041c020f0a1c010001000d1c020f011c010001000d1c020f011c01000100101c01000100101c01000100020f0e1c0100011c020f0f1c121c121c126702670e5c0267010010670100" + "data": "0x00061914070300051d0300041d0500071d0100061d0300041d02100a1d0200041d02100a1d02000d1d0210011d02000d1d0210011d0200101d0200101d020002100e1d0100011d0210331d14680e5d0268010010680100" }, { "filename": "head-garlic", - "data": "0x00051914070700010b0100010b0100010b06000800030b07000800030b070007000157030b0157060003000157030b0157030b0157030b03000200010b0157030b0157030b0157030b015702000100020b0157030b0157030b0157030b0157010b0100030b0157030b0157030b0157030b0157020b030b0157030b0157030b0157030b0157020b030b0157030b0157030b0157030b0157020b030b0157030b0157030b0157030b0157020b030b0157030b0157030b0157030b0157020b030b0157010b01c0010b0157030b0157030b0157020b030b0157020b04c0010b0157030b0157020b0100020b0157030b0157030b0157030b0157010b01000200010b0157030b0157030b0157030b01570200" + "data": "0x00051914070700010c0100010c0100010c0e00030c0f00030c0e000158030c015809000158030c0158030c0158030c0500010c0158030c0158030c0158030c01580300020c0158030c0158030c0158030c0158010c0100030c0158030c0158030c0158030c0158050c0158030c0158030c0158030c0158050c0158030c0158030c0158030c0158050c0158030c0158030c0158030c0158050c0158030c0158030c0158030c0158050c0158010c01c0010c0158030c0158030c0158050c0158020c04c0010c0158030c0158020c0100020c0158030c0158030c0158030c0158010c0300010c0158030c0158030c0158030c01580200" }, { "filename": "head-gavel", - "data": "0x000419140108000f34010008000f34010009000d23020009000d26020009000126015d0b26020009000126015d0b260200013401000234010004340d26020002000134020004340d26020001000234010005340d26020009000d26020009000d26020009000d26020008000f34010008000f2301000700118e0700118e07001123" + "data": "0x000419140108000f3509000f350a000d240b000d270b000127015e0b270b000127015e0b270200013501000235010004350d2704000135020004350d2703000235010005350d270b000d270b000d270b000d270a000f3509000f240800118f0700118f07001124" }, { "filename": "head-ghost-B", - "data": "0x00051b16030c00028c0a000b00048c09000200028c0700058c0600028c0200048c0400028c0104018c0104018c0400048c0200068c0200068c0200068c0300148c01000300148c01000300148c01000300148c01000400128c02000400128c02000400118c03000400118c030005000f8c040003000f8c0600118c07000400028c12000200048c1200" + "data": "0x00051b16030c00028d1500048d0b00028d0700058d0600028d0200048d0400028d0104018d0104018d0400048d0200068d0200068d0200068d0300148d0400148d0400148d0400148d0500128d0600128d0600118d0700118d08000f8d07000f8d0600118d0b00028d1400048d1200" }, { "filename": "head-glasses-big", - "data": "0x00091c120204000a8002000a80040001800501048002000180050104800400018005010480020001800501048005800501078005010480058005010780050104800180030001800501048002000180050104800180030001800501048002000180050104800180030001800501048002000180050104800400018005010480020001800501048004000a8002000a80" + "data": "0x00091c120204000a8102000a810400018105020481020001810502048104000181050204810200018105020981050207810502098105020781050205810300018105020481020001810502058103000181050204810200018105020581030001810502048102000181050204810400018105020481020001810502048104000a8102000a81" }, { "filename": "head-gnome", - "data": "0x00011a140609000241090009000241090008000441080007000641070007000641070006000841060006000841060005000a41050003000ec1030001c2010001c10ec201c1010001c202c201c10ec201c102c202c201c10ec201c102c202c201c10ec201c102c20200104c02000200104c02000200104c02000200104c0200020003c20123010101230101012301010123010101230101012302c20200020003c20b4102c202000300088a018e078a0100" + "data": "0x00011a14060900024212000242110004420f0006420e0006420d0008420c0008420b000a4208000ec1030001c2010001c10ec201c1010003c201c10ec201c104c201c10ec201c104c201c10ec201c102c20200104d0400104d0400104d0400104d040003c20124010201240102012401020124010201240102012402c2040003c20b4202c20500088b018f078b0100" }, { "filename": "head-goat", - "data": "0x00051d1805030001b10c00040d0400020002b10e0004b10200010002b10e0002b1017e022301b10100010002b10e0002b1017e04b101000fb1017e02b1017e02b1029802000eb1017e02b1017e01b1017e02b103000eb1027e02b1010002b1030010b1030001b10100030010b10500030010b10500030011b10400030011b10400020005b1017e0cb10400020005b1017e01230101012301010123010107b10300020004b1017e0ab1010003b10300020003b101000ab1040001b10300010002b1110001b1030003b1100002b1030001b1120001b1040001b1120001b10400" + "data": "0x00051d1805030001b10c00040e060002b10e0004b1030002b10e0002b1017f022401b1020002b10e0002b1017f04b101000fb1017f02b1017f02b1029902000eb1017f02b1017f01b1017f02b103000eb1027f02b1010002b1030010b1030001b1040010b1080010b1080011b1070011b1060005b1017f0cb1060005b1017f01240102012401020124010207b1050004b1017f0ab1010003b1050003b101000ab1040001b1040002b1110001b1030003b1100002b1030001b1120001b1040001b1120001b10400" }, { "filename": "head-goldcoin", - "data": "0x00031a160607000626070005000326042b0326050003000326022b0426022b0326030002000226022b0826022b0226020002000126012b0c26012b0126020001000226012b0c26012b0226010001000126012b092603290226012b012601000226012b032603290826012b02260126012b1026012b01260126012b1026012b01260126012b1026012b01260126012b1026012b01260226012b112601000126012b1026010001000226012b0f26010002000126012b02260129012604290426012b0126020002000226022b0826022b0226020003000326022b0426022b0326030005000326042b03260500070006260700" + "data": "0x00031a1606070006270c000327042c032708000327022c0427022c032705000227022c0827022c022704000127012c0c27012c012703000227012c0c27012c022702000127012c0927032a0227012c012701000227012c0327032a0827012c0327012c1027012c0227012c1027012c0227012c1027012c0227012c1027012c0327012c112701000127012c102702000227012c0f2703000127012c0227012a0127042a0427012c012704000227022c0827022c022705000327022c0427022c032708000327042c03270c0006270700" }, { "filename": "head-goldfish", - "data": "0x00051b1405020012210200030010950300010014210100162113210151022101211207015101070121012114070121012112070151010701210121140701210121140701210121140701210221080703250707022101000121070701140125012302250607012101000100022107070325060702210100020003210c070321020004000e210400" + "data": "0x00051b1405020012220500109604001422010029220152032212070152010702221407022212070152010702221407022214070222140703220807032607070222010001220707011501260124022606070122020002220707032606070222030003220c07032206000e220400" }, { "filename": "head-grouper", - "data": "0x00061d16020900010801000108010001080100010801000108090007000c08080006000f08060001000208020004080e7a040004080200137a020001000408157a01000508157a010001000408117a0108047a02000308107a02c5047a010004080e7a02c5047a0282020003080d7a01c5047a02820200010004080c7a01c5047a018204000508057a0208047a010801c5037a018205c501000408047a0108057a020801c5027a018201c5047a010004080200077a040801c5077a0200010002080600027a0508027a01c5047a04000c0003080c00" + "data": "0x00061d1602090001080100010801000108010001080100010810000c080e000f0807000208020004080e7b040004080200137b03000408157b01000508157b02000408117b0108047b02000308107b02c5047b010004080e7b02c5047b0283020003080d7b01c5047b0283030004080c7b01c5047b018304000508057b0208047b010801c5037b018305c501000408047b0108057b020801c5027b018301c5047b010004080200077b040801c5077b030002080600027b0508027b01c5047b100003080c00" }, { "filename": "head-hair", - "data": "0x00031e15020800068e0100058e08000700018e0626018e0526018e07000600018e0126068e0126058e0126018e06000300018e0100018e0126018e0626018e0526018e0126018e0100018e03000400018e0126018e0126068e0126058e0126018e0126018e04000400018e0126018e0126018e0500018e0400018e0126018e0126018e04000400018e0126018e0126018e0a00018e0126018e0126018e04000400018e0126018e0126018e0a00018e0126018e0126018e04000200018e0100018e0126018e0126018e0a00018e0126018e0126018e0100018e02000300018e0126018e0126018e0c00018e0126018e0126018e03000300018e0126018e0126018e0c00018e0126018e0126018e03000300018e0126018e0126018e0c00018e0126018e0126018e03000300018e0126018e0126018e0c00018e0126018e0126018e03000100018e0100018e0126018e0126018e0c00018e0126018e0126018e0100018e01000200018e0126018e0126018e0e00018e0126018e0126018e02000200018e0126018e0126018e0e00018e0126018e0126018e02000200018e0126018e0126018e0e00018e0126018e0126018e02000200018e0126018e0126018e0e00018e0126018e0126018e0200028e0100018e0100018e1000018e0100018e0100028e" + "data": "0x00031e15020800068f0100058f0f00018f0627018f0527018f0d00018f0127068f0127058f0127018f0900018f0100018f0127018f0627018f0527018f0127018f0100018f0700018f0127018f0127068f0127058f0127018f0127018f0800018f0127018f0127018f0500018f0400018f0127018f0127018f0800018f0127018f0127018f0a00018f0127018f0127018f0800018f0127018f0127018f0a00018f0127018f0127018f0600018f0100018f0127018f0127018f0a00018f0127018f0127018f0100018f0500018f0127018f0127018f0c00018f0127018f0127018f0600018f0127018f0127018f0c00018f0127018f0127018f0600018f0127018f0127018f0c00018f0127018f0127018f0600018f0127018f0127018f0c00018f0127018f0127018f0400018f0100018f0127018f0127018f0c00018f0127018f0127018f0100018f0300018f0127018f0127018f0e00018f0127018f0127018f0400018f0127018f0127018f0e00018f0127018f0127018f0400018f0127018f0127018f0e00018f0127018f0127018f0400018f0127018f0127018f0e00018f0127018f0127018f0200028f0100018f0100018f1000018f0100018f0100028f" }, { "filename": "head-hardhat", - "data": "0x00041d1405050005c605c70900040006c701c605c70800030006c602c701c605c70700020007c701c602c701c605c70600020008c701c601c701c605c70600010009c701c602c705c601c70500010009c701c608c70500010009c701c608c70500010009c701c608c70500010009c701c608c70500010009c701c608c70500010009c701c608c70500010009c701c608c70500010003c70fc6050004c701c60d2301c605c704c701c60dc701c605c718c7" + "data": "0x00041d1405050005c605c70d0006c701c605c70b0006c602c701c605c7090007c701c602c701c605c7080008c701c601c701c605c7070009c701c602c705c601c7060009c701c608c7060009c701c608c7060009c701c608c7060009c701c608c7060009c701c608c7060009c701c608c7060009c701c608c7060003c70fc6050004c701c60d2401c609c701c60dc701c61dc7" }, { "filename": "head-heart", - "data": "0x00041c1704050005240400052405000300092401000824030002000624020106240201042402000100092401010524020101240101032401000100132401010224010014240101032418241824182401001624010001001624010002001424020002001424020003001224030004000724020101230624040005000e24050006000c24060007000a2407000900062409000b0002240b00" + "data": "0x00041c1704050005250400052508000925010008250500062502020625020204250300092501020525020201250102032502001325010202250100142501024b2501001625020016250300142504001425050012250700072502020124062509000e250b000c250d000a2510000625140002250b00" }, { "filename": "head-helicopter", - "data": "0x00031d14020d0002230c000400016104620261062302610462016103000d0002230c000d0002230c000a000720075603000100022006000220019a0120019a0120019a0120085602000100032004000320019a0120019a0120019a012009560100010002620e200556030102560162022301620d200556030102560162022301620d200556030102560100026202000c200a5606000b2008560101015607000a2008560101015608000920065602010156010009000820085602000a000e2003000c000123020001230b0007000e230600" + "data": "0x00031d14020d0002241000016204630262062402620463016210000224190002241600072107570400022106000221019b0121019b0121019b012108570300032104000321019b0121019b0121019b01210957020002630e210557030202570163022401630d210557030202570163022401630d210557030202570100026302000c210a5706000b2108570102015707000a21085701020157080009210657020201570a00082108570c000e210f0001240200012412000e240600" }, { "filename": "head-highheel", - "data": "0x00061b1405020003181100010005181000010006180f0008180e0008180e0008180e0008180e0009180d000b180b0001000c18090002000418020008180600030002180400091804000300021805000a1802000300021806000318042304180300025b07000a5b" + "data": "0x00061b14050200031912000519110006190f0008190e0008190e0008190e0008190e0009190d000b190c000c190b0004190200081909000219040009190700021905000a190500021906000319042404190300025c07000a5c" }, { "filename": "head-hockeypuck", - "data": "0x00051b150507000805070004000305081f03050400020002050e1f0205020001000105121f010501000105141f01050105141f01050105141f0105010d0105121f0105011f020d02050e1f0205010c011f040d0305081f0305020c021f070d0805060c011f040d030c020d010c010d090c021f070d0e0c011f0100030d030c020d0b0c011f01000200050d030c0105010d0205010d050c02000400030c020d090c04000700080c0700" + "data": "0x00051b1505070008050b00030508200305060002050e200205030001051220010501000105142002051420020514200105010e0105122001050120020e02050e200205010d0120040e030508200305020d0220070e0805060d0120040e030d020e010d010e090d0220070e0e0d01200100030e030d020e0b0d01200300050e030d0105010e0205010e050d0600030d020e090d0b00080d0700" }, { "filename": "head-horse-deepfried", - "data": "0x00061b15050900018e0100028e0900040003ad0100068e010003ad04000200028e03ad068e020003ad04000200028e07ad018e06ad04000100038e06ad036d05ad04000200028e07ad016d06ad04000200028e07ad016d06ad04000100038e07ad016d06ad04000200028e07ad016d06ad04000200028e07ad016d06ad04000100038e128a0200028e0e8a0123018a0123018a0100038e028a016d0123016d0123016d0123016d098a048e128a0100038e128a0100018e0100018e0e8a0400" + "data": "0x00061b15050900018f0100028f0d0003ad0100068f010003ad0600028f03ad068f020003ad0600028f07ad018f06ad0500038f06ad036e05ad0600028f07ad016e06ad0600028f07ad016e06ad0500038f07ad016e06ad0600028f07ad016e06ad0600028f07ad016e06ad0500038f128b0200028f0e8b0124018b0124018b0100038f028b016e0124016e0124016e0124016e098b048f128b0100038f128b0100018f0100018f0e8b0400" }, { "filename": "head-hotdog", - "data": "0x000317140905000489050002000183013906890139018302000100028301390689013902830100028301390289016d0219038901390283028301390389026d0119028901390283028301390589016d0119018901390283028301390389026d0119028901390283028301390289016d0219038901390283028301390389026d0119028901390283028301390589016d0119018901390283028301390389026d0119028901390283028301390289016d0219038901390283028301390389026d0119028901390283028301390589016d0119018901390283028301390389026d0119028901390283028301390289016d0219038901390283028301390389026d0119028901390283028301390589016d0119018901390283" + "data": "0x00031714090500048a07000184013a068a013a018403000284013a068a013a028401000284013a028a016e021a038a013a0484013a038a026e011a028a013a0484013a058a016e011a018a013a0484013a038a026e011a028a013a0484013a028a016e021a038a013a0484013a038a026e011a028a013a0484013a058a016e011a018a013a0484013a038a026e011a028a013a0484013a028a016e021a038a013a0484013a038a026e011a028a013a0484013a058a016e011a018a013a0484013a038a026e011a028a013a0484013a028a016e021a038a013a0484013a038a026e011a028a013a0484013a058a016e011a018a013a0284" }, { "filename": "head-house", - "data": "0x00031c1505080001830e000100027c04000183015101830d000100021103000183035101830c00010002110200018302510183025101830b0001000211010001830251018301c8018302510183071103000100021101830351038303510183071102000100011101830b51018307110100010001830d510183071101830f51078317510351051103510b8301510351051103510183031103c80311018301510351051103510183021105c80211018301510351051103510183011107c801110183015103510311012601110351018306c8017c02c801830151035105110351018305c8027c02c80183015103510111032301110351018304c8037c02c8018301510351051103510b8301510251077c0e51" + "data": "0x00031c1505080001840f00027d04000184015201840e00021203000184035201840d0002120200018402520184025201840c000212010001840252018401c80184025201840712040002120184035203840352018407120300011201840b5201840712020001840d520184071201840f5207841a52051203520b840452051203520184031203c8031201840452051203520184021205c8021201840452051203520184011207c80112018404520312012701120352018406c8017d02c80184045205120352018405c8027d02c8018404520112032401120352018404c8037d02c801840452051203520b840352077d0e52" }, { "filename": "head-icepop-b", - "data": "0x00071c19020500061c0893051902000400021c059b08010316031901000400011c019b051c08930319020102190400011c019b051c08930319020102190400071c089305190116011904c9071c089305190116011904c9071c0893071904c9071c089305190116011904c9071c0893071904c9071c089307190400071c089307190400011c029b041c089307190400011c029b041c01930201019301010393061901000500061c0893051902000800021c0c00021902000800011c0d00011903001600011903001a00160001190300" + "data": "0x00071c19020500061d0894051a0600021d059c08020317031a0500011d019c051d0894031a0202021a0400011d019c051d0894031a0202021a0400071d0894051a0117011a04c9071d0894051a0117011a04c9071d0894071a04c9071d0894051a0117011a04c9071d0894071a04c9071d0894071a0400071d0894071a0400011d029c041d0894071a0400011d029c041d01940202019401020394061a0600061d0894051a0a00021d0c00021a0a00011d0d00011a1900011a3300011a0300" }, { "filename": "head-igloo", - "data": "0x00051e1405080006010b0005000401013c0201023c0301080004000101033c0301013c0301023c0101070003000101013c0601013c0501013c0101060002000101033c0101043c0101013c0101053c0101050002000601013c0601013c0401050001000101013c1001013c0101040001000501053c0101063c030104000100140104001201013c0101013c020102000101023c0901063c0101013c040101000301013c0401013c0501013c0201013c0101013c0201013c010101000301013c0401013c0501013c0301013c0201023a013c01010101023c0101053c0101033c0201043c0201023a013c01010101013c0301013c0501013c0401013c0101013c0201033c010101000401013c0501013c0401013c0101013c05010100" + "data": "0x00051e14050800060210000402013d0202023d03020c000102033d0302013d0302023d01020a000102013d0602013d0502013d010208000102033d0102043d0102013d0102053d010207000602013d0602013d040206000102013d1002013d010205000502053d0102063d03020500140204001202013d0102013d020202000102023d0902063d0102013d040201000302013d0402013d0502013d0202013d0102013d0202013d010201000302013d0402013d0502013d0302013d0202023b013d0202023d0102053d0102033d0202043d0202023b013d0202013d0302013d0502013d0402013d0102013d0202033d010201000402013d0502013d0402013d0102013d05020100" }, { "filename": "head-island", - "data": "0x00021b14060400040f0d000300060f0100061c05000700020f091c03000500080f031c01ca031c01000400040f01ca030f031c01ca0200031c0400020f020002ca0100010f021c02ca0300021c0400010f040002ca0100021c01ca0400021c090002ca0200011c01ca0500011c0400060f01ca020002ca06000300080f01ca010002ca06000300080f01ca010002ca06000300080f01ca010002ca06000300080f01ca010002ca060003000e26040002001026030001000d2601460426020002260146012602290226022902260146032601460326010006260229062601460526010014260100" + "data": "0x00021b140604000410100006100100061d0c000210091d08000810031d01ca031d0500041001ca0310031d01ca0200031d04000210020002ca01000110021d02ca0300021d04000110040002ca0100021d01ca0400021d090002ca0200011d01ca0500011d0400061001ca020002ca0900081001ca010002ca0900081001ca010002ca0900081001ca010002ca0900081001ca010002ca09000e270600102704000d27014704270200022701470127022a0227022a0227014703270147032701000627022a062701470527010014270100" }, { "filename": "head-jellyfish", - "data": "0x00031c1b050700055f016a035f07000400016a0e5f04000200065f016a0c5f02000200135f02000100085f0576055f016a025f01000100015f016a045f0976065f0100055f0d76055f015f016a025f0f76025f016a015f045f0f76045f035f1176035f035f1176035f0100015f1376015f01000100015f1376015f01000100015f1376015f01000100015f036e0176036e0176036e0176036e0176036e015f01000100156e01000100016a086e0690066e01000100016a0200016a0e6e016a0100016a01000100016a0200016a0e00016a0100016a01000100016a0200016a0e00016a0100016a0100016a0200016a0f00016a0200016a016a0200016a1000016a0100016a016a1300016a0100016a016a1500016a016a1500016a" + "data": "0x00031c1b0507000560016b03600b00016b0e6006000660016b0c60040013600300086005770560016b026002000160016b046009770660010005600d770660016b02600f770260016b05600f770760117706601177036001000160137701600200016013770160020001601377016002000160036f0177036f0177036f0177036f0177036f01600200156f0200016b086f0691066f0200016b0200016b0e6f016b0100016b0200016b0200016b0e00016b0100016b0200016b0200016b0e00016b0100016b0100016b0200016b0f00016b0200026b0200016b1000016b0100026b1300016b0100026b1500026b1500016b" }, { "filename": "head-jupiter", - "data": "0x00011d1a0309000882090007000c82070007000982037d07000400107d023704000300057d0f37030003000b3709380300010005370a3809370100010006380a37087d0100010009370f7d01000637147d0437167d1a7d1a7d1a7d187d0237167d0437147d0637010001370b7d0c37010001000e37042503370382010003000b370225022302250382030003000482083704250482030003001482030004001282040007000c820700090008820900090008820900" + "data": "0x00011d1a030900088310000c830e000983037e0b00107e02380700057e0f3806000b380939040005380a390938020006390a38087e020009380f7e01000638147e04387c7e0238167e0438147e0638010001380b7e0c3802000e3804260338038304000b3802260224022603830600048308380426048306001483070012830b000c8310000883120008830900" }, { "filename": "head-kangaroo", - "data": "0x00051a1406037e0a00037e0400017e0238017e0800017e0238017e0400017e0338017e0600017e0338017e04000100017e0338017e0400017e0338017e05000200017e0238027e0200027e0238017e060003000a7e07000300087e09000300087e09000300087e09000300087e09000300067e088103230300067e088103230300067e0b810300067e022309810300067e0b810300067e0b81" + "data": "0x00051a1406037f0a00037f0400017f0239017f0800017f0239017f0400017f0339017f0600017f0339017f0500017f0339017f0400017f0339017f0700017f0239027f0200027f0239017f09000a7f0a00087f0c00087f0c00087f0c00087f0c00067f088203240300067f088203240300067f0b820300067f022409820300067f0b820300067f0b82" }, { "filename": "head-ketchup", - "data": "0x000218140807000224070007000224070006000424060006000424060005000689050005000623050001000224028902240289022402890224010001000e23010010241024102410241024102410241024022403890224038906240424048908241024" + "data": "0x0002181408070002250e0002250d0004250c0004250b00068a0a00062406000225028a0225028a0225028a022502000e2401008225038a0225038a0a25048a1825" }, { "filename": "head-laptop", - "data": "0x00061b1605161f011f010b013c120b011f011f1456011f011f1456011f011f1456011f011f1456011f011f1456011f011f1456011f011f1456011f011f1456011f011f1456011f011f1456011f031f010e011f010e011f010e011f010e011f010e011f010e011f010e011f010e011f010e021f021f130e011f021f010e011f010e011f010e011f010e011f010e011f010e011f010e011f010e011f010e031f011f130e021f161f" + "data": "0x00061b16051720010c013d120c022014570220145702201457022014570220145702201457022014570220145702201457022014570420010f0120010f0120010f0120010f0120010f0120010f0120010f0120010f0120010f0420130f0320010f0120010f0120010f0120010f0120010f0120010f0120010f0120010f0120010f0420130f1820" }, { "filename": "head-lightning-bolt", - "data": "0x00021e19050800031e0e000700081e0a0007000c1e060006000c1e070006000b1e080005000b1e090005000a1e0a0004000a1e0b000400091e0c000300091e0d000300081e0e000200171e0200161e01000100151e03000100131e0500121e070005000b1e090004000a1e0b000400081e0d000300071e0f000300051e11000200041e13000200021e15000100011e1700" + "data": "0x00021e19050800031f1500081f11000c1f0c000c1f0d000b1f0d000b1f0e000a1f0e000a1f0f00091f0f00091f1000081f1000171f0200161f0200151f0400131f0500121f0c000b1f0d000a1f0f00081f1000071f1200051f1300041f1500021f1600011f1700" }, { "filename": "head-lint", - "data": "0x00021b16050a00018c0b000900018c0c00030001910600018c040001400600020001910300018c0200038c0140010002400600030002910200028c0191028c034004000291010005000340028c0191018c014001910240018c0200019102000100018c0200014001910340018c0191018c024001910240028c0300038c034001910340038c024001910140018c04000100018c0100018c024001910340018c0191028c014001910140028c03000300018c0191024001910240028c0191028c02400191028c010001910100028c0191018c024001910240028c0191028c0240038c010001910200018c0140028c014001910240058c0240028c0191018c01910100058c0740038c01400191038c010001910100038c01910840028c01400191028c020001910200018c01910a40018c0191028c03000200038c0140018c01910640018c0191038c01910200030001910140028c0191014004230140048c0100029101000200048c01910740028c0191028c03000200018c010002910740028c0191018c01910400050001910100014001000340018c0191018c0100018c0500090001400191010001910900" + "data": "0x00021b16050a00018d1400018d0f0001920600018d04000141080001920300018d0200038d014101000241090002920200028d0192028d03410400029206000341028d0192018d014101920241018d020001920300018d0200014101920341018d0192018d024101920241028d0300038d034101920341038d024101920141018d0500018d0100018d024101920341018d0192028d014101920141028d0600018d0192024101920241028d0192028d02410192028d010001920100028d0192018d024101920241028d0192028d0241038d010001920200018d0141028d014101920241058d0241028d0192018d01920100058d0741038d01410192038d010001920100038d01920841028d01410192028d020001920200018d01920a41018d0192028d0500038d0141018d01920641018d0192038d0192050001920141028d0192014104240141048d010002920300048d01920741028d0192028d0500018d010002920741028d0192018d0192090001920100014101000341018d0192018d0100018d0e0001410192010001920900" }, { "filename": "head-lips", - "data": "0x00051d1503070004240400042407000500072402000724050004000d2402010324040003000e2403010324030002001324010102240200010018240100010006240c01062401000524100105240424120104240324140103241a240100182401000100182401000200162402000300082404010824030005001024050008000a240800" + "data": "0x00051d150307000425040004250c0007250200072509000d250202032507000e2503020325050013250102022503001825020006250c02062501000525100209251202072514021d250100182502001825030016250500082504020825080010250d000a250800" }, { "filename": "head-lipstick2", - "data": "0x000118140806000324070004000724050003000137092403000200012401370a240200020002240137062401370224020002000324043702010324020002000724023703240200020007240237032402000b2a0101042a0b2a0101042a0b2a0101042a0b0d0105040d0b0d0105040d0b0d0105040d0b0d0105040d0b0d0105040d0b0d0105040d060d0223030d0105040d0b0d0105040d0b0501010405" + "data": "0x0001181408060003250b0007250800013809250500012501380a25040002250138062501380225040003250438020203250400072502380325040007250238032502000b2b01020f2b01020f2b0102042b0b0e01050f0e01050f0e01050f0e01050f0e01050f0e01050a0e0224030e01050f0e0105040e0b0501020405" }, { "filename": "head-lock", - "data": "0x00031814080400081f040003000a1f03000200031f0600031f02000200021f0800021f02000200011f010d0800011f010d02000200020d0800020d0200107a108a108a108a108a108a108a108a018a026d0a8a026d018a018a026d048a0223048a026d018a078a0223078a108a" + "data": "0x00031814080400082007000a200500032006000320040002200800022004000120010e08000120010e0400020e0800020e0200107b718b026e0a8b026e028b026e048b0224048b026e088b0224178b" }, { "filename": "head-macaroni", - "data": "0x00081d1403010008290800082901000229060a022906000229060a022901260829012606000126082901260a2606000a26012601280826060008260128012601260128092604000826022801261726012802260100182601000100152601280226010002001626020003000626020a0126020a0126020a0626030004001226040006000e260600" + "data": "0x00081d14030100082a0800082a0100022a060b022a0600022a060b022a0127082a012706000127082a0b2706000b27012908270600082701290227012909270400082702291827012902270100182702001527012902270300162705000627020b0127020b0127020b0627070012270a000e270600" }, { "filename": "head-mailbox", - "data": "0x00071c1405070005890b00070005890b000a0002890b000a050289030508000a050289030508000a050289030508000a050289030508000a0502890305060102000a05028903050401013a010102000a0502890305060102000a0502890305060102000a050289030501010423010102000f05060102001705" + "data": "0x00071c14050700058a1200058a1500028a0b000a05028a030508000a05028a030508000a05028a030508000a05028a030508000a05028a0305060202000a05028a03050402013b010202000a05028a0305060202000a05028a0305060202000a05028a030501020424010202000f05060202001705" }, { "filename": "head-maze", - "data": "0x00061b14050acb01000bcb01cb0b0001cb040001cb030001cb01cb01000bcb010001cb010004cb010001cb01cb010001cb030001cb070001cb040001cb010001cb01cb030001cb030007cb010004cb010001cb06cb010002cb030001cb080001cb01cb010001cb050001cb010001cb010001cb010006cb010001cb01cb010005cb010001cb010003cb080001cb01cb050001cb050001cb010008cb01cb010003cb010003cb010001cb080001cb010001cb01cb030001cb010001cb010001cb010008cb010001cb010001cb03cb010001cb100001cb01cb010001cb010004cb010007cb010005cb01cb030001cb080001cb070001cb14cb010001cb" + "data": "0x00061b14050acb01000ccb0b0001cb040001cb030002cb01000bcb010001cb010004cb010002cb010001cb030001cb070001cb040001cb010002cb030001cb030007cb010004cb010007cb010002cb030001cb080002cb010001cb050001cb010001cb010001cb010006cb010002cb010005cb010001cb010003cb080002cb050001cb050001cb010009cb010003cb010003cb010001cb080001cb010002cb030001cb010001cb010001cb010008cb010001cb010004cb010001cb100002cb010001cb010004cb010007cb010006cb030001cb080001cb070015cb010001cb" }, { "filename": "head-microwave", - "data": "0x00071a1f05010002950f06012102060100029501060e9201210143010e0100029501060e920121010e01430100029501060e92012102c80100029501060e92012102060100029501060e92012102c80100029501060e92012102060100029501060e92012102c80100029501060e92012102060100029501060e92012102c80100010e019501060e9201210206020e019501060e92012102c8020e01950f06012102c8010e02950f0601210206010e1400010e1400010e1400010e1400010e1400010e1400010e1400010e1400010e1400010e1400010e1400" + "data": "0x00071a1f05010002960f06012202060100029601060e9301220144010f0100029601060e930122010f01440100029601060e93012202c80100029601060e93012202060100029601060e93012202c80100029601060e93012202060100029601060e93012202c80100029601060e93012202060100029601060e93012202c80100010f019601060e9301220206020f019601060e93012202c8020f01960f06012202c8010f02960f0601220206010f1400010f1400010f1400010f1400010f1400010f1400010f1400010f1400010f1400010f1400010f1400" }, { "filename": "head-milk", - "data": "0x00031b14080100014a0d7f04000100014a067f0524027f0400034a057f09240289034a097f05240289034a0d430300034a0143017f0143027f0143047f0143017f01430300034a0d430300034a0d430300034a0d430300034a0d430300034a0d430300034a0d430300034a0d430300034a0d430300034a0d43030003c80d7f0300034a0d430300034a0d430300" + "data": "0x00031b14080100014b0d800500014b0680052502800400034b05800925028a034b09800525028a034b0d440300034b0144018001440280014404800144018001440300034b0d440300034b0d440300034b0d440300034b0d440300034b0d440300034b0d440300034b0d440300034b0d440300034b0d44030003c80d800300034b0d440300034b0d440300" }, { "filename": "head-mirror", - "data": "0x00041a14061497019702060101010603010a0601010197019701060101010603010b060101019701970101010603010c06010101970197010603010d0601010197019703010106063c0106063c01010197019702010206013c0406013c0106013c0406013c0101019701970101043c0406033c0406013c0101019701970106013c0206013c0406013c0106013c0406013c0101019701970106013c0206013c0406013c0106013c0406013c0101019701970406063c0106063c0101019701971106010101970197110601010197019711060101019701971106010101970197120101971497" + "data": "0x00041a1406159802060102010603020a060102029801060102010603020b06010202980102010603020c0601020298010603020d060102029803020106063d0106063d0102029802020206013d0406013d0106013d0406013d010202980102043d0406033d0406013d010202980106013d0206013d0406013d0106013d0406013d010202980106013d0206013d0406013d0106013d0406013d010202980406063d0106063d0102029811060102029811060102029811060102029811060102029812021598" }, { "filename": "head-mixer", - "data": "0x00021a1406030002230300022403000224050002000172030001230172030001240172030001240300140c010c030f020c030f020c030f020c0123010c0123010c010c010f015c010f020c010f015c010f020c010f015c010f020c0124010c0123010c100c014e010c01b0010c020c0123040c0123030c0301020c014e010c014e010c020c0123040c0123030c0372020c014e010c014e010c020c0123040c0123040c0123070c020c0123040c0123040c0123070c020c0123040c0123040c0123050c011f010c020c0123040c0123040c0123070c020c0123040c0123040c0123050c011f010c020c0123040c0123040c0123070c020c0123040c0123040c0123050c011f010c010c0301030c0123040c0123070c010c0372020c0301030c0123040c021f010c020c0123030c0372030c0123040c021f010c140c" + "data": "0x00021a140603000224030002250300022507000173030001240173030001250173030001250300150d0310020d0310020d0310020d0124010d0124020d0110015d0110020d0110015d0110020d0110015d0110020d0125010d0124110d014f010d01b0030d0124040d0124030d0302020d014f010d014f030d0124040d0124030d0373020d014f010d014f030d0124040d0124040d0124090d0124040d0124040d0124090d0124040d0124040d0124050d0120030d0124040d0124040d0124090d0124040d0124040d0124050d0120030d0124040d0124040d0124090d0124040d0124040d0124050d0120020d0302030d0124040d0124080d0373020d0302030d0124040d0220030d0124030d0373030d0124040d0220150d" }, { "filename": "head-moon", - "data": "0x00031a160607000687070005000387035e0487050003000487035e0787030002000487025e0687015e0387020002000e87015e0187020001001287010001000587015e0887015e038701000287015e11870187025e11870187015e128714871487148701001287010001000f87015e028701000200058702230687025e0187020002000b87035e0287020003000687015e0387015e0387030005000a870500070006870700" + "data": "0x00031a1606070006880c000388035f048808000488035f078805000488025f0688015f038804000e88015f01880300128802000588015f0888015f038801000288015f1288025f1288015f4e880100128802000f88015f02880300058802240688025f018804000b88035f028805000688015f0388015f038808000a880c0006880700" }, { "filename": "head-moose", - "data": "0x00051c15040383010002830c000283010003830383010002830c850283010003830383010002830c850283010003830383010002830c8502830100038307830b85068307830b85068307830b85068304000e85060004000f85050004000f85050004000f850500040005850d980200040005850d98020004000585069802840298028401980200040005850d9802000400058501980b840198020009000d980200" + "data": "0x00051c15040384010002840c00028401000684010002840c86028401000684010002840c86028401000684010002840c86028401000a840b860d840b860d840b86068404000e860a000f8609000f8609000f86090005860d99060005860d990600058606990285029902850199060005860d990600058601990b8501990b000d990200" }, { "filename": "head-mosquito", - "data": "0x00011f14030c0002350e000a000235030002350b0009000135030002350d0008000135030001350f00080001350200013510000800013502000135100008000135020001351000040009110f0003000211014909110d000200021101490b110c000100021101490d110b00010011110a001311090002110149101109001411080001001b1102001511050003000a11078508000400021107850711080005000f110800" + "data": "0x00011f14030c0002361800023603000236140001360300023615000136030001361700013602000136180001360200013618000136020001361400091212000212014a09120f000212014a0b120d000212014a0d120c0011120a00131209000212014a10120900141209001b120200151208000a1207860c000212078607120d000f120800" }, { "filename": "head-mountain-snowcap", - "data": "0x00031c15040a0004010a0009000101028d0301090008000101018d0601080008000101018d0601080007000a01070007000101018d0601018d0101070006000c01060006000c01060005000e01050005000e0105000400021d0201021d0401021d0301011d04000400021d0101041d0201041d0101021d04000300021d0201051d0101041d0201021d03000300021d02010a1d0201021d03000200031d0201051d0101041d0201031d02000100021d01010f1d0101031d01000b1d0301071d0101021d0100161d01000300061d0600061d0300" + "data": "0x00031c15040a00040213000102028e030211000102018e060210000102018e06020f000a020e000102018e0602018e01020d000c020c000c020b000e020a000e020900021e0202021e0402021e0302011e0800021e0102041e0202041e0102021e0700021e0202051e0102041e0202021e0600021e02020a1e0202021e0500031e0202051e0102041e0202031e0300021e01020f1e0102031e01000b1e0302071e0102021e0100161e0400061e0600061e0300" }, { "filename": "head-mouse", - "data": "0x00031e1407070e0400070e0500070e0400070e0500070e0400070e0500070e0400070e0500070e0400070e0500070e0400070e0500070e0400070e050002000e05070002000e05070002000e05070002000e05070002000e050400030e02000e050400030e02000e050400030e02001205030002000e05011f0105011f0105030002000805024b0105024b05050300020012050300" + "data": "0x00031e1407070f0400070f0500070f0400070f0500070f0400070f0500070f0400070f0500070f0400070f0500070f0400070f0500070f0400070f07000e0509000e0509000e0509000e0509000e050400030f02000e050400030f02000e050400030f0200120505000e05012001050120010505000805024c0105024c0505050012050300" }, { "filename": "head-mug", - "data": "0x00031b14020900067f0200017f07000700037f0400017f0300027f0100017f03000600017f0200037f0300037f07000700027f0100017f0e0019000300160103000101016f014b1101014b010101000101014b0101016f014b1101014b0101020101000101016f024b1001014b0101010102000101016f024b1001014b0101010102000101016f024b1001014b0101020101000101016f024b1001014b010101000101014b0101016f024b120102000101014b0101016f014b1101010004000101016f014b1101010005000101016f014b040104370401014b0201020006000101016f014b040102370401014b0201030007000101016f024b0601024b02010400" + "data": "0x00031b140209000680020001800e0003800400018003000280010001800900018002000380030003800e000280010001802a001602030001020170014c1102014c010201000102014c01020170014c1102014c0302010001020170024c1002014c0202020001020170024c1002014c0202020001020170024c1002014c0302010001020170024c1002014c010201000102014c01020170024c120202000102014c01020170014c1102050001020170014c1102060001020170014c040204380402014c0202080001020170014c040202380402014c02020a0001020170024c0602024c02020400" }, { "filename": "head-mushroom", - "data": "0x00021c150408000855080005000855025104550500030003550151045502510455025102550300020008550451055501510255020001000a5502510a5501000100035502510c5503510255010003550451065502510255055102550155015102550251035501510355025102550551025501550151105503510355185501001655010003001255030005000eaf050005000eaf050005000eaf050005000eaf050005000eaf0500050002af045508af0500050002af01550223015508af0500070004550d00" + "data": "0x00021c1504080008560d000856025204560800035601520456025204560252025605000856045205560152025603000a5602520a560200035602520c56035202560100035604520656025202560552035601520256025203560152035602520256055203560152105603521b56010016560400125608000eaf0a000eaf0a000eaf0a000eaf0a000eaf0a0002af045608af0a0002af01560224015608af0c0004560d00" }, { "filename": "head-mustard", - "data": "0x00021814080700022607000700022607000600042606000600042606000500068a050005000623050001000226028a0226028a0226028a0226010001000e230100104610461046104610461046104610460246038a0246038a06460446048a08461046" + "data": "0x0002181408070002270e0002270d0004270c0004270b00068b0a00062406000227028b0227028b0227028b022702000e2401008247038b0247038b0a47048b1847" }, { "filename": "head-nigiri", - "data": "0x00051c1404040002ce01cd03ce01cd03ce01cd03ce01cd01ce0400020001cd03ce01cd03ce01cd03ce01cd03ce01cd03ce020002ce01cd04ce01cd03ce01cd03ce01cd03ce01cd04ce03ce01cd03ce01cd03ce01cd03ce01cd03ce01cd04ce03ce01cd03ce01cd03ce01cd03ce01cd03ce01cd04ce03ce120103ce01001601010001001601010002001401020001001601010001001601010002001401020001001601010001000a0103cf09010100020014010200030012010300" + "data": "0x00051c1404040002ce01cd03ce01cd03ce01cd03ce01cd01ce060001cd03ce01cd03ce01cd03ce01cd03ce01cd03ce020002ce01cd04ce01cd03ce01cd03ce01cd03ce01cd07ce01cd03ce01cd03ce01cd03ce01cd03ce01cd07ce01cd03ce01cd03ce01cd03ce01cd03ce01cd07ce120203ce0100160202001602030014020300160202001602030014020300160202000a0203cf090203001402050012020300" }, { "filename": "head-noodles", - "data": "0x00021e1402100001360b00100001360500013605000f000136040002360600050001d0010001d0010001d005000136020002360800040001d0015c01d0015c01d0015c01d002000298038803160700030001d0015c01d0025c03160398068802160600020001d0015c01d0025c02160419038803c20288011602980400020001d0015c01d0015c02160619018801c2034601c201880116039803001c0b01001a0b010001001a8901000200188902000200180b02000300168903000300160b03000400140b04000500070b0789040b05000600100b060008000c0b0800" + "data": "0x00021e1402100001371b0001370500013714000137040002370b0001d0010001d0010001d005000137020002370c0001d0015d01d0015d01d0015d01d002000299038903170a0001d0015d01d0025d0317039906890217080001d0015d01d0025d0217041a038903c2028901170299060001d0015d01d0015d0217061a018901c2034701c201890117039903001c0c01001a0c02001a8a0300188a0400180c0500168a0600160c0700140c0900070c078a040c0b00100c0e000c0c0800" }, { "filename": "head-onion", - "data": "0x00041a14060a00019c09000800019c0100019c0100019c07000900039c080008000137039c013707000200029c0137039c0137039c0137039c0137019c02000100039c0137039c0137039c0137039c0137029c0100049c0137039c0137039c0137039c0137039c049c0137039c0137039c0137039c0137039c049c0137039c0137039c0137039c0137039c049c0137039c0137039c0137039c0137039c049c0137039c0137039c0137039c0137039c049c0137039c0137039c0137039c0137039c049c0137039c0137039c0137039c0137039c049c01c8019c0123019c0137039c0137029c01c80137039c0100039c0137029c0423019c0137039c0137029c01000200029c0137039c0137039c0137039c0137019c02000300019c0137039c0137039c0137039c01370300" + "data": "0x00041a14060a00019d1100019d0100019d0100019d1000039d10000138039d01380900029d0138039d0138039d0138039d0138019d0300039d0138039d0138039d0138039d0138029d0100049d0138039d0138039d0138039d0138079d0138039d0138039d0138039d0138079d0138039d0138039d0138039d0138079d0138039d0138039d0138039d0138079d0138039d0138039d0138039d0138079d0138039d0138039d0138039d0138079d0138039d0138039d0138039d0138079d01c8019d0124019d0138039d0138029d01c80138039d0100039d0138029d0424019d0138039d0138029d0300029d0138039d0138039d0138039d0138019d0500019d0138039d0138039d0138039d01380300" }, { "filename": "head-orangutan", - "data": "0x0002181406070001240a0004000b24030003000b24040003000c24030001000e2403000624070e0424010002000424070e04240100020002240c0e01240100020002240c0e01240100020002240c0e01240100020002240c0e01240100020002240c0e012401000200100e0200040e0a08020e0200030e0c08010e0200030e010801240208010e0108010e030801240108010e0200030e01240a080124010e0200030e01240a230124010e0200030e0c24010e" + "data": "0x0002181406070001250e000b2506000b2507000c2504000e2503000625070f042503000425070f0425030002250c0f0125030002250c0f0125030002250c0f0125030002250c0f0125030002250c0f01250300100f0200040f0a08020f0200030f0c08010f0200030f010801250208010f0108010f030801250108010f0200030f01250a080125010f0200030f01250a240125010f0200030f0c25010f" }, { "filename": "head-orca", - "data": "0x00021b14010d00010d0c000d00020d0b000d00030d0a000d00040d09000d00050d08000d00060d07000b000b0d040009000e0d03000800100d02000100030d0300110d02000200030d0100130d01000200170d01000300160d01000200180d0200030d0100140d0100030d0200130d0100030d0400080d090b02000800060d090b03000900040d090b0400" + "data": "0x00021b14010d00010e1900020e1800030e1700040e1600050e1500060e12000b0e0d000e0e0b00100e0300030e0300110e0400030e0100130e0300170e0400160e0300180e0200030e0100140e0100030e0200130e0100030e0400080e090c0a00060e090c0c00040e090c0400" }, { "filename": "head-otter", - "data": "0x000918140704000b86020002000e86010002000f8602000f8602000f86010010861186118602000286047f0623037f020001d10486017f0623017f0286020002d1037f04d1012303d1027f020008d1012301d1012304d1" + "data": "0x000918140704000b8704000e8703000f8702000f8702000f870100328702000287048006240380020001d104870180062401800287020002d1038004d1012403d10280020008d1012401d1012404d1" }, { "filename": "head-outlet", - "data": "0x000418160810511051045108a40451035102a4012304a4012302a40351035102a4012304a4012302a40351035101a4037c02a4037c01a40351035104a4022304a40351035104a4022304a40351045108a404511051045108a40451035102a4012304a4012302a40351035102a4012304a4012302a40351035101a4037c02a4037c01a40351035104a4022304a40351035104a4022304a40351045108a4045110511051" + "data": "0x0004181608245208a4075202a4012404a4012402a4065202a4012404a4012402a4065201a4037d02a4037d01a4065204a4022404a4065204a4022404a4075208a4185208a4075202a4012404a4012402a4065202a4012404a4012402a4065201a4037d02a4037d01a4065204a4022404a4065204a4022404a4075208a42452" }, { "filename": "head-owl", - "data": "0x000218140507000ad20200060001d20ad301d20100050001d201d304d402d304d401d301d2050001d201d30ad401d301d2050001d201d301d402d501d302d401d302d501d401d301d2050001d201d303d401d302d401d303d401d301d2050001d201d304d402d304d401d301d2050002d201d308d402d301d20400042b01d308d401d301d20300062b08d401d301d20300062b01d207d401d301d20200072b01d207d401d301d20200072b01d207d401d301d20200072b01d207d401d301d20200062b02d207d401d201000200052b03d206d401d202000200032b04d206d401d20300010001d2012b07d206d403000bd207d40100" + "data": "0x000218140507000ad2080001d20ad301d2060001d201d304d402d304d401d301d2050001d201d30ad401d301d2050001d201d301d402d501d302d401d302d501d401d301d2050001d201d303d401d302d401d303d401d301d2050001d201d304d402d304d401d301d2050002d201d308d402d301d20400042c01d308d401d301d20300062c08d401d301d20300062c01d207d401d301d20200072c01d207d401d301d20200072c01d207d401d301d20200072c01d207d401d301d20200062c02d207d401d20300052c03d206d401d20400032c04d206d401d2040001d2012c07d206d403000bd207d40100" }, { "filename": "head-oyster", - "data": "0x00021d14040a0005810a000700048103820481070007000181098201810700050003810982038105000500018105820398058201810500020004810282099802820481020002000181058209980582018102000200018102820f980282018102000381018211980182038101810382119803820181018102821398028201810181048206980351079803820181010002810382049805510498038202810100030002810182039807510398018202810300050001810198025507510255019801810500040001810f550181040003000481035505810355048103000300018102d6058103d6058102d601810300040011d60400" + "data": "0x00021d14040a00058211000482038304820e000182098301820c000382098303820a00018205830399058301820700048202830999028304820400018205830999058301820400018202830f990283018202000382018311990183048203831199038302820283139902830282048306990352079903830182010002820383049905520499038302820400028201830399075203990183028208000182019902560752025601990182090001820f5601820700048203560582035604820600018202d6058203d6058202d60182070011d60400" }, { "filename": "head-paintbrush", - "data": "0x00091c18020700036d0572097502240600046d027201b10272097502240600046d0572087503240100096d0572087503240a6d0572087503240a6d0572087503240a6d0572077504240a6d0572077504240100096d0572077504240600046d0572077504240600036d0224017201b10272067505240700036d057206750524160001240100022418000224180001240100180001240100" + "data": "0x00091c18020700036e0573097602250600046e027301b10273097602250600046e0573087603250100096e0573087603250a6e0573087603250a6e0573087603250a6e0573077604250a6e0573077604250100096e0573077604250600046e0573077604250600036e0225017301b10273067605250700036e05730676052516000125010002251800022518000125190001250100" }, { "filename": "head-panda", - "data": "0x00051914060100042309000423010006230700062306230901042305230b01032304230d010223010002230e010123010002001001010002001001010002001001010002001001010002001001010002001001010002000a0104230201010002000a0104230201010002000701062303010100020010010100" + "data": "0x000519140601000424090004240100062407000c24090209240b0207240d020224010002240e02012403001002030010020300100203001002030010020300100203000a020424020203000a02042402020300070206240302030010020100" }, { "filename": "head-paperclip", - "data": "0x00091d14031ad701d7180001d701d7180001d701d7180001d701d7030010d7050001d701d7030001d7140001d701d7030001d7140001d701d7030001d7140001d701d7030001d7140001d701d7030016d701d7190014d70600" + "data": "0x00091d14031bd7180002d7180002d7180002d7030010d7050002d7030001d7140002d7030001d7140002d7030001d7140002d7030001d7140002d7030017d7190014d70600" }, { "filename": "head-peanut", - "data": "0x00041b1605040005d80d00020002d8036004d80b00010002d8016003c9036002d80a00010002d8016001c902d8016002c9016001d80a0002d8026003d8016002d8016002d8090001d8016002c9036001d8046002d8080001d8016002d8016003d8016001d802c9016005d8040001d801600bd8016006d8020002d8016012d80100010001d8016010d8016001d80100010002d8016012d8020002d801600dd8026002d803000fd802c9016001d8040005d8036005d8016002d8016001d8050002d8016002d802c9056001d8026002d8060002d8026002d8016004c9016002c901d80100080002d8036004d8016003d801000a0003d8046003d802000d0005d80400" + "data": "0x00041b1605040005d80f0002d8036104d80c0002d8016103c9036102d80b0002d8016101c902d8016102c9016101d80a0002d8026103d8016102d8016102d8090001d8016102c9036101d8046102d8080001d8016102d8016103d8016101d802c9016105d8040001d801610bd8016106d8020002d8016112d8020001d8016110d8016101d8020002d8016112d8020002d801610dd8026102d803000fd802c9016101d8040005d8036105d8016102d8016101d8050002d8016102d802c9056101d8026102d8060002d8026102d8016104c9016102c901d8090002d8036104d8016103d80b0003d8046103d80f0005d80400" }, { "filename": "head-pencil-tip", - "data": "0x00031714090600022306000600022306000500042305000500042305000400062304000400022301570323040003000223035703230300030007570123030002000a57020002000a57020001000c57010001000c5701000e570e57025704260557032601570626035704260326083703260e26" + "data": "0x0003171409060002240c0002240b0004240a000424090006240800022401580324070002240358032406000758012405000a5804000a5803000c5802000c5801001e58042705580327015806270358072708381127" }, { "filename": "head-peyote", - "data": "0x00021e14030a0001d9020001da020001d90a000a0001d901db010001da010001db01d90a00080001d9020001db01dc01da01dc01db020001d90800090002db05dc02db0900050001d9010002aa01dd02aa03dd02aa01dd02aa010001d90500040002d902aa01dd04aa01dd04aa01dd02aa02d90400050002aa01dd02aa02d901aa01dd01aa02d902aa01dd02aa0500040002aa01dd02aa02d902aa01dd02aa02d902aa01dd02aa0400030002aa01dd0faa01dd02aa0300020017aa020001d9010017aa010001d9010001d917aa01d9010002d917aa02d9010001d917aa01d9010001d9010017aa010001d9020002aa01da11aa01da02aa0200030001aa13da01aa0300030015aa0300050011aa0500" + "data": "0x00021e14030a0001d9020001da020001d9140001d901db010001da010001db01d9120001d9020001db01dc01da01dc01db020001d9110002db05dc02db0e0001d9010002aa01dd02aa03dd02aa01dd02aa010001d9090002d902aa01dd04aa01dd04aa01dd02aa02d9090002aa01dd02aa02d901aa01dd01aa02d902aa01dd02aa090002aa01dd02aa02d902aa01dd02aa02d902aa01dd02aa070002aa01dd0faa01dd02aa050017aa020001d9010017aa010001d9010001d917aa01d9010002d917aa02d9010001d917aa01d9010001d9010017aa010001d9020002aa01da11aa01da02aa050001aa13da01aa060015aa080011aa0500" }, { "filename": "head-piano", - "data": "0x00041b15080400050e0a000200020e010501590105040e08000100020e0105080e070001000b0e07000d0e06000d0e06000e0e05000e0e05000f0e0400110e0200130e130e130e130e010e0159070e0159050e0159030e010e0159010e0159010e0159010e0159010e0159010e0159010e0159010e0159010e0159010e010e1159010e130e" + "data": "0x00041b15080400050f0c00020f0105015a0105040f0900020f0105080f08000b0f07000d0f06000d0f06000e0f05000e0f05000f0f0400110f02004d0f015a070f015a050f015a040f015a010f015a010f015a010f015a010f015a010f015a010f015a010f015a010f015a020f115a140f" }, { "filename": "head-pickle", - "data": "0x00031b15050400040f0e000200080f0c000100030f01c0060f0b000100030f015c030f01c0020f0b00020f01c0060f015c020f0a00020f015c030f01c0070f0800060f015c040f01c0015c050f0400010f01c0120f0200010f015c130f0100150f0100160f0100150f0100130f01c0010f0100020f01c0100f015c010f0200010f015c120f02000b0f012302c0015c040f01000300030f01c0015c010f01c0040f025c050f01000500050f015c090f020007000b0f0400" + "data": "0x00031b150504000410100008100d00031001c006100c000310015d031001c002100b00021001c00610015d02100a000210015d031001c0071008000610015d041001c0015d05100400011001c0121002000110015d13100100151001001610010015100100131001c001100100021001c01010015d011002000110015d121002000b10012402c0015d04100400031001c0015d011001c00410025d051006000510015d091009000b100400" }, { "filename": "head-pie", - "data": "0x00011c14040b0002cc0b00050002cc030002cc050002cc0500060002cc030002cc030002cc0600050002cc030002cc050002cc0500060002cc080002cc0600050002cc04000209040002cc0500060002cc0200020901190109020002cc0600090001de040901de0900050002de010903de020903de010902de0500030012de0300020001de010910de010901de0200010016de0100010001de04bb01de04bb01de04bb01de04bb01de01bb010018bb18bb03bb029503bb0196019503bb0195019603bb029504bb01bb01950196029501960295019202950196029501960295019602950196029501bb01000195019602950196029509920196029501960295010002000196029501960295019202950196029501960295019602950196019502000200019602950196029501960295019602950196029501960295019601950200" + "data": "0x00011c14040b0002cc100002cc030002cc050002cc0b0002cc030002cc030002cc0b0002cc030002cc050002cc0b0002cc080002cc0b0002cc04000209040002cc0b0002cc02000209011a0109020002cc0f0001de040901de0e0002de010903de020903de010902de080012de050001de010910de010901de030016de020001de04bb01de04bb01de04bb01de04bb01de01bb010033bb029603bb0197019603bb0196019703bb029605bb01960197029601970296019302960197029601970296019702960197029601bb010001960197029601970296099301970296019702960300019702960197029601930296019702960197029601970296019701960400019702960197029601970296019702960197029601970296019701960200" }, { "filename": "head-piggybank", - "data": "0x00041d14020c0003420c000b000142039301420500027604000800036c012503930125026c02000176016c0176040006000276026c017605120176026c0176026c0176040005000176106c01760400020001760100036c01010f6c01760300010001760259146c01760200010001760159136c0112016c03760100017601590176166c0176015901000276166c017603000176146c037603000276156c0176030001590176146c0176010004000376106c02760200050013760300060006760112020101120676050008000c760700" + "data": "0x00041d14030b0003431600014303940143050002770b00036d012603940126026d02000177016d017709000277026d017705130177026d0177026d017708000177106d0177050001770100036d01020f6d0177030001770200146d0177020001770100136d0113016d047701000177166d017701000277166d017702000177146d037702000277156d017703000177146d017704000377106d0277060013770800067701130202011306770c000c770700" }, { "filename": "head-pill", - "data": "0x00061d140305000924071d050003000c24081d03000200062401010724081d02000100032402010a24091d01000100032402010b24081d01001124091d1124091d1124091d1124091d1124091d01001024061d010f011d010001000f24071d010f011d010002000a2403230124061d010f011d020003000c24081d030005000924071d0500" + "data": "0x00061d140305000925071e08000c25081e0500062501020725081e0300032502020a25091e0200032502020b25081e01001125091e1125091e1125091e1125091e1125091e01001025061e0110011e02000f25071e0110011e03000a2503240125061e0110011e05000c25081e08000925071e0500" }, { "filename": "head-pillow", - "data": "0x000319160702df0e0002e00ddf05e0010002df0ee00100010003df0de00100010003df08e003df02e00100010003df0de00100010003df02e002df09e00100010003df0de00100010003df0de00100010003df0de00100010003df0de00100010003df0de00100010003df0de00100010003df0de00100010003df0de00100010003df05e004df04e00100010003df0de00100010002df0ee001000ddf05e002df0e0002e0" + "data": "0x000319160702df0e0002e00ddf05e0010002df0ee0020003df0de0020003df08e003df02e0020003df0de0020003df02e002df09e0020003df0de0020003df0de0020003df0de0020003df0de0020003df0de0020003df0de0020003df0de0020003df0de0020003df05e004df04e0020003df0de0020002df0ee001000ddf05e002df0e0002e0" }, { "filename": "head-pineapple", - "data": "0x00031914070600010f010002e10100010f0600040001e10100020f02e1020f010001e10400040003e1010f02e1010f03e10400060006e1060004000228022602280226022804000200022802260228022602280226022802000200022802260228022602280226022802000100012802260228022602280226022802260128010001000128022602280226022802260228022601280100010001260228022602280226022802260228012601000100012602280226022802260228022602280126010001001126010010260100010010260100122601000226034201260442012603420226010001000226034201260442012603420226010002000e260200" + "data": "0x000319140706000110010002e1010001100a0001e10100021002e10210010001e1080003e1011002e1011003e10a0006e10a00022902270229022702290600022902270229022702290227022904000229022702290227022902270229030001290227022902270229022702290227012902000129022702290227022902270229022701290200012702290227022902270229022702290127020001270229022702290227022902270229012702001127010010270200102701001227010002270343012704430127034302270200022703430127044301270343022703000e270200" }, { "filename": "head-pipe", - "data": "0x00061c150509160e0009980e0009980e000100030804980f000100030804980f000100030804980f000100030804980f000100030804980c0003160100030804980c160398010003081398010003081398010004081298010006080123010101230101012308080398020015080300140814000308" + "data": "0x00061c150509170e0009990e0009990f00030804991000030804991000030804991000030804991000030804990c0003170100030804990c170399010003081399010003081399010004081299010006080124010201240102012408080399020015080300140814000308" }, { "filename": "head-pirateship", - "data": "0x00011f14030c0002230e000d0001980e0005000198030008230b00040002230400082302000223060005000198050001230151012302510123015101230200019806000300025501980500032302510323010003550500030003550500042301510323020003550400030004550300022301510423015101230100035505000200065501000923030001980600050001980700019807000198060005000198070001980700019806000d2601980700019806000c97012601980700019806000197022309970126089701980100052601970223099701260198010001970100019701000197010001980126049701000c970a2603970300020004970123109705000300029703230197012301970123019701230197012301970123049706000400029701230e97070005000f970800" + "data": "0x00011f14030c0002241b00019913000199030008240f00022404000824020002240b00019905000124015201240252012401520124020001990900025601990500032402520324010003560800035605000424015203240200035607000456030002240152042401520124010003560700065601000924030001990b00019907000199070001990b000199070001990700019906000d2701990700019906000c98012701990700019906000198022409980127089801990100052701980224099801270199010001980100019801000198010001990127049801000c980a2703980500049801241098080002980324019801240198012401980124019801240198012404980a00029801240e980c000f980800" }, { "filename": "head-pizza", - "data": "0x000319140708000237080008000237080007000137022801370700070001370228013707000600013704280137060006000137012802370128013706000500013702280237022801370500050001370628013705000400013708280137040004000137082801370400030001370a2801370300030001370a2801370300020001370c2801370200020001370c280137020001000137032803370828013701000100013701280137012803370528023701280137010001370828032305280137013710280137" + "data": "0x000319140708000238100002380f000138022901380e000138022901380d000138042901380c00013801290238012901380b00013802290238022901380a0001380629013809000138082901380800013808290138070001380a290138060001380a290138050001380c290138040001380c290138030001380329033808290138020001380129013801290338052902380129013801000138082903240529023810290138" }, { "filename": "head-plane", - "data": "0x00041e14030d0002010c000c0005010a0009000901090007000b01090005000c010a001b001b0006000bc80a0006000bc80a0006000bc80a0006000cc8090006000cc8090002c8040012c80200010102c8040005c8060107c8020001010ac8090105c8010001c801010924020106230201052402000101010007c80b0105c802000101" + "data": "0x00041e14030d000202180005021300090210000b020e000c0246000bc810000bc810000bc810000cc80f000cc8090002c8040012c80200010202c8040005c8060207c8020001020ac8090205c8010001c801020925020206240202052502000102010007c80b0205c802000102" }, { "filename": "head-pop", - "data": "0x000318140802000ca302000100061405280314010005140128031404280314022802140128011401280314042802140214012802140128041405280114021401280814042801140228051401280314042801140a14052801140a1404280214091405280214091404280314081404280414071404280514051405280614031404280914021403280314012801230201012301280214010002280c14010002000ca30200" + "data": "0x000318140802000ca30300061505290315010005150129031504290315022902150129011501290315042904150129021501290415052903150129081504290115022905150129031504290b1505290b1504290b1505290b1504290b1504290b1504290a150529091504290b1503290315012901240202012401290215010002290c1503000ca30200" }, { "filename": "head-porkbao", - "data": "0x00051914070500025701000257010002570500050002570183025701830257050004000257018302570183025701830157040004000157018302570183025701830257040002000e57020002000e57020001001057010001001057010001001057010012571257125712570957037d06571257010010570100" + "data": "0x00051914070500025801000258010002580a0002580184025801840258090002580184025801840258018401580800015801840258018402580184025806000e5804000e5803001058020010580200105801005158037e1858010010580100" }, { "filename": "head-potato", - "data": "0x00061d15040f0001c909000d00077a05000b00037a01c9077a030008000b7a02c9027a020005000f7a01c9027a02000200167a01000100177a0100187a0100187a0100187a01c9187a0100107a02c9057a02000100097a01230101012301010123017a02c9057a02000200057a02c90d7a03000300047a02c90b7a050006000a7a0900" + "data": "0x00061d15040f0001c91600077b1000037b01c9077b0b000b7b02c9027b07000f7b01c9027b0400167b0200177b0100187b0100187b0100187b01c9187b0100107b02c9057b0300097b01240102012401020124017b02c9057b0400057b02c90d7b0600047b02c90b7b0b000a7b0900" }, { "filename": "head-pufferfish", - "data": "0x00041c160509000168020001680a000600016801000668010001680700034903000568014904680700054902680349076806000449036803490368024903680500034904680349036802490468040003491068040002001268030002001268030002001268030005490d6805490149046801930b680193046801490549029309680293054901490a68044907680149054902930468014902350149026801930549030006930268044901680393040004000e93050005000c930600070008930800" + "data": "0x00041c160509000169020001691000016901000669010001690700034a03000569014a04690700054a0269034a07690600044a0369034a0369024a03690500034a0469034a0369024a04690400034a10690600126905001269050012690300054a0d69064a046901940b6901940469064a029409690294064a0a69044a0769064a02940469014a0236014a02690194054a030006940269044a0169039408000e940a000c940d0008940800" }, { "filename": "head-pumpkin", - "data": "0x00051b1406080003b001c501b00800080003b001c501b00800080003b001c501b008000300072401b0072403000300072401480724030002240148072401480724014802240224014807240148072401480224022401480724014807240148022402240148072401480724014802240224014807240148072401480224022401480724014807240148022402240148072401480724014802240224014807240148072401480224022401480585016d0385016d05850148022402240148072401480724014802240224014807240148072401480224" + "data": "0x00051b1406080003b001c501b0100003b001c501b0100003b001c501b00b00072501b0072506000725014907250300022501490725014907250149042501490725014907250149042501490725014907250149042501490725014907250149042501490725014907250149042501490725014907250149042501490725014907250149042501490725014907250149042501490586016e0386016e058601490425014907250149072501490425014907250149072501490225" }, { "filename": "head-pyramid", - "data": "0x00031e14030800018601b111000800028601b110000700038602b10f000700038603b10e000600058603b10d000600058604b10c00050002860284028601b1028602b10b000500078605b10a000400088606b109000400088607b1080003000a8607b1070003000a8608b1060002000b8609b1050002000c8606b1028601b1040001000d860ab1030001000186038401860184078607b1038601b102000986032303860bb101000f860cb1" + "data": "0x00031e14030800018701b11900028701b11700038702b11600038703b11400058703b11300058704b1110002870285028701b1028702b11000078705b10e00088706b10d00088707b10b000a8707b10a000a8708b108000b8709b107000c8706b1028701b105000d870ab104000187038501870185078707b1038701b102000987032403870bb101000f870cb1" }, { "filename": "head-queencrown", - "data": "0x00021b14050a00025b0a000900015b01180141015b09000900015b01410118015b09000500035b0200025b0200035b05000400015b0300015b0100025b0100015b0300015b04000100035b0500045b0500035b0100015b0200015b03000241015b018b0154015b02410300015b0200015b015b0200015b01000441015b0254015b04410100015b0200015b015b01000141015b0541015b0154018b015b0541015b01410100015b0100015b0141015b0541045b0541015b0141015b01000100015b0141015b0641025b0641015b0141015b01000100015b0241015b0441045b0441015b0241015b01000200015b0241015b0341015b028a015b0341015b0241015b02000200015b0241015b0341015b028a015b0341015b0241015b02000100025b0141035b0241015b028a015b0241035b0141025b01000200125b02000300103503000200055b0841055b02000200125b0200" + "data": "0x00021b14050a00025c1300015c01190142015c1200015c01420119015c0e00035c0200025c0200035c0900015c0300015c0100025c0100015c0300015c0500035c0500045c0500035c0100015c0200015c03000242015c018c0155015c02420300015c0200025c0200015c01000442015c0255015c04420100015c0200025c01000142015c0542015c0155018c015c0542015c01420100015c0100015c0142015c0542045c0542015c0142015c0200015c0142015c0642025c0642015c0142015c0200015c0242015c0442045c0442015c0242015c0300015c0242015c0342015c028b015c0342015c0242015c0400015c0242015c0342015c028b015c0342015c0242015c0300025c0142035c0242015c028b015c0242035c0142025c0300125c050010360500055c0842055c0400125c0200" }, { "filename": "head-rabbit", - "data": "0x00041715090372080003720372080003720372080003720372080003720372080003720e720e720e720e720e720e720e720e050e0502050b230105030502010405020103050e050e05" + "data": "0x0004171509037308000673080006730800067308000673080065731e050b2404050202040502021f05" }, { "filename": "head-rainbow", - "data": "0x00041a140608000c1807000d18060003180b14050004180b140400021803140b460300031803140b4602000118031403460b0f01000218031403460b0f031803140346030f0854031803140346030f0854031803140346030f03540512031803140346030f03540512031803140346030f035403120200031803140346030f035403120200031803140346030f032303120200031803140346030f035403120200031803140346030f035403120200" + "data": "0x00041a140608000c1907000d19060003190b15050004190b150400021903150b470300031903150b4702000119031503470b1001000219031503470b10031903150347031008550319031503470310085503190315034703100355051303190315034703100355051303190315034703100355031302000319031503470310035503130200031903150347031003240313020003190315034703100355031302000319031503470310035503130200" }, { "filename": "head-rangefinder", - "data": "0x00061b1405020002050100020501000d72010501050b7203050172020e0101010e017201050105027201050372020c037203050172040e0172010501050172020511720105010e010c0205110c010e010e140c010e010e140c010e010e140c010e010e140c010e010e140c010e010e140c010e010e120c0205010e010e080c0505050c0205010e010e140c010e010514720105" + "data": "0x00061b1405020002050100020501000d7302050b7303050173020f0102010f01730205027301050373020d037303050173040f017302050173020511730105010f010d0205110d020f140d020f140d020f140d020f140d020f140d020f140d020f120d0205020f080d0505050d0205020f140d010f010514730105" }, { "filename": "head-raven", - "data": "0x00041e14080100080e0d000400070e0b0001000c0e090002000c0e080001000e0e070001000e0e070001000f0e0600100e0600100e0600100e0600100e0600090e070d0600080e0c0d0200070e0f0d070e0f0d070e0d0d0200080e090d0500" + "data": "0x00041e14080100080f1100070f0c000c0f0b000c0f09000e0f08000e0f08000f0f0600100f0600100f0600100f0600100f0600090f070e0600080f0c0e0200070f0f0e070f0f0e070f0d0e0200080f090e0500" }, { "filename": "head-retainer", - "data": "0x00091d150504000320110004000120011906200c0004000320011906200a0003000520011902200119042008000300092001190620050003000220011903200119062001190320040002000220021903200119032002190120031901200400020002200f19022003000100022011190120030001000120031904a4011904a4011904a40119022002a402200219012001a40120011901a4011901a4021901a4011901a40119012001a40320010001a4052001a4022003a4022003a4022006a4030003a41200" + "data": "0x00091d15050400032115000121011a062110000321011a06210d000521011a0221011a04210b000921011a062108000221011a0321011a0621011a032106000221021a0321011a0321021a0121031a0121060002210f1a022104000221111a012104000121031a04a4011a04a4011a04a4011a022102a40221021a012101a40121011a01a4011a01a4021a01a4011a01a4011a012101a40321010001a4052101a4022103a4022103a4022106a4030003a41200" }, { "filename": "head-rgb", - "data": "0x00011c160409000664090007000a64070006000c64060005000e64050005000e640500040010640400040001640628026406690164040003000165072802010769015a030002000265062804010669025a020001000365052806010569035a010001000365052806010569035a01000565032808010369055a0565032808010369055a0665022808010269065a0765012808010169075a086501e2060101e2085a086508e2085a0100086506e2085a01000100086506e2085a01000200086504e2085a02000300086502e2085a0300050006650200065a0500" + "data": "0x00011c16040900066510000a650d000c650b000e650a000e65090010650800016506290265066a01650700016607290202076a015b0500026606290402066a025b0300036605290602056a035b0200036605290602056a035b0100056603290802036a055b056603290802036a055b066602290802026a065b076601290802016a075b086601e2060201e2085b086608e2085b0100086606e2085b0200086606e2085b0300086604e2085b0500086602e2085b080006660200065b0500" }, { "filename": "head-ring", - "data": "0x00021a15060600084f06000600024f0101024f016c024f06000700034f016c024f07000500032a044f032a05000300022a021e022a024f022a021e022a03000200012a021e0a2a021e012a02000100052a011e0700052a01000100032a011e0b00032a0100032a021e0c00032a012a0101012a011e0d00032a032a011e0d00032a032a011e0d00032a032a011e0d00012a0101012a032a011e0d00012a0101012a032a011e0d00032a0100032a021e0a00032a01000100052a081e052a01000200102a020003000e2a030005000a2a0500" + "data": "0x00021a1506060008500c00025001020250016d02500d000350016d02500c00032b0450032b0800022b021f022b0250022b021f022b0500012b021f0a2b021f012b0300052b011f0700052b0200032b011f0b00032b0100032b021f0c00042b0102012b011f0d00062b011f0d00062b011f0d00062b011f0d00012b0102042b011f0d00012b0102042b011f0d00032b0100032b021f0a00032b0200052b081f052b0300102b05000e2b08000a2b0500" }, { "filename": "head-road", - "data": "0x00061c1403020017e3020017e3020017d4020017e3020017e3010017e30100010017e30100010017e30100010017e30100010017e3010018e3010017e4020017e3020001e303e403e303e403e303e403e303e401e3020017e30200" + "data": "0x00061c1403020017e3020017e3020017d4020017e3020017e3010017e3020017e3020017e3020017e3020017e3010018e3010017e4020017e3020001e303e403e303e403e303e403e303e401e3020017e30200" }, { "filename": "head-robot", - "data": "0x00031c140405000e1f050005000e1f050003001205030003000105011f0205011f0205011f0205011f0205011f0205011f0105030003001205030003001205030003000105101f01050300010001050100120503000100010501001205010001050100031f1205010001050100010e021f1205031f031f1205021f010e010e021f1205031f031f1205021f010e03000105010e0259010e0259010e0259010e0259010e0259010e0105031f03000105010e020b010e020b010e020b010e020b010e020b010e0105030003000105100e01050300030012050300" + "data": "0x00031c140405000e200a000e200800120506000105012002050120020501200205012002050120020501200105060012050600120506000105102001050400010501001205040001050100120501000105010003201205010001050100010f02201205062012050220020f02201205062012050220010f03000105010f025a010f025a010f025a010f025a010f025a010f0105032003000105010f020c010f020c010f020c010f020c010f020c010f010506000105100f0105060012050300" }, { "filename": "head-rock", - "data": "0x00031b14050b00030c08000a00010c031f020c06000900010c011f010c041f020c04000800020c021f010c051f020c02000300050c051f010c061f010c01000200010c121f010c0100010c051f040c0a1f010c0100010c091f010c091f010c0100010c021f010c101f010c0100010c071f020c011f070c021f010c0100010c051f020c0c1f010c010c141f010c010c041f010c0e1f020c010c041f010c081f020c011f030c02000100010c041f010c041f030c021f010c021f010c02000200010c051f030c041f010c021f010c03000300050c041f030c031f010c03000400010c0c1f010c0400" + "data": "0x00031b14050b00030d1200010d0320020d0f00010d0120010d0420020d0c00020d0220010d0520020d0500050d0520010d0620010d0300010d1220010d0100010d0520040d0a20010d0100010d0920010d0920010d0100010d0220010d1020010d0100010d0720020d0120070d0220010d0100010d0520020d0c20020d1420020d0420010d0e20030d0420010d0820020d0120030d0300010d0420010d0420030d0220010d0220010d0400010d0520030d0420010d0220010d0600050d0420030d0320010d0700010d0c20010d0400" }, { "filename": "head-rosebud", - "data": "0x00021c14040c0001940b000a000119010002940a000900021904940900070004190694070006000419089406000500051909940500040006190a940400040005190b940400030006190394011d08940300030006190394011d08940300011d020006190294021d08940200011d0100011d010007190194021d08940100011d01000100041d05190194021d0694041d01000200051d03190194021d0494051d02000300051d0219041d0294051d03000400041d0119011d0123021d0123011d0194041d04000500031d0119021d0223021d0194031d050006000c1d060006000c1d0600" + "data": "0x00021c14040c0001951500011a010002951300021a04951000041a06950d00041a08950b00051a09950900061a0a950800051a0b950700061a0395011e08950600061a0395011e08950300011e0200061a0295021e08950200011e0100011e0100071a0195021e08950100011e0200041e051a0195021e0695041e0300051e031a0195021e0495051e0500051e021a041e0295051e0700041e011a011e0124021e0124011e0195041e0900031e011a021e0224021e0195031e0b000c1e0c000c1e0600" }, { "filename": "head-ruler-triangular", - "data": "0x00021c1508019a1300019a014f1200029a014f1100019a034f1000019a044f0f00029a044f0e00019a064f0d00019a074f0c00029a074f0b00019a094f0a00019a034f0100064f0900029a024f0200064f0800019a034f0300064f0700019a034f0400064f0600029a024f0500064f0500019a034f0600064f0400019a104f0300029a094f049a034f0200019a0a4f049a044f0100019a134f" + "data": "0x00021c1508019b1300019b01501200029b01501100019b03501000019b04500f00029b04500e00019b06500d00019b07500c00029b07500b00019b09500a00019b0350010006500900029b0250020006500800019b0350030006500700019b0350040006500600029b0250050006500500019b0350060006500400019b10500300029b0950049b03500200019b0a50049b04500100019b1350" }, { "filename": "head-saguaro", - "data": "0x00031c14040c00047908000c00057907000300047905000579070003000479020002790100057907000300047902000279010005790700027901000479020002790100057907000279010004790200017902b0057902000279010002790100017901b004790500057902000279010002790300047905000579010003790100027904000379050004790200037901b001790100027902000479020001790100047902000379030002790200047902000179010004790200027904000279020004790200017901b00479020002790400037901000479030001b004790100037904000100027901b0047904b004790100037904000200017901b0077902b00379010002790500040002790323037901b0037901b0027905000500077901b0037901b002790500" + "data": "0x00031c14040c00047a1400057a0a00047a0500057a0a00047a0200027a0100057a0a00047a0200027a0100057a0700027a0100047a0200027a0100057a0700027a0100047a0200017a02b0057a0200027a0100027a0100017a01b0047a0500057a0200027a0100027a0300047a0500057a0100037a0100027a0400037a0500047a0200037a01b0017a0100027a0200047a0200017a0100047a0200037a0300027a0200047a0200017a0100047a0200027a0400027a0200047a0200017a01b0047a0200027a0400037a0100047a030001b0047a0100037a0500027a01b0047a04b0047a0100037a0600017a01b0077a02b0037a0100027a0900027a0324037a01b0037a01b0027a0a00077a01b0037a01b0027a0500" }, { "filename": "head-sailboat", - "data": "0x00011c14040d0001010a000c0002010100010108000b0003010100010108000a0004010100020107000900020102df01010100020107000800030102df010101000301060007000701010003010600060008010100040105000500090101000401050004000a0101000501040003000b0101000501040002000c0101000601030001000d010100060103000e010100070102001800188301000183149801830100020001830198108301980183020003000183109801830300040010830400" + "data": "0x00011c14040d0001021600020201000102130003020100010212000402010002021000020202df0102010002020f00030202df0102010003020d000702010003020c000802010004020a0009020100040209000a020100050207000b020100050206000c020100060204000d020100060203000e02010007021a00188401000184149901840300018401991084019901840500018410990184070010840400" }, { "filename": "head-sandwich", - "data": "0x00041d14030d0001880c000c0003e10b000c0002e1011a0b000c0003e10b000500088301880783050003000783017d028301880483017d0483030002000283017d088301880183017d0883020001000883017d0a83017d04830100010018830100010018e501000100185501000100016d0655016d0855016d07550100011c186d011c031c066d081c056d041c0100041c0298051c0398051c0298011c0100011c010003000698082306980300040012980400" + "data": "0x00041d14030d000189180003e1170002e1011b170003e1100008840189078408000784017e028401890484017e048405000284017e088401890184017e088403000884017e0a84017e048402001884020018e5020018560200016e0656016e0856016e07560100011d186e041d066e081d056e041d0100041d0299051d0399051d0299011d0100011d0400069908240699070012990400" }, { "filename": "head-saturn", - "data": "0x00051c16030b0004e60a00090008e6080007000ce60200023a0200010005510ee60100023a0200015105000ee605000151040002140de6011404000151040003140ce601140400010001510200025503140be6021403000200015101000255041409e603140300030001510355061405e6041403000400015102550f1403000500015104550b140151020001e60500015502510555061402550100015102000600025502510a55030001510100030002e60100045503510755040001510200013a02e60200065503510355050001510200023a050007550351050001510b000455040005510100" + "data": "0x00051c16030b0004e6130008e60f000ce60200023b030005520ee60100023b0200015205000ee605000152040002150de6011504000152040003150ce60115050001520200025603150be602150500015201000256041509e60315060001520356061505e604150700015202560f150800015204560b150152020001e6050001560252055606150256010001520800025602520a5603000152040002e60100045603520756040001520200013b02e60200065603520356050001520200023b050007560352050001520b000456040005520100" }, { "filename": "head-saw", - "data": "0x00091e15020c9710a301000b9710a3020003970100069710a3020002970300059710a3020002970300059710a3020002970300059710a3020002970300059710a302000297030005970ea3010001a302000297030005970ca3010001a302000200039701000297012602970ba3010001a304000100099703a3025105a3010001a30600099702a3025105a3010001a30800080008a30c00" + "data": "0x00091e15020c9810a301000b9810a3020003980100069810a3020002980300059810a3020002980300059810a3020002980300059810a3020002980300059810a302000298030005980ea3010001a302000298030005980ca3010001a30400039801000298012702980ba3010001a30500099803a3025205a3010001a30600099802a3025205a3010001a3100008a30c00" }, { "filename": "head-scorpion", - "data": "0x00031e1403060008e70d00060008e70d00060008e70d00030004e7050003e70c00030004e7020003e803e70c00030004e7020001e8010002e802e70c00010003e7070003e80d00010003e71700010003e7170003e7180003e7180003e7180003e703000de8080003e7020010e80300039f05e710e803e7019f0200010004e702e802e902e802e902e802e901e807e70200010004e704e802e902e802e904e806e7020006000ee8010003e7039f" + "data": "0x00031e1403060008e7130008e7130008e7100004e7050003e70f0004e7020003e803e70f0004e7020001e8010002e802e70d0003e7070003e80e0003e7180003e7170003e7180003e7180003e7180003e703000de8080003e7020010e80300039f05e710e803e7019f030004e702e802e902e802e902e802e901e807e7030004e704e802e902e802e904e806e708000ee8010003e7039f" }, { "filename": "head-shark", - "data": "0x00031c14030a0004ec0b000b0005ec09000c0005ec08000c0005ec080001ec0b0006ec0700010001ec08000b430400010002ec05000e430300010003ec020011430200020003ec010012430100020004ec1343030003ec1343030003ec104301ec01430100030003ec104301ec01430100020003ec010011430200020002ec020011430200020001ec0300034301ec014301ec0243023c0101013c0101013c0101013c0300010001ec0400024301ec014301ec0243023c0101013c0101013c0101023c030006000643093c0400" + "data": "0x00031c14030a0004ec160005ec150005ec140005ec080001ec0b0006ec080001ec08000b44050002ec05000e44040003ec02001144040003ec01001244030004ec1344030003ec1344030003ec104401ec0144040003ec104401ec0144030003ec01001144040002ec02001144040001ec0300034401ec014401ec0244023d0102013d0102013d0102013d040001ec0400024401ec014401ec0244023d0102013d0102013d0102023d09000644093d0400" }, { "filename": "head-shower", - "data": "0x00011c19040b00020d0b000b00020d0b000800080d080006000c0d060005000e0d05000400101f04000400081f010b011f030b031f04000400101f040005000e43050005000e430500040010430400040010430400040010430400030012430300030012430300030012430300020014430200020014430200020014430200010016430100010001430100014310000143010001430100010004430e0004430100014301000143010001430e00014301000143010001431800010001430100014310000143010001430100" + "data": "0x00011c19040b00020e1600020e1300080e0e000c0e0b000e0e0900102008000820010c0120030c03200800102009000e440a000e440900104408001044080010440700124406001244060012440500144404001444040014440300164402000144010001441000014401000144020004440e0004440100014401000144010001440e0001440100014401000144190001440100014410000144010001440100" }, { "filename": "head-skateboard", - "data": "0x00091e1402030016c00300010003c0016a0369016a0ac0016a0369016a03c00100010001c0011b01c0016a0369016a0ac0016a0369016a01c0011b01c0010002c0011b01c0016a0369016a0ac0016a0369016a01c0011b02c002c0011b03c0017c0ec0017c03c0011b02c002c0011b03c0017c0ec0017c03c0011b02c002c0011b03c0017c0ec0017c03c0011b02c002c0011b03c0017c0ec0017c03c0011b02c002c0011b01c0016a0369016a0ac0016a0369016a01c0011b02c0010001c0011b01c0016a0369016a05c0030e02c0016a0369016a01c0011b01c00100010003c0016a0369016a0ac0016a0369016a03c00100030016c00300" + "data": "0x00091e1402030016c0040003c0016b036a016b0ac0016b036a016b03c0020001c0011c01c0016b036a016b0ac0016b036a016b01c0011c01c0010002c0011c01c0016b036a016b0ac0016b036a016b01c0011c04c0011c03c0017d0ec0017d03c0011c04c0011c03c0017d0ec0017d03c0011c04c0011c03c0017d0ec0017d03c0011c04c0011c03c0017d0ec0017d03c0011c04c0011c01c0016b036a016b0ac0016b036a016b01c0011c02c0010001c0011c01c0016b036a016b05c0030f02c0016b036a016b01c0011c01c0020003c0016b036a016b0ac0016b036a016b03c0040016c00300" }, { "filename": "head-skeleton-hat", - "data": "0x000519150704000a43040001001043010001001043010012431243010010af0100010010af0100010010af0100010010af0100010010af0100010010af0100010010af0100010007af01b101af01b106af010003000caf0300030002af01b101af016d01af01b101af01b101af01b101af0300030003af01b101af01b101af01b101af01b101af01b1030004000baf0300" + "data": "0x000519150704000a44050010440200104401002444010010af020010af020010af020010af020010af020010af020010af020007af01b101af01b106af04000caf060002af01b101af016e01af01b101af01b101af01b101af060003af01b101af01b101af01b101af01b101af01b107000baf0300" }, { "filename": "head-skilift", - "data": "0x00011e1403010001230100142301000123010001230800012301000123100001230200152301000123010006000123140006000123140006000223130006000423110007000b230900030014880400020001880a770188097701880300020001880a77018807770166017701880300020001880a77018807770166017701880300020001880a77018807770166017701880300020001880a7701880977018803000200163303000200168803000200163303000200063306230a330300020016330300040012330500" + "data": "0x00011e1403010001240100142401000124010001240800012401000124100001240200152401000124070001241a0001241a0002241900042418000b240c001489060001890a78018909780189050001890a7801890778016701780189050001890a7801890778016701780189050001890a7801890778016701780189050001890a780189097801890500163405001689050016340500063406240a3405001634070012340500" }, { "filename": "head-smile", - "data": "0x00051d14030600042406000424060004000824020008240400012402001424020001240724020108240201072401240101162401010124012404011024040101240224160102240324140103240100032412010324010001000424100104240100020004240e0104240200020006240a010624020003001424030004000a2402010624040005001024050007000c240700" + "data": "0x00051d140306000425060004250a00082502000825040001250200142502000825020208250202082501021625010202250402102504020325160205251402032501000325120203250200042510020425030004250e020425040006250a0206250500142507000a2502020625090010250c000c250700" }, { "filename": "head-snowglobe", - "data": "0x00051914080600048c07000300038c0151038c0151038c03000100018c0151058c0151068c015101000100048c0151018c0351028c0151038c0100038c0151018c0197025101970251038c0151028c0151048c025103970251058c048c025105970251038c0151038c0251039701260197012601970251038c048c0997048c048c04970126019701260297048c048c09970151038c038c015109970251028c11510100045104110751010001000f08010001000f080100" + "data": "0x00051914080600048d0a00038d0152038d0152038d0400018d0152058d0152068d01520200048d0152018d0352028d0152038d0100038d0152018d0198025201980252038d0152028d0152048d025203980252098d025205980252038d0152038d0252039801270198012701980252078d0998088d04980127019801270298088d09980152068d015209980252028d1152010004520412075202000f0802000f080100" }, { "filename": "head-snowmobile", - "data": "0x00071e15050c0001040c000c0001040c0008000305010002040b000b00010502040b000b00010502040b000b000123010402260a000a0003230426080003230600032302260155052605000c23012603550104052603000b23022602550804020002230901022602550804020005010123110102000601032301010b05030001040a010a050300010401000100012301050123010501230105012301000e040200" + "data": "0x00071e15050c0001041800010414000305010002041600010502041600010502041600012401040227140003240427080003240600032402270156052705000c24012703560104052703000b24022702560804020002240902022702560804020005020124110202000602032401020b05030001040a020a05030001040200012401050124010501240105012401000e040200" }, { "filename": "head-spaghetti", - "data": "0x00041a1c060c000384050005000384030001840385018404000400038401850484028501d00284030003000184028501d001840485028404850200030004850184048501840585020003000f8502000300015503850255028501d002550385015502000200105502000200105502000100037d0c55027d02000100127d0100147d147d017d0201017d0101017d0701017d0301017d0101017d017d0401017d0701017d0301017d0101017d017d0c01017d0501017d017d010010010100017d017d0100017d0e00017d0100017d017d0100017d0e00017d0100017d017d0100017d0e00017d0100017d017d0100017d0e00017d0100017d017d0100017d0e00017d0100017d0200017d0e00017d02000200017d0e00017d02000200017d0e00017d0200" + "data": "0x00041a1c060c0003850a00038503000185038601850800038501860485028601d0028506000185028601d0018504860285048605000486018504860185058605000f860500015603860256028601d002560386015604001056040010560300037e0c56027e0300127e0100297e0202017e0102017e0702017e0302017e0102027e0402017e0702017e0302017e0102027e0c02017e0502027e010010020100027e0100017e0e00017e0100027e0100017e0e00017e0100027e0100017e0e00017e0100027e0100017e0e00017e0100027e0100017e0e00017e0100017e0200017e0e00017e0400017e0e00017e0400017e0e00017e0200" }, { "filename": "head-sponge", - "data": "0x0004191408010003290200022902000429030001290222032901220929010001290222092903220229010007290222022903220229010003290222022902220229032202290100032902220a2901001029010010290100112911291129112910290100012902220d29010001290222032905230429020001000d2901220129010001000e290200" + "data": "0x00041914080100032a0200022a0200042a0300012a0223032a0123092a0100012a0223092a0323022a0100072a0223022a0323022a0100032a0223022a0223022a0323022a0100032a02230a2a0100102a0100102a0100542a0100012a02230d2a0100012a0223032a0524042a03000d2a0123012a02000e2a0200" }, { "filename": "head-squid", - "data": "0x00011c1a020d00026a0b000c00046a0a000b00036a01ed026a09000a00056a01ed026a08000900076a01ed026a070008000c6a060007000e6a05000600014f0e6a014f04000500024f0e6a024f03000400024f106a024f02000300034f106a034f01000200044f106a014f01ed024f0200044f106a024f01ed014f0200044f106a044f0200044f106a044f0300034f106a034f01000100014f0200034f0e6a034f0200014f016a014f03000245014f0123010101230101012301010123010101230101014f02450400014f016a014f020003450c4f03450300014f016a014f0100144502000100014f014501000145010002450100024506000245010002450100024501000200034501000145020001450800014502000145020001450100030001451300014f014501001700014f014501001700014f014501001700014f0200" + "data": "0x00011c1a020d00026b1700046b1500036b01ed026b1300056b01ed026b1100076b01ed026b0f000c6b0d000e6b0b0001500e6b0150090002500e6b025007000250106b025005000350106b035003000450106b015001ed025002000450106b025001ed015002000450106b045002000450106b045003000350106b035002000150020003500e6b035002000150016b015003000246015001240102012401020124010201240102012401020150024604000150016b0150020003460c50034603000150016b01500100144603000150014601000146010002460100024606000246010002460100024603000346010001460200014608000146020001460200014604000146130001500146180001500146180001500146180001500200" }, { "filename": "head-stapler", - "data": "0x00081c140407000d2404000400122402000200162401001724010017240100172401001724051812720100061811720100041801240218110005181224010018181818" + "data": "0x00081c140407000d2508001225040016250100172501001725010017250100172505191273010006191173010004190125021911000519122501003019" }, { "filename": "head-star-sparkles", - "data": "0x00021b17050a0002ad0a0006000129020001ad022901ad0900090001ad022901ad0900080001ad042901ad0300012901000129020003000129040001ad042901ad04000129030002000329020001ad062901ad0200012901000129020003000129030001ad062901ad0700050002ad082902ad0500030002ad0c2902ad0300010002ad102902ad010001ad142901ad01ad142901ad010002ad102902ad0100030002ad0c2902ad0300050001ad0a2901ad0500050001ad0a2901ad050001000129020001ad072903ad022901ad0400040001ad0c2901ad0400030001ad062902ad062901ad0300030001ad042902ad020002ad042901ad0300030001ad022902ad060002ad022901ad0300040002ad0a0002ad0400" + "data": "0x00021b17050a0002ad1000012a020001ad022a01ad120001ad022a01ad110001ad042a01ad0300012a0100012a0500012a040001ad042a01ad0400012a0500032a020001ad062a01ad0200012a0100012a0500012a030001ad062a01ad0c0002ad082a02ad080002ad0c2a02ad040002ad102a02ad010001ad142a02ad142a01ad010002ad102a02ad040002ad0c2a02ad080001ad0a2a01ad0a0001ad0a2a01ad0600012a020001ad072a03ad022a01ad080001ad0c2a01ad070001ad062a02ad062a01ad060001ad042a02ad020002ad042a01ad060001ad022a02ad060002ad022a01ad070002ad0a0002ad0400" }, { "filename": "head-steak", - "data": "0x00071b160504000e51040002000251061803380518025102000100015109180138081801510100010001510918013808180151010001510a1801380918015101510a1801380918015101510a1801380918015101510a1801380918015101510a1801380918015101510138091801380918015102510238051803380118035105180151010003510838011801510138015104180251020008510238011803510418015101000400075102380518035101000a000a5102000b0007510400" + "data": "0x00071b160504000e52060002520619033905190252030001520919013908190152020001520919013908190152010001520a190139091902520a190139091902520a190139091902520a190139091902520a190139091902520139091901390919035202390519033901190352051901520100035208390119015201390152041902520200085202390119035204190152050007520239051903520b000a520d0007520400" }, { "filename": "head-sunset", - "data": "0x00031d1403090008490900070004490142024901420449070005000549014201490242014901420549050004000149014201490c420149014201490400030001490142014904420126014202260142012604420149014201490300020001490142014903420a2603420149014201490200020002490342032601280126022801260128032603420249020001000249034203260828032603420249010001000249024203260a2803260242024901000349024202260c280226024203490249024202260e28022602420249014901420149024202260d28012602420149014201490249024202260e280226024202490249024202260e28022602420249014901420149024202260c280226024201490142014902490242022606280201012605280226024202490349024202260c2802260242034901000349024202260a280226024203490100" + "data": "0x00031d14030900084a1000044a0143024a0143044a0c00054a0143014a0243014a0143054a0900014a0143014a0c43014a0143014a0700014a0143014a0443012701430227014301270443014a0143014a0500014a0143014a03430a270343014a0143014a0400024a034303270129012702290127012903270343024a0300024a03430327082903270343024a0200024a024303270a2903270243024a0100034a024302270c2902270243054a024302270e2902270243034a0143014a024302270d2901270243014a0143034a024302270e2902270243044a024302270e2902270243034a0143014a024302270c2902270243014a0143034a02430227062902020127052902270243054a024302270c2902270243034a0100034a024302270a2902270243034a0100" }, { "filename": "head-taco-classic", - "data": "0x00051d14030a00038e0167028e0a000800038e0167018e0167048e08000600038e0167018e015701670157018e0167028e0167018e06000500018e0267018e0367011102570367038e05000500028e026708500157038e05000300018e0167018e015702110150018a0350018a025002110267028e03000300028e01670650018a0750038e03000300018e01110d50018a02500167018e03000200018e015701110150018a0e5001110157018e020001000167018e1450018e0200020001670450018a0c50018a02500267010002000111145001110200016701000350018a0d50018a0150018a025002000100016716500167010002000550018a0550018a0750018a0250010001670300145001670200" + "data": "0x00051d14030a00038f0168028f1200038f0168018f0168048f0e00038f0168018f015801680158018f0168028f0168018f0b00018f0268018f0368011202580368038f0a00028f026808510158038f0800018f0168018f015802120151018b0351018b025102120268028f0600028f01680651018b0751038f0600018f01120d51018b02510168018f0500018f015801120151018b0e5101120158018f03000168018f1451018f040001680451018b0c51018b0251026803000112145101120200016801000351018b0d51018b0151018b0251030001681651016803000551018b0551018b0751018b0251010001680300145101680200" }, { "filename": "head-taxi", - "data": "0x00041c170405000ee60500050001e603c8040105c801e60500040001e603c8040107c801e60400040001e602c8040108c801e60400030001e602c8040104c8034303c801e60300030001e601c8040104c8014303c8014302c801e60300010016e60100010016e60100010016e60100010016e60100010016e60100010016e60100010016e60100010002e6011f10e6011f02e60100011f0137141f0137011f091f061d091f010008e6061d08e601000200020e0500061d0500020e02000200020d1000020d02000200020d1000020d0200" + "data": "0x00041c170405000ee60a0001e603c8040205c801e6090001e603c8040207c801e6080001e602c8040208c801e6070001e602c8040204c8034403c801e6060001e601c8040204c8014403c8014402c801e6040016e6020016e6020016e6020016e6020016e6020016e6020016e6020002e6012010e6012002e6010001200138142001380a20061e0920010008e6061e08e60300020f0500061e0500020f0400020e1000020e0400020e1000020e0200" }, { "filename": "head-thumbsup", - "data": "0x00011a14050a00012b02e608000a0001e6012b02e607000a0001e6012b02e607000a00012b03e60700090005e60700080006e60700070006e60800060006e6012b07e60100030008e6012b07e6012b01e60be6012b07e6012b01e60de6012b06e6012b0de6072b01000ae6012b0ae60ae6012b08e6012b01e60ae6012b09e6012b0ce6082b010001e6022b05e6012b02e6012b08e6010008e6042b06e6012b01e60100030004e6012b03e6012b07e6012b0100040008e6072b0200" + "data": "0x00011a14050a00012c02e6120001e6012c02e6110001e6012c02e61100012c03e6100005e60f0006e60e0006e60e0006e6012c07e6040008e6012c07e6012c0ce6012c07e6012c0ee6012c06e6012c0de6072c01000ae6012c14e6012c08e6012c0be6012c09e6012c0ce6082c010001e6022c05e6012c02e6012c08e6010008e6042c06e6012c01e6040004e6012c03e6012c07e6012c050008e6072c0200" }, { "filename": "head-toaster", - "data": "0x00031a1f0504000e840300030002840cd8028402000300018403d8089903d801840200040001840cd8018403000400018402d8089902d8018403000300010b0e72010b02000300010b0e72010b02000300010b0e72010b020d0300010b0e72010b020d0300010b0e72010b02000300010b0e72010b02000300010b0e72010b02000300010b0e72010b02000300010b0e72010b02000300010b0e72010b02000200120d0100021f120d0100011f0100120d0100011f1400011f1400011f1400011f1400011f1400011f1400011f1400011f1400011f1400011f1400011f1400" + "data": "0x00031a1f0504000e85060002850cd802850500018503d8089a03d80185060001850cd801850700018502d8089a02d801850600010c0e73010c0500010c0e73010c0500010c0e73010c020e0300010c0e73010c020e0300010c0e73010c0500010c0e73010c0500010c0e73010c0500010c0e73010c0500010c0e73010c0500010c0e73010c0400120e01000220120e010001200100120e01000120140001201400012014000120140001201400012014000120140001201400012014000120140001201400" }, { "filename": "head-toiletpaper-full", - "data": "0x00071a1605010002ee11010100010002ee1101010004ee110104ee110104ee110101ee017c010d01ee110101ee017c010d01ee110101ee017c010d01ee110101ee017c010d01ee110104ee110104ee110104ee1101010002ee027c01ee010101ee010101ee010101ee010101ee010101ee010101ee01010200010002ee017c1001010004000c010500050008010800" + "data": "0x00071a16050100020a11020200020a11020100040a1102040a1102040a1102010a017d010e010a1102010a017d010e010a1102010a017d010e010a1102010a017d010e010a1102040a1102040a1102040a11020100020a027d010a0102010a0102010a0102010a0102010a0102010a0102010a01020300020a017d100205000c020a0008020800" }, { "filename": "head-tooth", - "data": "0x00041917060a0005570400030004570100025705010257020002000157040101570301015705010157010001000157060103570701015701000157100101570157110101570157110101570157110101570157110101570157110101570157110101570100015710010157020001570e0101570100020001570e0101570100030001570201097c020101570100030001570d0101570100040001570401035704010157020004000157030101570300015703010157020005000157020101570400015702010157020006000257060002570300" + "data": "0x00041917060a0005580700045801000258050202580400015804020158030201580502015802000158060203580702015801000158100202581102025811020258110202581102025811020258110201580100015810020158020001580e020158030001580e020158040001580202097d02020158040001580d020158050001580402035804020158060001580302015803000158030201580700015802020158040001580202015808000258060002580300" }, { "filename": "head-toothbrush-fresh", - "data": "0x00021914011000016707000f000167011c016706000f000167021c046702000f000167061c016701000c000667021c0101011c0167010009000367081c0101011c01670100080001670d1c01670100080001670d1c0167010008000101011c0101011c0101011c0101011c0101011c0101011c0101011c0101010008000f01010008000f01010008000f01010008000f01010008000f0101000143010002430100134302000143020013430100024301000543012301460123014601230a430700114307001143" + "data": "0x00021914011000016816000168011d016815000168021d046811000168061d01680d000668021d0102011d01680a000368081d0102011d0168090001680d1d0168090001680d1d016809000102011d0102011d0102011d0102011d0102011d0102011d0102011d010209000f0209000f0209000f0209000f0209000f0201000144010002440100134402000144020013440100024401000544012401470124014701240a440700114407001144" }, { "filename": "head-tornado", - "data": "0x00031c150406000c81060003000281017c0281047e057c0381040002000281027c0b81017c03810300020003810f7c038101000200168103000b7c0181017c078101000500118102000700047c0181017c0181017c0581040006000c81060005000d81060004000b81090002000b810b00010009810e0002000a810800018103000500088106000181040001000181010001810100017c049c0281017c0681010001810300018101000481067c0881040003001281030003000481080004810500" + "data": "0x00031c150406000c8209000282017d0282047f057d038206000282027d0b82017d0382050003820f7d03820300168203000b7d0182017d0782060011820900047d0182017d0182017d05820a000c820b000d820a000b820b000b820c00098210000a8208000182080008820600018205000182010001820100017d049d0282017d0682010001820300018201000482067d08820700128206000482080004820500" }, { "filename": "head-trashcan", - "data": "0x00031b14050900050508000700020504000105080007000105020009050300020011050300020008050723010d04000300010d08230a0d020006050323030d0505010d020002000205031f0205031f0205031f02050100010d010001000305031f0205031f0205031f03050200010501000205031f0205031f0205031f020501000105010002000205031f0205031f0205031f0205030002000205031f0205031f0205031f0205030002000205031f0205031f0205031f0205030002000205031f0205031f0205031f0205030002000205031f0205031f0205031f0205030002000205011f0523021f0205031f0205030002000205031f0205031f0205031f02050300020011050300" + "data": "0x00031b1405090005050f000205040001050f0001050200090505001105050008050724010e0700010e08240a0e020006050324030e0505010e040002050320020503200205032002050100010e0200030503200205032002050320030502000105010002050320020503200205032002050100010503000205032002050320020503200205050002050320020503200205032002050500020503200205032002050320020505000205032002050320020503200205050002050320020503200205032002050500020501200524022002050320020505000205032002050320020503200205050011050300" }, { "filename": "head-turing", - "data": "0x00041d19031500018904000300126101890161030002000289016101cc01820161018201cc01610282016101cc0182016101cc0182016101820189016103000100018901940261028201610282016101cc018201610282016102820161018201cc028902000100018901941461018902000100018901000261018201cc016102820161018201cc0161018201cc016102820161028201610189020001000189010002890282016101cc01820161028201610282016101cc0182016101cc018201610189020002890194016101891261018901940100038901610189018201cc01610282016101cc01820161018201cc016102820161018201cc0161018901000189018901000189016101890282016101cc018201610282016102820161018201cc01610282016101890100018901890100018901610189126101890100018901890100018901610189018201cc016102820161028201610282016101cc018201610282016101890100018901890100038902820161018201cc0161018201cc0161018201cc01610282016101cc018201610189010001890189010001891461018901000189018901000189026102010161020101610201016102010161020101610201016102000189018901000189026102010161020101610201016102010161020101610201016101890100018901890100018914610189010001890189010001890194110001940100028901000189020002891100018903000100018901000289150001000189010001941600020002891600" + "data": "0x00041d19031500018a07001262018a01620500028a016201cc01830162018301cc01620283016201cc0183016201cc018301620183018a01620400018a01950262028301620283016201cc018301620283016202830162018301cc028a0300018a01951462018a0300018a01000262018301cc016202830162018301cc0162018301cc01620283016202830162018a0300018a0100028a0283016201cc01830162028301620283016201cc0183016201cc01830162018a0200028a01950162018a1262018a01950100038a0162018a018301cc01620283016201cc01830162018301cc016202830162018301cc0162018a0100028a0100018a0162018a0283016201cc018301620283016202830162018301cc016202830162018a0100028a0100018a0162018a1262018a0100028a0100018a0162018a018301cc016202830162028301620283016201cc0183016202830162018a0100028a0100038a02830162018301cc0162018301cc0162018301cc01620283016201cc01830162018a0100028a0100018a1462018a0100028a0100018a02620202016202020162020201620202016202020162020201620200028a0100018a0262020201620202016202020162020201620202016202020162018a0100028a0100018a1462018a0100028a0100018a0195110001950100028a0100018a0200028a1100018a0400018a0100028a1600018a010001951800028a1600" }, { "filename": "head-ufo", - "data": "0x00021e15020e00014f0d000d00034f0c000e00014f0d000b00064f0b0009000a4f090007000e43070006000a430106014302060243060006000c430206024306000500124305000500124305000500124305000400144304000400144304000400144304000400144f04000200184f02000100054f026d014f026d014f026d014f026d014f026d014f026d044f0100064f026d014f026d014f026d014f026d014f026d014f026d054f0400144f040009000a4f0900" + "data": "0x00021e15020e0001501a0003501a0001501800065014000a5010000e440d000a4401060144020602440c000c44020602440b0012440a0012440a001244090014440800144408001444080014500600185003000550026e0150026e0150026e0150026e0150026e0150026e045001000650026e0150026e0150026e0150026e0150026e0150026e0550040014500d000a500900" }, { "filename": "head-undead", - "data": "0x00021b16050600027903260b00060004790200027903260500020001260300027903000579060002000126017902000279020003790900020001260179020002790200037909000200027902000279020002790200018003000126030002000279020003790100027905000179022602000200027903000579050004790100018002000279020005790600037901000280010002790200057907000279010003000a7904000479010004001079020004000f7902000180018005000a79040002800700087907000300018003000879070006000180017901230125012301250123027901800300018002000500038006790380050004000e80040005000180010003800200028001000180060008000180090001800300" + "data": "0x00021b16050600027a03271100047a0200027a0327070001270300027a0300057a08000127017a0200027a0200037a0b000127017a0200027a0200037a0b00027a0200027a0200027a02000181030001270500027a0200037a0100027a0500017a02270400027a0300057a0500047a010001810200027a0200057a0600037a010002810100027a0200057a0700027a04000a7a0400047a0500107a06000f7a0200028105000a7a040002810700087a0a0001810300087a0d000181017a01240126012401260124027a01810300018107000381067a038109000e81090001810100038102000281010001810e000181090001810300" }, { "filename": "head-unicorn", - "data": "0x00041b16040b00021c0a000800011c0300021c0600012602000900021c0100021c040002260300050003660100051c0200032604000200031c0366071c032601660400011c0100031c0766011c0426026604000100031c012007660426036604000200011c02200766032604660400020003200766022605660400010004200766012606660400020003200e660400020003200e66040002000320125f01000220023a0e5f0120015f0120015f0100043a035f012001660123016601230166012301660120065f0200033a125f0200033a125f0300023a12000400013a1200" + "data": "0x00041b16040b00021d1200011d0300021d060001270b00021d0100021d04000227080003670100051d020003270600031d0367071d032701670400011d0100031d0767011d042702670500031d01210767042703670600011d02210767032704670600032107670227056705000421076701270667060003210e67060003210e6706000321126001000221023b0e6001210160012101600100043b036001210167012401670124016701240167012106600200033b12600200033b12600300023b1600013b1200" }, { "filename": "head-vent", - "data": "0x00081c140418011801030101230101012301010123010101230201012301010123010101230101012305010301011f0101011f0101011f0101011f0201011f0101011f0101011f0101011f05010301011f0101011f0101011f0101011f0201011f0101011f0101011f0101011f0101012303010301011f0101011f0101011f0101011f0201011f0101011f0101011f0101011f0101012303010101011f0101011f0101011f0101011f0101011f0201011f0101011f0101011f0101011f010101230101011f01010301011f0101011f0101011f0101011f0201011f0101011f0101011f0101011f0101012303010301011f0101011f0101011f0101011f0201011f0101011f0101011f0101011f0101020202010301011f0101011f0101011f0101011f0201011f0101011f0101011f0101011f05010301010201010102010101020101010202010102010101020101010201010102050118011801" + "data": "0x00081c1404330201240102012401020124010201240202012401020124010201240102012408020120010201200102012001020120020201200102012001020120010201200802012001020120010201200102012002020120010201200102012001020120010201240602012001020120010201200102012002020120010201200102012001020120010201240402012001020120010201200102012001020120020201200102012001020120010201200102012401020120040201200102012001020120010201200202012001020120010201200102012001020124060201200102012001020120010201200202012001020120010201200102012001020201050201200102012001020120010201200202012001020120010201200102012008020101010201010102010101020101020201010102010101020101010201013502" }, { "filename": "head-void", - "data": "0x00051b14050123020001230200012302000123020001230200012302000123020001231600160001231400012316001600012314000123160016000123140001231600160001231400012316001600012302000123020001230200012302000123020001230200012302000123" + "data": "0x00051b14050124020001240200012402000124020001240200012402000124020001242c000124140001242c000124140001242c000124140001242c000124140001242c00012402000124020001240200012402000124020001240200012402000124" }, { "filename": "head-volcano", - "data": "0x00031c15040800081f08000800011f0641011f08000700021f0642021f07000700011f014106280141011f07000600021f0341031f0241021f06000600021f0141041f0141021f0141011f06000500021f01410b1f05000500041f010c051f010c031f05000400051f010c051f010c041f04000400051f010c051f010c041f04000300051f010c071f010c041f03000300051f010c071f010c041f03000200061f010c071f010c051f02000200051f010c091f010c041f02000100021f020c0f1f010c021f01000100021f020c051f010c0c1f01000a1f010c0341010c041f020c031f061f010c021f010c091f020c031f0200141f0200" + "data": "0x00031c15040800082010000120064201200f000220064302200e00012001420629014201200d00022003420320024202200c0002200142042001420220014201200b00022001420b200a000420010d0520010d032009000520010d0520010d042008000520010d0520010d042007000520010d0720010d042006000520010d0720010d042005000620010d0720010d052004000520010d0920010d042003000220020d0f20010d022002000220020d0520010d0c2001000a20010d0342010d0420020d0920010d0220010d0920020d0320020014200200" }, { "filename": "head-volleyball", - "data": "0x00031b1505090004d40900060001d401ef02d4020102d401ef01d40600040003d401ef02d4020102d401ef03d40400030001d401ef03d401ef04d401ef03d401ef01d40300020003d401ef02d401ef04d401ef02d401ef03d40200020004d40aef02d4010101d40200010004d401ef0ad401ef04d40100010003d401ef0cd401ef01d4010101d40100010003d401ef0cd401ef01d4010101d4010004d401ef0cd401ef01d4010102d404d401ef0cd401ef02d4010101d404d401ef0cd401ef02d4010101d404d401ef0cd401ef04d4010003d401ef0cd401ef04d4010003d401ef0cd401ef03d40100010001d4010102d401ef0ad401ef04d40100020001d4010102d40aef04d40200020003d401ef02d401ef04d401ef02d401ef03d40200030001d401ef03d401ef04d401ef03d401ef01d40300" + "data": "0x00031b1505090004d40f0001d401ee02d4020202d401ee01d40a0003d401ee02d4020202d401ee03d4070001d401ee03d401ee04d401ee03d401ee01d4050003d401ee02d401ee04d401ee02d401ee03d4040004d40aee02d4010201d4030004d401ee0ad401ee04d4020003d401ee0cd401ee01d4010201d4020003d401ee0cd401ee01d4010201d4010004d401ee0cd401ee01d4010206d401ee0cd401ee02d4010205d401ee0cd401ee02d4010205d401ee0cd401ee04d4010003d401ee0cd401ee04d4010003d401ee0cd401ee03d4020001d4010202d401ee0ad401ee04d4030001d4010202d40aee04d4040003d401ee02d401ee04d401ee02d401ee03d4050001d401ee03d401ee04d401ee03d401ee01d40300" }, { "filename": "head-wall", - "data": "0x00031a15060237041a01830237011a0137091a061a01830d1a061a01830d1a061a01830d1a0100128301000237011a0137091a01830237041a0d1a0183061a0d1a0183061a0d1a0183061a0100128301000237041a018301370c1a061a01830d1a061a01830d1a061a01830d1a0100128301000237011a0137091a01830237041a071a0337031a0183061a0d1a0183061a0d1a0183061a" + "data": "0x00031a15060238041b01840238011b01380f1b0184131b0184131b01840d1b0100128401000238011b0138091b01840238111b0184131b0184131b0184061b0100128401000238041b01840138121b0184131b0184131b01840d1b0100128401000238011b0138091b018402380b1b0338031b0184131b0184131b0184061b" }, { "filename": "head-wallet", - "data": "0x00081d1403020008a40e8c0200029701a408510ec801970197012301a408510ec801970d9701080c9701970ba40197010801970a430197019701a4057c05a4019701080c97019701a4017c03a4017c05a40197010801970a260197019701a4017c03a4017c05a4019701080c97019701a4027c01a4027c05a40197010801970a980197019701a4017c03a4017c05a40197010801970a980197019701a4057c01a4034701a4019701080c9701970ba4019701080c970d9701080c97" + "data": "0x00081d1403020008a40e8d0200029801a408520ec80298012401a408520ec80e9801080d980ba40198010801980a44029801a4057d05a4019801080d9801a4017d03a4017d05a40198010801980a27029801a4017d03a4017d05a4019801080d9801a4027d01a4027d05a40198010801980a99029801a4017d03a4017d05a40198010801980a99029801a4057d01a4034801a4019801080d980ba401980108199801080c98" }, { "filename": "head-wallsafe", - "data": "0x00091d140419080108117e0108052401080108017e0f08017e0108052401080108017e0f08017e07080108017e0f08017e01080124010801240108012401080108017e0f08017e07080108017e0f08017e01080124010801240108012401080108017e010801a40d08017e07080108017e01a4010801a40c08017e01080124010801240108012401080108017e010801a40208010101230101012301010123010101230308017e07080108117e010801a401080124010801a401081908" + "data": "0x00091d14041a08117f010805250208017f0f08017f010805250208017f0f08017f0808017f0f08017f0108012501080125010801250208017f0f08017f0808017f0f08017f0108012501080125010801250208017f010801a40d08017f0808017f01a4010801a40c08017f0108012501080125010801250208017f010801a40208010201240102012401020124010201240308017f0808117f010801a401080125010801a41a08" }, { "filename": "head-washingmachine", - "data": "0x0003191f0402000fee0400020002ee017201ee017201ee017401ee017201ee015101ee0155017402ee0300020002ee017401ee017401ee017201ee017403ee0143017402ee03000200037210510200037206510472065102000372045102720475027204510200037203510172087501720351020003720351017208750172035102000372025101720a750172025102000372025101720a750172025102000372025101720a750172025102000372025101720a75017202510200037203510172087501720351020003720351017208750172035102000372045102720475027204510223037201510243035104720651012301000372105101230100037210510123140001231400012314000123140001231400012314000123140001231400012314000123140001231400" + "data": "0x0003191f0402000f0a0600020a0173010a0173010a0175010a0173010a0152010a01560175020a0500020a0175010a0175010a0173010a0175030a01440175020a0500037310520200037306520473065202000373045202730476027304520200037303520173087601730352020003730352017308760173035202000373025201730a760173025202000373025201730a760173025202000373025201730a760173025202000373025201730a76017302520200037303520173087601730352020003730352017308760173035202000373045202730476027304520224037301520244035204730652012401000373105201240100037310520124140001241400012414000124140001241400012414000124140001241400012414000124140001241400" }, { "filename": "head-watch", - "data": "0x00041a150802000c0a040001000826011e0126021e0226030001260e51012602000126065102780651012602000126035101780651017803510126020001260e51012602000126015101780a51017801510126020001260e5101260100010a01260e510126010a012601260e510126020a01260e510126010a012601260e5101260100010a0126045101780451017804510126020001260e510126020001260651027806510126020001260e510126020001000e26030002000c0a0400" + "data": "0x00041a150802000c0b05000827011f0127021f0227030001270e52012702000127065202790652012702000127035201790652017903520127020001270e52012702000127015201790a52017901520127020001270e5201270100010b01270e520127010b02270e520127020b01270e520127010b02270e5201270100010b0127045201790452017904520127020001270e520127020001270652027906520127020001270e52012703000e2705000c0b0400" }, { "filename": "head-watermelon", - "data": "0x00031b15050400051d0d000300051d02240c000200051d0124011802240b000200041d0224012303240a000100041d082409000100031d06240123011802240800041d02240123011807240700031d0d240600031d0e240500031d0f240400031d10240300031d112402000100021d122401000100031d1124011d0200021d1024011d01000300021d042401230118012301180624011d02000400031d0a24021d03000500041d0624021d05000800071d0700" + "data": "0x00031b15050400051e1000051e02250e00051e0125011902250d00041e0225012403250b00041e08250a00031e06250124011902250800041e02250124011907250700031e0d250600031e0e250500031e0f250400031e10250300031e11250300021e12250200031e1125011e0200021e1025011e0400021e042501240119012401190625011e0600031e0a25021e0800041e0625021e0d00071e0700" }, { "filename": "head-wave", - "data": "0x00021c1401120004df05000e000adf03000c0002df014a0adf02000b0005df024a0243014a02df014a02df01000a0002df024a01df024a0143054a02df014a01df090002df024a01df024a01df034a01df0143024a03df090001df034a01df024a01df024a01df064a01df080002df024a01df024a01df034a01df024a0300014a01df080001df034a01df024a01df054a040001df0100070001df0d4a0600070001df0d4a0600060002df0d4a0600060001df0e4a0600050001df0f4a0600050001df0f4a0600040001df074a0143024a0143034a0143014a0600040001df044a01df024a0143034a0143034a0143014a050001df020001df044a01df044a0143034a0243054a0300010002df164a0100014a" + "data": "0x00021c1401120004df13000adf0f0002df014b0adf0d0005df024b0244014b02df014b02df0b0002df024b01df024b0144054b02df014b01df090002df024b01df024b01df034b01df0144024b03df090001df034b01df024b01df024b01df064b01df080002df024b01df024b01df034b01df024b0300014b01df080001df034b01df024b01df054b040001df080001df0d4b0d0001df0d4b0c0002df0d4b0c0001df0e4b0b0001df0f4b0b0001df0f4b0a0001df074b0144024b0144034b0144014b0a0001df044b01df024b0144034b0144034b0144014b050001df020001df044b01df044b0144034b0244054b040002df164b0100014b" }, { "filename": "head-weed", - "data": "0x00011d15020d00010f0d000c00020f0d000c00020f0100010f0b000b00040f0c000400010f0600040f0700010f04000400020f0600030f0100010f0400020f04000400030f0100010f0200050f0400030f04000500040f0200060f0100040f05000500050f0200040f0100050f05000600050f0100040f0100040f0600010f06000d0f0600010f0100020f0100010f03000b0f0500020f01000100040f0200130f01000200170f02000400130f040005000f0f07000900030f015c030f015c010f09000800050f035c030f080006000f0f06000500110f05000400020f0f00020f0400" + "data": "0x00011d15020d0001101900021019000210010001101600041010000110060004100700011008000210060003100100011004000210080003100100011002000510040003100900041002000610010004100a00051002000410010005100b00051001000410010004100600011006000d1006000110010002100100011003000b10050002100200041002001310030017100600131009000f1010000310015d0310015d011011000510035d03100e000f100b001110090002100f0002100400" }, { "filename": "head-weight", - "data": "0x00021a1405060001270896019505000600012701960727019505000600012701960600012701950500020003270d9601950200020003270396010e0196010e0196020e049601950200020003270396020e0296010e059601950200020003270396010e0196010e0196010e0196010e039601950200020003270396010e0196010e0296020e039601950200010003270f9601950100010003270f9601950100010003270f9601950100010003270f9601950100010003270f9601950100010003270f960195010003271196019503271196019503270496092704960195032711960195032711960195" + "data": "0x00021a140506000128089701960b0001280197072801960b0001280197060001280196070003280d970196040003280397010f0197010f0197020f04970196040003280397020f0297010f05970196040003280397010f0197010f0197010f0197010f03970196040003280397010f0197010f0297020f03970196030003280f970196020003280f970196020003280f970196020003280f970196020003280f970196020003280f970196010003281197019603281197019603280497092804970196032811970196032811970196" }, { "filename": "head-werewolf", - "data": "0x00061c1404030005970700059704000300059707000597040003000597070005970400030011260400030011070400030011260400030002970e8101970400030002970e8101970400020003970e8101970400010004970e810197040005971181029703000297018101d6018101d60f8102000397018101d6018101d60181042301010123010103230381010001000497018101d6018101d602230101062301010223018102000597018101d6018101d60c820300" + "data": "0x00061c1404030005980700059807000598070005980700059807000598070011270700110707001127070002980e820198070002980e820198060003980e820198050004980e820198040005981182029803000298018201d6018201d60f8202000398018201d6018201d6018204240102012401020324038202000498018201d6018201d602240102062401020224018202000598018201d6018201d60c830300" }, { "filename": "head-whale-alive", - "data": "0x00021e15021100044a07001000064a06000f00084a05000e000a4a04000d00064a010e054a0300014a0400014a0600064a010e014a010e054a0200024a0200024a05000f4a01560100064a05000f4a015601000100044a07000d4a03560200034a07000c4a04560200054a05000b4a055602000156134a065603000156114a0756030003560e4a07560100040005560a4a0856010004000656084a0856020005000556014a030e034a0856030006000356074a0856040007000156064a085606000a0009560900" + "data": "0x00021e15021100044b1700064b1500084b13000a4b1100064b010f054b0300014b0400014b0600064b010f014b010f054b0200024b0200024b05000f4b01570100064b05000f4b01570200044b07000d4b03570200034b07000c4b04570200054b05000b4b055702000157134b065703000157114b0757030003570e4b0757050005570a4b085705000657084b085707000557014b030f034b085709000357074b08570b000157064b0857100009570900" }, { "filename": "head-whale", - "data": "0x00041a1606080009d6030007000cd60100060005d6080d0100050005d6010d097c040005d6010d037c0281017c0281017c0181030005d6010d017c0281017c0281017c0281017c0181020005d6010d0481017c0281017c0281017c0181010005d6010d0581017c0281017c0281017c018106d6010d0581017c0281017c0281017c018106d6010d0581017c0281017c0281017c018106d6010d0581017c0281017c0281017c018106d6010d0481017c0381017c0281017c018106d6010d0381017c0381017c0381017c018103d6010d02d6010d0281017c0381017c0381017c028102d6030d01d602980181017c0281017c0381017c038103d6010d02d60398017c0281017c0281017c0381010006d60398017c0281017c0281017c02810200060003980b00060003980b00" + "data": "0x00041a1606080009d60a000cd6070005d6080e060005d6010e097d040005d6010e037d0282017d0282017d0182030005d6010e017d0282017d0282017d0282017d0182020005d6010e0482017d0282017d0282017d0182010005d6010e0582017d0282017d0282017d018206d6010e0582017d0282017d0282017d018206d6010e0582017d0282017d0282017d018206d6010e0582017d0282017d0282017d018206d6010e0482017d0382017d0282017d018206d6010e0382017d0382017d0382017d018203d6010e02d6010e0282017d0382017d0382017d028202d6030e01d602990182017d0282017d0382017d038203d6010e02d60399017d0282017d0282017d0382010006d60399017d0282017d0282017d028208000399110003990b00" }, { "filename": "head-wine", - "data": "0x00051b1405166f166f136f0101026f136f0101026f136f0101026f016f129401190194016f016f1494016f016f1494016f016f1494016f016f1494016f016f1494016f026f1294026f0100016f1294016f01000100026f069404190694026f01000200036f0c94036f020004000e6f0400" + "data": "0x00051b14053f700102157001021570010203701295011a019502701495027014950270149502701495027014950370129502700100017012950170020002700695041a06950270030003700c95037006000e700400" }, { "filename": "head-wizardhat", - "data": "0x00041b1404030008ec0c00020006ec014604ec0a00020001ec020002ec034604ec090002000146030002ec014606ec08000546020004ec014604ec070001000346040002ec014601ec014601ec014602ec06000100014601000146050002ec014606ec050009000aec0400080008ec014602ec0400080001ec014605ec034602ec0300080008ec014603ec0300080004ec014607ec030007000dec030006000eec0300050007ec050e02ec040003001254020001001654" + "data": "0x00041b1404030008ec0e0006ec014704ec0c0001ec020002ec034704ec0b000147030002ec014706ec08000547020004ec014704ec08000347040002ec014701ec014701ec014702ec0700014701000147050002ec014706ec0e000aec0c0008ec014702ec0c0001ec014705ec034702ec0b0008ec014703ec0b0004ec014707ec0a000dec09000eec080007ec050f02ec0700125503001655" }, { "filename": "head-zebra", - "data": "0x00061b14060a0001010123090001000223035e0101012301010123010102230100035e040001000201035e0101012301010123010101230200035e040001000223055e0123035e0123045e040001000201065e0323055e040001000223065e0323055e040001000201075e0123065e040001000223075e0123065e040001000201075e0123065e0400010002230e5e0400010002010c5e0623010002230d5e012301010123010101230301025e0101012301010123010101230101035e062303230d5e052303010d5e0523" + "data": "0x00061b14060a00010201240a000224035f0102012401020124010202240100035f05000202035f0102012401020124010201240200035f05000224055f0124035f0124045f05000202065f0324055f05000224065f0324055f05000202075f0124065f05000224075f0124065f05000202075f0124065f050002240e5f050002020c5f0624010002240d5f012401020124010201240302025f0102012401020124010201240102035f09240d5f052403020d5f0524" } ], "glasses": [ { "filename": "glasses-hip-rose", - "data": "0x000b1710070300062001000620030001200201022301200100012002010223012004200201022303200201022301200420020102230320020102230120012002000120020102230120010001200201022301200300062001000620" + "data": "0x000b1710070300062101000621030001210202022401210100012102020224052102020224032102020224052102020224032102020224022102000121020202240121010001210202022401210300062101000621" }, { "filename": "glasses-square-black-eyes-red", - "data": "0x000b17100703000623010006230300012302010264012301000123020102640123042302010264032302010264012301230200012302010264012301000123020102640123012302000123020102640123010001230201026401230300062301000623" + "data": "0x000b17100703000624010006240300012402020265012401000124020202650524020202650324020202650224020001240202026501240100012402020265022402000124020202650124010001240202026501240300062401000624" }, { "filename": "glasses-square-black-rgb", - "data": "0x000b171007030006230100062303000323016402230100032301640223102301230200012301650223015a01230100012301650223015a0123012302000623010006230300062301000623" + "data": "0x000b1710070300062401000624030003240165022401000324016513240200012401660224015b01240100012401660224015b022402000624010006240300062401000624" }, { "filename": "glasses-square-black", - "data": "0x000b171007030006230100062303000123020103230100012302010323042302010523020103230123020001230201032301000123020103230123020001230201032301000123020103230300062301000623" + "data": "0x000b171007030006240100062403000124020203240100012402020724020205240202042402000124020203240100012402020424020001240202032401000124020203240300062401000624" }, { "filename": "glasses-square-blue-med-saturated", - "data": "0x000b17100703000643010006430300014302010223014301000143020102230143044302010223034302010223014301430200014302010223014301000143020102230143014302000143020102230143010001430201022301430300064301000643" + "data": "0x000b17100703000644010006440300014402020224014401000144020202240544020202240344020202240244020001440202022401440100014402020224024402000144020202240144010001440202022401440300064401000644" }, { "filename": "glasses-square-blue", - "data": "0x000b17100703000607010006070300010702010223010701000107020102230107040702010223030702010223010701070200010702010223010701000107020102230107010702000107020102230107010001070201022301070300060701000607" + "data": "0x000b17100703000607010006070300010702020224010701000107020202240507020202240307020202240207020001070202022401070100010702020224020702000107020202240107010001070202022401070300060701000607" }, { "filename": "glasses-square-frog-green", - "data": "0x000b171007030006c0010006c0030001c00201022301c0010001c00201022301c004c00201022303c00201022301c001c0020001c00201022301c0010001c00201022301c001c0020001c00201022301c0010001c00201022301c0030006c0010006c0" + "data": "0x000b171007030006c0010006c0030001c00202022401c0010001c00202022405c00202022403c00202022402c0020001c00202022401c0010001c00202022402c0020001c00202022401c0010001c00202022401c0030006c0010006c0" }, { "filename": "glasses-square-fullblack", - "data": "0x000b1710070300062301000623030004230101012301000423010101230723010106230101012301230200062301000623012302000623010006230300062301000623" + "data": "0x000b1710070300062401000624030004240102012401000424010208240102062401020224020006240100072402000624010006240300062401000624" }, { "filename": "glasses-square-green-blue-multi", - "data": "0x000b1710070300060f0100068b0300010f02010223010f0100018b02010223018b034a010f02010223010f014a018b02010223018b018b0200010f02010223010f0100018b02010223018b018b0200010f02010223010f0100018b02010223018b0300060f0100068b" + "data": "0x000b171007030006100100068c030001100202022401100100018c02020224048c0110020202240110028c02020224028c020001100202022401100100018c02020224028c020001100202022401100100018c02020224018c030006100100068c" }, { "filename": "glasses-square-grey-light", - "data": "0x000b171007030006c8010006c8030001c80201022301c8010001c80201022301c804c80201022303c80201022301c801c8020001c80201022301c8010001c80201022301c801c8020001c80201022301c8010001c80201022301c8030006c8010006c8" + "data": "0x000b171007030006c8010006c8030001c80202022401c8010001c80202022405c80202022403c80202022402c8020001c80202022401c8010001c80202022402c8020001c80202022401c8010001c80202022401c8030006c8010006c8" }, { "filename": "glasses-square-guava", - "data": "0x000b17100703000637010006370300013702010223013701000137020102230137043702010223033702010223013701370200013702010223013701000137020102230137013702000137020102230137010001370201022301370300063701000637" + "data": "0x000b17100703000638010006380300013802020224013801000138020202240538020202240338020202240238020001380202022401380100013802020224023802000138020202240138010001380202022401380300063801000638" }, { "filename": "glasses-square-honey", - "data": "0x000b171007030006de010006de030001de0201022301de010001de0201022301de04de0201022303de0201022301de01de020001de0201022301de010001de0201022301de01de020001de0201022301de010001de0201022301de030006de010006de" + "data": "0x000b171007030006de010006de030001de0202022401de010001de0202022405de0202022403de0202022402de020001de0202022401de010001de0202022402de020001de0202022401de010001de0202022401de030006de010006de" }, { "filename": "glasses-square-magenta", - "data": "0x000b17100703000609010006090300010902010223010901000109020102230109040902010223030902010223010901090200010902010223010901000109020102230109010902000109020102230109010001090201022301090300060901000609" + "data": "0x000b17100703000609010006090300010902020224010901000109020202240509020202240309020202240209020001090202022401090100010902020224020902000109020202240109010001090202022401090300060901000609" }, { "filename": "glasses-square-orange", - "data": "0x000b17100703000614010006140300011402010223011401000114020102230114041402010223031402010223011401140200011402010223011401000114020102230114011402000114020102230114010001140201022301140300061401000614" + "data": "0x000b17100703000615010006150300011502020224011501000115020202240515020202240315020202240215020001150202022401150100011502020224021502000115020202240115010001150202022401150300061501000615" }, { "filename": "glasses-square-pink-purple-multi", - "data": "0x000b171007030006200100069a030001200201022301200100019a02010223019a036e0120020102230120016e019a02010223019a019a020001200201022301200100019a02010223019a019a020001200201022301200100019a02010223019a030006200100069a" + "data": "0x000b171007030006210100069b030001210202022401210100019b02020224049b0121020202240121029b02020224029b020001210202022401210100019b02020224029b020001210202022401210100019b02020224019b030006210100069b" }, { "filename": "glasses-square-red", - "data": "0x000b17100703000624010006240300012402010223012401000124020102230124042402010223032402010223012401240200012402010223012401000124020102230124012402000124020102230124010001240201022301240300062401000624" + "data": "0x000b17100703000625010006250300012502020224012501000125020202240525020202240325020202240225020001250202022401250100012502020224022502000125020202240125010001250202022401250300062501000625" }, { "filename": "glasses-square-smoke", - "data": "0x000b17100703000659010006590300015902660223015901000159026602230159045902660223035902660223015901590200015902660223015901000159026602230159015902000159026602230159010001590266022301590300065901000659" + "data": "0x000b1710070300065a0100065a0300015a02670224015a0100015a02670224055a02670224035a02670224025a0200015a02670224015a0100015a02670224025a0200015a02670224015a0100015a02670224015a0300065a0100065a" }, { "filename": "glasses-square-teal", - "data": "0x000b1710070300061c0100061c0300011c02010223011c0100011c02010223011c041c02010223031c02010223011c011c0200011c02010223011c0100011c02010223011c011c0200011c02010223011c0100011c02010223011c0300061c0100061c" + "data": "0x000b1710070300061d0100061d0300011d02020224011d0100011d02020224051d02020224031d02020224021d0200011d02020224011d0100011d02020224021d0200011d02020224011d0100011d02020224011d0300061d0100061d" }, { "filename": "glasses-square-watermelon", - "data": "0x000b17100703000637010006370300013702010223013701000137020102230137043702010223033702010223013701370200013702010223013701000137020102230137013702000137020102230137010001370201022301370300063701000637" + "data": "0x000b171007030006a1010006a1030001a10202022401a1010001a10202022405a10202022403a10202022402a1020001a10202022401a1010001a10202022402a1020001a10202022401a1010001a10202022401a1030006a1010006a1" }, { "filename": "glasses-square-yellow-orange-multi", - "data": "0x000b17100703000626010006130300012602010223012601000113020102230113034201260201022301260142011302010223011301260200012602010223012601000113020102230113012602000126020102230126010001130201022301130300062601000613" + "data": "0x000b1710070300062701000614030001270202022401270100011402020224041401270202022401270214020202240214020001270202022401270100011402020224021402000127020202240127010001140202022401140300062701000614" }, { "filename": "glasses-square-yellow-saturated", - "data": "0x000b17100703000628010006280300012802010223012801000128020102230128042802010223032802010223012801280200012802010223012801000128020102230128012802000128020102230128010001280201022301280300062801000628" + "data": "0x000b17100703000629010006290300012902020224012901000129020202240529020202240329020202240229020001290202022401290100012902020224022902000129020202240129010001290202022401290300062901000629" } ] } -} +} \ No newline at end of file diff --git a/packages/nouns-contracts/.solcover.js b/packages/nouns-contracts/.solcover.js index fea730f945..7607b31b33 100644 --- a/packages/nouns-contracts/.solcover.js +++ b/packages/nouns-contracts/.solcover.js @@ -3,4 +3,9 @@ module.exports = { // WETH is for testing purposes only 'test/WETH.sol', ], + configureYulOptimizer: true, + mocha: { + grep: "@skip-on-coverage", // Find everything with this tag + invert: true // Run the grep's inverse set. + } }; diff --git a/packages/nouns-contracts/contracts/Inflator.sol b/packages/nouns-contracts/contracts/Inflator.sol new file mode 100644 index 0000000000..d6ebfe967e --- /dev/null +++ b/packages/nouns-contracts/contracts/Inflator.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-3.0 + +/// @title A contract used to decompress data compressed using the Deflate algorithm. + +/********************************* + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░██░░░████░░██░░░████░░░ * + * ░░██████░░░████████░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + *********************************/ + +pragma solidity ^0.8.6; + +import { IInflator } from './interfaces/IInflator.sol'; +import { Inflate } from './libs/Inflate.sol'; + +contract Inflator is IInflator { + /** + * @notice Decompresses Deflated bytes using the Puff algorithm + * based on Based on https://github.com/adlerjohn/inflate-sol. + * @param source the bytes to decompress. + * @param destlen the length of the original decompressed bytes. + * @return Inflate.ErrorCode 0 if successful, otherwise an error code specifying the reason for failure. + * @return bytes the decompressed bytes. + */ + function puff(bytes memory source, uint256 destlen) public pure returns (Inflate.ErrorCode, bytes memory) { + return Inflate.puff(source, destlen); + } +} diff --git a/packages/nouns-contracts/contracts/NounsArt.sol b/packages/nouns-contracts/contracts/NounsArt.sol new file mode 100644 index 0000000000..99c4e32f6b --- /dev/null +++ b/packages/nouns-contracts/contracts/NounsArt.sol @@ -0,0 +1,450 @@ +// SPDX-License-Identifier: GPL-3.0 + +/// @title The Nouns art storage contract + +/********************************* + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░██░░░████░░██░░░████░░░ * + * ░░██████░░░████████░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + *********************************/ + +pragma solidity ^0.8.6; + +import { INounsArt } from './interfaces/INounsArt.sol'; +import { SSTORE2 } from './libs/SSTORE2.sol'; +import { IInflator } from './interfaces/IInflator.sol'; + +contract NounsArt is INounsArt { + /// @notice Current Nouns Descriptor address + address public override descriptor; + + /// @notice Current inflator address + IInflator public override inflator; + + /// @notice Noun Backgrounds (Hex Colors) + string[] public override backgrounds; + + /// @notice Noun Color Palettes (Index => Hex Colors, stored as a contract using SSTORE2) + mapping(uint8 => address) public palettesPointers; + + /// @notice Noun Bodies Trait + Trait public bodiesTrait; + + /// @notice Noun Accessories Trait + Trait public accessoriesTrait; + + /// @notice Noun Heads Trait + Trait public headsTrait; + + /// @notice Noun Glasses Trait + Trait public glassesTrait; + + /** + * @notice Require that the sender is the descriptor. + */ + modifier onlyDescriptor() { + if (msg.sender != descriptor) { + revert SenderIsNotDescriptor(); + } + _; + } + + constructor(address _descriptor, IInflator _inflator) { + descriptor = _descriptor; + inflator = _inflator; + } + + /** + * @notice Set the descriptor. + * @dev This function can only be called by the current descriptor. + */ + function setDescriptor(address _descriptor) external override onlyDescriptor { + address oldDescriptor = descriptor; + descriptor = _descriptor; + + emit DescriptorUpdated(oldDescriptor, descriptor); + } + + /** + * @notice Set the inflator. + * @dev This function can only be called by the descriptor. + */ + function setInflator(IInflator _inflator) external override onlyDescriptor { + address oldInflator = address(inflator); + inflator = _inflator; + + emit InflatorUpdated(oldInflator, address(_inflator)); + } + + /** + * @notice Get the Trait struct for bodies. + * @dev This explicit getter is needed because implicit getters for structs aren't fully supported yet: + * https://github.com/ethereum/solidity/issues/11826 + * @return Trait the struct, including a total image count, and an array of storage pages. + */ + function getBodiesTrait() external view override returns (Trait memory) { + return bodiesTrait; + } + + /** + * @notice Get the Trait struct for accessories. + * @dev This explicit getter is needed because implicit getters for structs aren't fully supported yet: + * https://github.com/ethereum/solidity/issues/11826 + * @return Trait the struct, including a total image count, and an array of storage pages. + */ + function getAccessoriesTrait() external view override returns (Trait memory) { + return accessoriesTrait; + } + + /** + * @notice Get the Trait struct for heads. + * @dev This explicit getter is needed because implicit getters for structs aren't fully supported yet: + * https://github.com/ethereum/solidity/issues/11826 + * @return Trait the struct, including a total image count, and an array of storage pages. + */ + function getHeadsTrait() external view override returns (Trait memory) { + return headsTrait; + } + + /** + * @notice Get the Trait struct for glasses. + * @dev This explicit getter is needed because implicit getters for structs aren't fully supported yet: + * https://github.com/ethereum/solidity/issues/11826 + * @return Trait the struct, including a total image count, and an array of storage pages. + */ + function getGlassesTrait() external view override returns (Trait memory) { + return glassesTrait; + } + + /** + * @notice Batch add Noun backgrounds. + * @dev This function can only be called by the descriptor. + */ + function addManyBackgrounds(string[] calldata _backgrounds) external override onlyDescriptor { + for (uint256 i = 0; i < _backgrounds.length; i++) { + _addBackground(_backgrounds[i]); + } + + emit BackgroundsAdded(_backgrounds.length); + } + + /** + * @notice Add a Noun background. + * @dev This function can only be called by the descriptor. + */ + function addBackground(string calldata _background) external override onlyDescriptor { + _addBackground(_background); + + emit BackgroundsAdded(1); + } + + /** + * @notice Update a single color palette. This function can be used to + * add a new color palette or update an existing palette. + * @param paletteIndex the identifier of this palette + * @param palette byte array of colors. every 3 bytes represent an RGB color. max length: 256 * 3 = 768 + * @dev This function can only be called by the descriptor. + */ + function setPalette(uint8 paletteIndex, bytes calldata palette) external override onlyDescriptor { + if (palette.length == 0) { + revert EmptyPalette(); + } + if (palette.length % 3 != 0 || palette.length > 768) { + revert BadPaletteLength(); + } + palettesPointers[paletteIndex] = SSTORE2.write(palette); + + emit PaletteSet(paletteIndex); + } + + /** + * @notice Add a batch of body images. + * @param encodedCompressed bytes created by taking a string array of RLE-encoded images, abi encoding it as a bytes array, + * and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches. + * @dev This function can only be called by the descriptor. + */ + function addBodies( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyDescriptor { + addPage(bodiesTrait, encodedCompressed, decompressedLength, imageCount); + + emit BodiesAdded(imageCount); + } + + /** + * @notice Add a batch of accessory images. + * @param encodedCompressed bytes created by taking a string array of RLE-encoded images, abi encoding it as a bytes array, + * and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches. + * @dev This function can only be called by the descriptor. + */ + function addAccessories( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyDescriptor { + addPage(accessoriesTrait, encodedCompressed, decompressedLength, imageCount); + + emit AccessoriesAdded(imageCount); + } + + /** + * @notice Add a batch of head images. + * @param encodedCompressed bytes created by taking a string array of RLE-encoded images, abi encoding it as a bytes array, + * and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches. + * @dev This function can only be called by the descriptor. + */ + function addHeads( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyDescriptor { + addPage(headsTrait, encodedCompressed, decompressedLength, imageCount); + + emit HeadsAdded(imageCount); + } + + /** + * @notice Add a batch of glasses images. + * @param encodedCompressed bytes created by taking a string array of RLE-encoded images, abi encoding it as a bytes array, + * and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches. + * @dev This function can only be called by the descriptor. + */ + function addGlasses( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyDescriptor { + addPage(glassesTrait, encodedCompressed, decompressedLength, imageCount); + + emit GlassesAdded(imageCount); + } + + /** + * @notice Update a single color palette. This function can be used to + * add a new color palette or update an existing palette. This function does not check for data length validity + * (len <= 768, len % 3 == 0). + * @param paletteIndex the identifier of this palette + * @param pointer the address of the contract holding the palette bytes. every 3 bytes represent an RGB color. + * max length: 256 * 3 = 768. + * @dev This function can only be called by the descriptor. + */ + function setPalettePointer(uint8 paletteIndex, address pointer) external override onlyDescriptor { + palettesPointers[paletteIndex] = pointer; + + emit PaletteSet(paletteIndex); + } + + /** + * @notice Add a batch of body images from an existing storage contract. + * @param pointer the address of a contract where the image batch was stored using SSTORE2. The data + * format is expected to be like {encodedCompressed}: bytes created by taking a string array of + * RLE-encoded images, abi encoding it as a bytes array, and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches. + * @dev This function can only be called by the descriptor. + */ + function addBodiesFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyDescriptor { + addPage(bodiesTrait, pointer, decompressedLength, imageCount); + + emit BodiesAdded(imageCount); + } + + /** + * @notice Add a batch of accessory images from an existing storage contract. + * @param pointer the address of a contract where the image batch was stored using SSTORE2. The data + * format is expected to be like {encodedCompressed}: bytes created by taking a string array of + * RLE-encoded images, abi encoding it as a bytes array, and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches. + * @dev This function can only be called by the descriptor. + */ + function addAccessoriesFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyDescriptor { + addPage(accessoriesTrait, pointer, decompressedLength, imageCount); + + emit AccessoriesAdded(imageCount); + } + + /** + * @notice Add a batch of head images from an existing storage contract. + * @param pointer the address of a contract where the image batch was stored using SSTORE2. The data + * format is expected to be like {encodedCompressed}: bytes created by taking a string array of + * RLE-encoded images, abi encoding it as a bytes array, and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches + * @dev This function can only be called by the descriptor.. + */ + function addHeadsFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyDescriptor { + addPage(headsTrait, pointer, decompressedLength, imageCount); + + emit HeadsAdded(imageCount); + } + + /** + * @notice Add a batch of glasses images from an existing storage contract. + * @param pointer the address of a contract where the image batch was stored using SSTORE2. The data + * format is expected to be like {encodedCompressed}: bytes created by taking a string array of + * RLE-encoded images, abi encoding it as a bytes array, and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches. + * @dev This function can only be called by the descriptor. + */ + function addGlassesFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyDescriptor { + addPage(glassesTrait, pointer, decompressedLength, imageCount); + + emit GlassesAdded(imageCount); + } + + /** + * @notice Get the number of available Noun `backgrounds`. + */ + function backgroundsCount() public view override returns (uint256) { + return backgrounds.length; + } + + /** + * @notice Get a head image bytes (RLE-encoded). + */ + function heads(uint256 index) public view override returns (bytes memory) { + return imageByIndex(headsTrait, index); + } + + /** + * @notice Get a body image bytes (RLE-encoded). + */ + function bodies(uint256 index) public view override returns (bytes memory) { + return imageByIndex(bodiesTrait, index); + } + + /** + * @notice Get a accessory image bytes (RLE-encoded). + */ + function accessories(uint256 index) public view override returns (bytes memory) { + return imageByIndex(accessoriesTrait, index); + } + + /** + * @notice Get a glasses image bytes (RLE-encoded). + */ + function glasses(uint256 index) public view override returns (bytes memory) { + return imageByIndex(glassesTrait, index); + } + + /** + * @notice Get a color palette bytes. + */ + function palettes(uint8 paletteIndex) public view override returns (bytes memory) { + address pointer = palettesPointers[paletteIndex]; + if (pointer == address(0)) { + revert PaletteNotFound(); + } + return SSTORE2.read(palettesPointers[paletteIndex]); + } + + function _addBackground(string calldata _background) internal { + backgrounds.push(_background); + } + + function addPage( + Trait storage trait, + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) internal { + if (encodedCompressed.length == 0) { + revert EmptyBytes(); + } + address pointer = SSTORE2.write(encodedCompressed); + addPage(trait, pointer, decompressedLength, imageCount); + } + + function addPage( + Trait storage trait, + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) internal { + if (decompressedLength == 0) { + revert BadDecompressedLength(); + } + if (imageCount == 0) { + revert BadImageCount(); + } + trait.storagePages.push( + NounArtStoragePage({ pointer: pointer, decompressedLength: decompressedLength, imageCount: imageCount }) + ); + trait.storedImagesCount += imageCount; + } + + function imageByIndex(INounsArt.Trait storage trait, uint256 index) internal view returns (bytes memory) { + (INounsArt.NounArtStoragePage storage page, uint256 indexInPage) = getPage(trait.storagePages, index); + bytes[] memory decompressedImages = decompressAndDecode(page); + return decompressedImages[indexInPage]; + } + + /** + * @dev Given an image index, this function finds the storage page the image is in, and the relative index + * inside the page, so the image can be read from storage. + * Example: if you have 2 pages with 100 images each, and you want to get image 150, this function would return + * the 2nd page, and the 50th index. + * @return INounsArt.NounArtStoragePage the page containing the image at index + * @return uint256 the index of the image in the page + */ + function getPage(INounsArt.NounArtStoragePage[] storage pages, uint256 index) + internal + view + returns (INounsArt.NounArtStoragePage storage, uint256) + { + uint256 len = pages.length; + uint256 pageFirstImageIndex = 0; + for (uint256 i = 0; i < len; i++) { + INounsArt.NounArtStoragePage storage page = pages[i]; + + if (index < pageFirstImageIndex + page.imageCount) { + return (page, index - pageFirstImageIndex); + } + + pageFirstImageIndex += page.imageCount; + } + + revert ImageNotFound(); + } + + function decompressAndDecode(INounsArt.NounArtStoragePage storage page) internal view returns (bytes[] memory) { + bytes memory compressedData = SSTORE2.read(page.pointer); + (, bytes memory decompressedData) = inflator.puff(compressedData, page.decompressedLength); + return abi.decode(decompressedData, (bytes[])); + } +} diff --git a/packages/nouns-contracts/contracts/NounsDescriptorV2.sol b/packages/nouns-contracts/contracts/NounsDescriptorV2.sol new file mode 100644 index 0000000000..026db3dc69 --- /dev/null +++ b/packages/nouns-contracts/contracts/NounsDescriptorV2.sol @@ -0,0 +1,470 @@ +// SPDX-License-Identifier: GPL-3.0 + +/// @title The Nouns NFT descriptor + +/********************************* + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░██░░░████░░██░░░████░░░ * + * ░░██████░░░████████░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + *********************************/ + +pragma solidity ^0.8.6; + +import { Ownable } from '@openzeppelin/contracts/access/Ownable.sol'; +import { Strings } from '@openzeppelin/contracts/utils/Strings.sol'; +import { INounsDescriptorV2 } from './interfaces/INounsDescriptorV2.sol'; +import { INounsSeeder } from './interfaces/INounsSeeder.sol'; +import { NFTDescriptorV2 } from './libs/NFTDescriptorV2.sol'; +import { ISVGRenderer } from './interfaces/ISVGRenderer.sol'; +import { INounsArt } from './interfaces/INounsArt.sol'; +import { IInflator } from './interfaces/IInflator.sol'; + +contract NounsDescriptorV2 is INounsDescriptorV2, Ownable { + using Strings for uint256; + + // prettier-ignore + // https://creativecommons.org/publicdomain/zero/1.0/legalcode.txt + bytes32 constant COPYRIGHT_CC0_1_0_UNIVERSAL_LICENSE = 0xa2010f343487d3f7618affe54f789f5487602331c0a8d03f49e9a7c547cf0499; + + /// @notice The contract responsible for holding compressed Noun art + INounsArt public art; + + /// @notice The contract responsible for constructing SVGs + ISVGRenderer public renderer; + + /// @notice Whether or not new Noun parts can be added + bool public override arePartsLocked; + + /// @notice Whether or not `tokenURI` should be returned as a data URI (Default: true) + bool public override isDataURIEnabled = true; + + /// @notice Base URI, used when isDataURIEnabled is false + string public override baseURI; + + /** + * @notice Require that the parts have not been locked. + */ + modifier whenPartsNotLocked() { + require(!arePartsLocked, 'Parts are locked'); + _; + } + + constructor(INounsArt _art, ISVGRenderer _renderer) { + art = _art; + renderer = _renderer; + } + + /** + * @notice Set the Noun's art contract. + * @dev Only callable by the owner when not locked. + */ + function setArt(INounsArt _art) external onlyOwner whenPartsNotLocked { + art = _art; + + emit ArtUpdated(_art); + } + + /** + * @notice Set the SVG renderer. + * @dev Only callable by the owner. + */ + function setRenderer(ISVGRenderer _renderer) external onlyOwner { + renderer = _renderer; + + emit RendererUpdated(_renderer); + } + + /** + * @notice Set the art contract's `descriptor`. + * @param descriptor the address to set. + * @dev Only callable by the owner. + */ + function setArtDescriptor(address descriptor) external onlyOwner { + art.setDescriptor(descriptor); + } + + /** + * @notice Set the art contract's `inflator`. + * @param inflator the address to set. + * @dev Only callable by the owner. + */ + function setArtInflator(IInflator inflator) external onlyOwner { + art.setInflator(inflator); + } + + /** + * @notice Get the number of available Noun `backgrounds`. + */ + function backgroundCount() external view override returns (uint256) { + return art.backgroundsCount(); + } + + /** + * @notice Get the number of available Noun `bodies`. + */ + function bodyCount() external view override returns (uint256) { + return art.getBodiesTrait().storedImagesCount; + } + + /** + * @notice Get the number of available Noun `accessories`. + */ + function accessoryCount() external view override returns (uint256) { + return art.getAccessoriesTrait().storedImagesCount; + } + + /** + * @notice Get the number of available Noun `heads`. + */ + function headCount() external view override returns (uint256) { + return art.getHeadsTrait().storedImagesCount; + } + + /** + * @notice Get the number of available Noun `glasses`. + */ + function glassesCount() external view override returns (uint256) { + return art.getGlassesTrait().storedImagesCount; + } + + /** + * @notice Batch add Noun backgrounds. + * @dev This function can only be called by the owner when not locked. + */ + function addManyBackgrounds(string[] calldata _backgrounds) external override onlyOwner whenPartsNotLocked { + art.addManyBackgrounds(_backgrounds); + } + + /** + * @notice Add a Noun background. + * @dev This function can only be called by the owner when not locked. + */ + function addBackground(string calldata _background) external override onlyOwner whenPartsNotLocked { + art.addBackground(_background); + } + + /** + * @notice Update a single color palette. This function can be used to + * add a new color palette or update an existing palette. + * @param paletteIndex the identifier of this palette + * @param palette byte array of colors. every 3 bytes represent an RGB color. max length: 256 * 3 = 768 + * @dev This function can only be called by the owner when not locked. + */ + function setPalette(uint8 paletteIndex, bytes calldata palette) external override onlyOwner whenPartsNotLocked { + art.setPalette(paletteIndex, palette); + } + + /** + * @notice Add a batch of body images. + * @param encodedCompressed bytes created by taking a string array of RLE-encoded images, abi encoding it as a bytes array, + * and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches. + * @dev This function can only be called by the owner when not locked. + */ + function addBodies( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyOwner whenPartsNotLocked { + art.addBodies(encodedCompressed, decompressedLength, imageCount); + } + + /** + * @notice Add a batch of accessory images. + * @param encodedCompressed bytes created by taking a string array of RLE-encoded images, abi encoding it as a bytes array, + * and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches. + * @dev This function can only be called by the owner when not locked. + */ + function addAccessories( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyOwner whenPartsNotLocked { + art.addAccessories(encodedCompressed, decompressedLength, imageCount); + } + + /** + * @notice Add a batch of head images. + * @param encodedCompressed bytes created by taking a string array of RLE-encoded images, abi encoding it as a bytes array, + * and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches. + * @dev This function can only be called by the owner when not locked. + */ + function addHeads( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyOwner whenPartsNotLocked { + art.addHeads(encodedCompressed, decompressedLength, imageCount); + } + + /** + * @notice Add a batch of glasses images. + * @param encodedCompressed bytes created by taking a string array of RLE-encoded images, abi encoding it as a bytes array, + * and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches. + * @dev This function can only be called by the owner when not locked. + */ + function addGlasses( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyOwner whenPartsNotLocked { + art.addGlasses(encodedCompressed, decompressedLength, imageCount); + } + + /** + * @notice Update a single color palette. This function can be used to + * add a new color palette or update an existing palette. This function does not check for data length validity + * (len <= 768, len % 3 == 0). + * @param paletteIndex the identifier of this palette + * @param pointer the address of the contract holding the palette bytes. every 3 bytes represent an RGB color. + * max length: 256 * 3 = 768. + * @dev This function can only be called by the owner when not locked. + */ + function setPalettePointer(uint8 paletteIndex, address pointer) external override onlyOwner whenPartsNotLocked { + art.setPalettePointer(paletteIndex, pointer); + } + + /** + * @notice Add a batch of body images from an existing storage contract. + * @param pointer the address of a contract where the image batch was stored using SSTORE2. The data + * format is expected to be like {encodedCompressed}: bytes created by taking a string array of + * RLE-encoded images, abi encoding it as a bytes array, and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches. + * @dev This function can only be called by the owner when not locked. + */ + function addBodiesFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyOwner whenPartsNotLocked { + art.addBodiesFromPointer(pointer, decompressedLength, imageCount); + } + + /** + * @notice Add a batch of accessory images from an existing storage contract. + * @param pointer the address of a contract where the image batch was stored using SSTORE2. The data + * format is expected to be like {encodedCompressed}: bytes created by taking a string array of + * RLE-encoded images, abi encoding it as a bytes array, and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches. + * @dev This function can only be called by the owner when not locked. + */ + function addAccessoriesFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyOwner whenPartsNotLocked { + art.addAccessoriesFromPointer(pointer, decompressedLength, imageCount); + } + + /** + * @notice Add a batch of head images from an existing storage contract. + * @param pointer the address of a contract where the image batch was stored using SSTORE2. The data + * format is expected to be like {encodedCompressed}: bytes created by taking a string array of + * RLE-encoded images, abi encoding it as a bytes array, and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches. + * @dev This function can only be called by the owner when not locked. + */ + function addHeadsFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyOwner whenPartsNotLocked { + art.addHeadsFromPointer(pointer, decompressedLength, imageCount); + } + + /** + * @notice Add a batch of glasses images from an existing storage contract. + * @param pointer the address of a contract where the image batch was stored using SSTORE2. The data + * format is expected to be like {encodedCompressed}: bytes created by taking a string array of + * RLE-encoded images, abi encoding it as a bytes array, and finally compressing it using deflate. + * @param decompressedLength the size in bytes the images bytes were prior to compression; required input for Inflate. + * @param imageCount the number of images in this batch; used when searching for images among batches. + * @dev This function can only be called by the owner when not locked. + */ + function addGlassesFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external override onlyOwner whenPartsNotLocked { + art.addGlassesFromPointer(pointer, decompressedLength, imageCount); + } + + /** + * @notice Get a background color by ID. + * @param index the index of the background. + * @return string the RGB hex value of the background. + */ + function backgrounds(uint256 index) public view override returns (string memory) { + return art.backgrounds(index); + } + + /** + * @notice Get a head image by ID. + * @param index the index of the head. + * @return bytes the RLE-encoded bytes of the image. + */ + function heads(uint256 index) public view override returns (bytes memory) { + return art.heads(index); + } + + /** + * @notice Get a body image by ID. + * @param index the index of the body. + * @return bytes the RLE-encoded bytes of the image. + */ + function bodies(uint256 index) public view override returns (bytes memory) { + return art.bodies(index); + } + + /** + * @notice Get an accessory image by ID. + * @param index the index of the accessory. + * @return bytes the RLE-encoded bytes of the image. + */ + function accessories(uint256 index) public view override returns (bytes memory) { + return art.accessories(index); + } + + /** + * @notice Get a glasses image by ID. + * @param index the index of the glasses. + * @return bytes the RLE-encoded bytes of the image. + */ + function glasses(uint256 index) public view override returns (bytes memory) { + return art.glasses(index); + } + + /** + * @notice Get a color palette by ID. + * @param index the index of the palette. + * @return bytes the palette bytes, where every 3 consecutive bytes represent a color in RGB format. + */ + function palettes(uint8 index) public view override returns (bytes memory) { + return art.palettes(index); + } + + /** + * @notice Lock all Noun parts. + * @dev This cannot be reversed and can only be called by the owner when not locked. + */ + function lockParts() external override onlyOwner whenPartsNotLocked { + arePartsLocked = true; + + emit PartsLocked(); + } + + /** + * @notice Toggle a boolean value which determines if `tokenURI` returns a data URI + * or an HTTP URL. + * @dev This can only be called by the owner. + */ + function toggleDataURIEnabled() external override onlyOwner { + bool enabled = !isDataURIEnabled; + + isDataURIEnabled = enabled; + emit DataURIToggled(enabled); + } + + /** + * @notice Set the base URI for all token IDs. It is automatically + * added as a prefix to the value returned in {tokenURI}, or to the + * token ID if {tokenURI} is empty. + * @dev This can only be called by the owner. + */ + function setBaseURI(string calldata _baseURI) external override onlyOwner { + baseURI = _baseURI; + + emit BaseURIUpdated(_baseURI); + } + + /** + * @notice Given a token ID and seed, construct a token URI for an official Nouns DAO noun. + * @dev The returned value may be a base64 encoded data URI or an API URL. + */ + function tokenURI(uint256 tokenId, INounsSeeder.Seed memory seed) external view override returns (string memory) { + if (isDataURIEnabled) { + return dataURI(tokenId, seed); + } + return string(abi.encodePacked(baseURI, tokenId.toString())); + } + + /** + * @notice Given a token ID and seed, construct a base64 encoded data URI for an official Nouns DAO noun. + */ + function dataURI(uint256 tokenId, INounsSeeder.Seed memory seed) public view override returns (string memory) { + string memory nounId = tokenId.toString(); + string memory name = string(abi.encodePacked('Noun ', nounId)); + string memory description = string(abi.encodePacked('Noun ', nounId, ' is a member of the Nouns DAO')); + + return genericDataURI(name, description, seed); + } + + /** + * @notice Given a name, description, and seed, construct a base64 encoded data URI. + */ + function genericDataURI( + string memory name, + string memory description, + INounsSeeder.Seed memory seed + ) public view override returns (string memory) { + NFTDescriptorV2.TokenURIParams memory params = NFTDescriptorV2.TokenURIParams({ + name: name, + description: description, + parts: getPartsForSeed(seed), + background: art.backgrounds(seed.background) + }); + return NFTDescriptorV2.constructTokenURI(renderer, params); + } + + /** + * @notice Given a seed, construct a base64 encoded SVG image. + */ + function generateSVGImage(INounsSeeder.Seed memory seed) external view override returns (string memory) { + ISVGRenderer.SVGParams memory params = ISVGRenderer.SVGParams({ + parts: getPartsForSeed(seed), + background: art.backgrounds(seed.background) + }); + return NFTDescriptorV2.generateSVGImage(renderer, params); + } + + /** + * @notice Get all Noun parts for the passed `seed`. + */ + function getPartsForSeed(INounsSeeder.Seed memory seed) public view returns (ISVGRenderer.Part[] memory) { + bytes memory body = art.bodies(seed.body); + bytes memory accessory = art.accessories(seed.accessory); + bytes memory head = art.heads(seed.head); + bytes memory glasses_ = art.glasses(seed.glasses); + + ISVGRenderer.Part[] memory parts = new ISVGRenderer.Part[](4); + parts[0] = ISVGRenderer.Part({ image: body, palette: _getPalette(body) }); + parts[1] = ISVGRenderer.Part({ image: accessory, palette: _getPalette(accessory) }); + parts[2] = ISVGRenderer.Part({ image: head, palette: _getPalette(head) }); + parts[3] = ISVGRenderer.Part({ image: glasses_, palette: _getPalette(glasses_) }); + return parts; + } + + /** + * @notice Get the color palette pointer for the passed part. + */ + function _getPalette(bytes memory part) private view returns (bytes memory) { + return art.palettes(uint8(part[0])); + } +} diff --git a/packages/nouns-contracts/contracts/NounsSeeder.sol b/packages/nouns-contracts/contracts/NounsSeeder.sol index 099d8aca64..5351bec8be 100644 --- a/packages/nouns-contracts/contracts/NounsSeeder.sol +++ b/packages/nouns-contracts/contracts/NounsSeeder.sol @@ -18,14 +18,14 @@ pragma solidity ^0.8.6; import { INounsSeeder } from './interfaces/INounsSeeder.sol'; -import { INounsDescriptor } from './interfaces/INounsDescriptor.sol'; +import { INounsDescriptorMinimal } from './interfaces/INounsDescriptorMinimal.sol'; contract NounsSeeder is INounsSeeder { /** * @notice Generate a pseudo-random Noun seed using the previous blockhash and noun ID. */ // prettier-ignore - function generateSeed(uint256 nounId, INounsDescriptor descriptor) external view override returns (Seed memory) { + function generateSeed(uint256 nounId, INounsDescriptorMinimal descriptor) external view override returns (Seed memory) { uint256 pseudorandomness = uint256( keccak256(abi.encodePacked(blockhash(block.number - 1), nounId)) ); diff --git a/packages/nouns-contracts/contracts/NounsToken.sol b/packages/nouns-contracts/contracts/NounsToken.sol index 19350477a1..db569d54e3 100644 --- a/packages/nouns-contracts/contracts/NounsToken.sol +++ b/packages/nouns-contracts/contracts/NounsToken.sol @@ -19,7 +19,7 @@ pragma solidity ^0.8.6; import { Ownable } from '@openzeppelin/contracts/access/Ownable.sol'; import { ERC721Checkpointable } from './base/ERC721Checkpointable.sol'; -import { INounsDescriptor } from './interfaces/INounsDescriptor.sol'; +import { INounsDescriptorMinimal } from './interfaces/INounsDescriptorMinimal.sol'; import { INounsSeeder } from './interfaces/INounsSeeder.sol'; import { INounsToken } from './interfaces/INounsToken.sol'; import { ERC721 } from './base/ERC721.sol'; @@ -34,7 +34,7 @@ contract NounsToken is INounsToken, Ownable, ERC721Checkpointable { address public minter; // The Nouns token URI descriptor - INounsDescriptor public descriptor; + INounsDescriptorMinimal public descriptor; // The Nouns token seeder INounsSeeder public seeder; @@ -103,7 +103,7 @@ contract NounsToken is INounsToken, Ownable, ERC721Checkpointable { constructor( address _noundersDAO, address _minter, - INounsDescriptor _descriptor, + INounsDescriptorMinimal _descriptor, INounsSeeder _seeder, IProxyRegistry _proxyRegistry ) ERC721('Nouns', 'NOUN') { @@ -213,7 +213,7 @@ contract NounsToken is INounsToken, Ownable, ERC721Checkpointable { * @notice Set the token URI descriptor. * @dev Only callable by the owner when not locked. */ - function setDescriptor(INounsDescriptor _descriptor) external override onlyOwner whenDescriptorNotLocked { + function setDescriptor(INounsDescriptorMinimal _descriptor) external override onlyOwner whenDescriptorNotLocked { descriptor = _descriptor; emit DescriptorUpdated(_descriptor); diff --git a/packages/nouns-contracts/contracts/SVGRenderer.sol b/packages/nouns-contracts/contracts/SVGRenderer.sol new file mode 100644 index 0000000000..f52355ff0d --- /dev/null +++ b/packages/nouns-contracts/contracts/SVGRenderer.sol @@ -0,0 +1,230 @@ +// SPDX-License-Identifier: GPL-3.0 + +/// @title A contract used to convert multi-part RLE compressed images to SVG + +/********************************* + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░██░░░████░░██░░░████░░░ * + * ░░██████░░░████████░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + *********************************/ + +pragma solidity ^0.8.6; + +import { ISVGRenderer } from './interfaces/ISVGRenderer.sol'; + +contract SVGRenderer is ISVGRenderer { + bytes16 private constant _HEX_SYMBOLS = '0123456789abcdef'; + uint256 private constant _INDEX_TO_BYTES3_FACTOR = 3; + + // prettier-ignore + string private constant _SVG_START_TAG = ''; + string private constant _SVG_END_TAG = ''; + + struct ContentBounds { + uint8 top; + uint8 right; + uint8 bottom; + uint8 left; + } + + struct Draw { + uint8 length; + uint8 colorIndex; + } + + struct DecodedImage { + ContentBounds bounds; + Draw[] draws; + } + + /** + * @notice Given RLE image data and color palette pointers, merge to generate a single SVG image. + */ + function generateSVG(SVGParams calldata params) external pure override returns (string memory svg) { + if (bytes(params.background).length != 0) { + // prettier-ignore + return string( + abi.encodePacked( + _SVG_START_TAG, + '', + _generateSVGRects(params), + _SVG_END_TAG + ) + ); + } + return string(abi.encodePacked(_SVG_START_TAG, _generateSVGRects(params), _SVG_END_TAG)); + } + + /** + * @notice Given RLE image data and a color palette pointer, merge to generate a partial SVG image. + */ + function generateSVGPart(Part calldata part) external pure override returns (string memory partialSVG) { + Part[] memory parts = new Part[](1); + parts[0] = part; + + return _generateSVGRects(SVGParams({ parts: parts, background: '' })); + } + + /** + * @notice Given RLE image data and color palette pointers, merge to generate a partial SVG image. + */ + function generateSVGParts(Part[] calldata parts) external pure override returns (string memory partialSVG) { + return _generateSVGRects(SVGParams({ parts: parts, background: '' })); + } + + /** + * @notice Given RLE image parts and color palettes, generate SVG rects. + */ + // prettier-ignore + function _generateSVGRects(SVGParams memory params) + private + pure + returns (string memory svg) + { + string[33] memory lookup = [ + '0', '10', '20', '30', '40', '50', '60', '70', + '80', '90', '100', '110', '120', '130', '140', '150', + '160', '170', '180', '190', '200', '210', '220', '230', + '240', '250', '260', '270', '280', '290', '300', '310', + '320' + ]; + string memory rects; + string[] memory cache; + for (uint8 p = 0; p < params.parts.length; p++) { + cache = new string[](256); // Initialize color cache + + DecodedImage memory image = _decodeRLEImage(params.parts[p].image); + bytes memory palette = params.parts[p].palette; + uint256 currentX = image.bounds.left; + uint256 currentY = image.bounds.top; + uint256 cursor; + string[16] memory buffer; + + string memory part; + for (uint256 i = 0; i < image.draws.length; i++) { + Draw memory draw = image.draws[i]; + + uint8 length = _getRectLength(currentX, draw.length, image.bounds.right); + while (length > 0) { + if (draw.colorIndex != 0) { + buffer[cursor] = lookup[length]; // width + buffer[cursor + 1] = lookup[currentX]; // x + buffer[cursor + 2] = lookup[currentY]; // y + buffer[cursor + 3] = _getColor(palette, draw.colorIndex, cache); // color + + cursor += 4; + + if (cursor >= 16) { + part = string(abi.encodePacked(part, _getChunk(cursor, buffer))); + cursor = 0; + } + } + + currentX += length; + if (currentX == image.bounds.right) { + currentX = image.bounds.left; + currentY++; + } + + draw.length -= length; + length = _getRectLength(currentX, draw.length, image.bounds.right); + } + } + + if (cursor != 0) { + part = string(abi.encodePacked(part, _getChunk(cursor, buffer))); + } + rects = string(abi.encodePacked(rects, part)); + } + return rects; + } + + /** + * @notice Given an x-coordinate, draw length, and right bound, return the draw + * length for a single SVG rectangle. + */ + function _getRectLength( + uint256 currentX, + uint8 drawLength, + uint8 rightBound + ) private pure returns (uint8) { + uint8 remainingPixelsInLine = rightBound - uint8(currentX); + return drawLength <= remainingPixelsInLine ? drawLength : remainingPixelsInLine; + } + + /** + * @notice Return a string that consists of all rects in the provided `buffer`. + */ + // prettier-ignore + function _getChunk(uint256 cursor, string[16] memory buffer) private pure returns (string memory) { + string memory chunk; + for (uint256 i = 0; i < cursor; i += 4) { + chunk = string( + abi.encodePacked( + chunk, + '' + ) + ); + } + return chunk; + } + + /** + * @notice Decode a single RLE compressed image into a `DecodedImage`. + */ + function _decodeRLEImage(bytes memory image) private pure returns (DecodedImage memory) { + ContentBounds memory bounds = ContentBounds({ + top: uint8(image[1]), + right: uint8(image[2]), + bottom: uint8(image[3]), + left: uint8(image[4]) + }); + + uint256 cursor; + Draw[] memory draws = new Draw[]((image.length - 5) / 2); + for (uint256 i = 5; i < image.length; i += 2) { + draws[cursor] = Draw({ length: uint8(image[i]), colorIndex: uint8(image[i + 1]) }); + cursor++; + } + return DecodedImage({ bounds: bounds, draws: draws }); + } + + /** + * @notice Get the target hex color code from the cache. Populate the cache if + * the color code does not yet exist. + */ + function _getColor( + bytes memory palette, + uint256 index, + string[] memory cache + ) private pure returns (string memory) { + if (bytes(cache[index]).length == 0) { + uint256 i = index * _INDEX_TO_BYTES3_FACTOR; + cache[index] = _toHexString(abi.encodePacked(palette[i], palette[i + 1], palette[i + 2])); + } + return cache[index]; + } + + /** + * @dev Convert `bytes` to a 6 character ASCII `string` hexadecimal representation. + */ + function _toHexString(bytes memory b) private pure returns (string memory) { + uint24 value = uint24(bytes3(b)); + + bytes memory buffer = new bytes(6); + buffer[5] = _HEX_SYMBOLS[value & 0xf]; + buffer[4] = _HEX_SYMBOLS[(value >> 4) & 0xf]; + buffer[3] = _HEX_SYMBOLS[(value >> 8) & 0xf]; + buffer[2] = _HEX_SYMBOLS[(value >> 12) & 0xf]; + buffer[1] = _HEX_SYMBOLS[(value >> 16) & 0xf]; + buffer[0] = _HEX_SYMBOLS[(value >> 20) & 0xf]; + return string(buffer); + } +} diff --git a/packages/nouns-contracts/contracts/interfaces/IInflator.sol b/packages/nouns-contracts/contracts/interfaces/IInflator.sol new file mode 100644 index 0000000000..2cdfd8b0f6 --- /dev/null +++ b/packages/nouns-contracts/contracts/interfaces/IInflator.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-3.0 + +/// @title Interface for Inflator + +/********************************* + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░██░░░████░░██░░░████░░░ * + * ░░██████░░░████████░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + *********************************/ + +pragma solidity ^0.8.6; + +import { Inflate } from '../libs/Inflate.sol'; + +interface IInflator { + function puff(bytes memory source, uint256 destlen) external pure returns (Inflate.ErrorCode, bytes memory); +} diff --git a/packages/nouns-contracts/contracts/interfaces/INounsArt.sol b/packages/nouns-contracts/contracts/interfaces/INounsArt.sol new file mode 100644 index 0000000000..1005677264 --- /dev/null +++ b/packages/nouns-contracts/contracts/interfaces/INounsArt.sol @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: GPL-3.0 + +/// @title Interface for NounsArt + +/********************************* + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░██░░░████░░██░░░████░░░ * + * ░░██████░░░████████░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + *********************************/ + +pragma solidity ^0.8.6; + +import { Inflate } from '../libs/Inflate.sol'; +import { IInflator } from './IInflator.sol'; + +interface INounsArt { + error SenderIsNotDescriptor(); + + error EmptyPalette(); + + error BadPaletteLength(); + + error EmptyBytes(); + + error BadDecompressedLength(); + + error BadImageCount(); + + error ImageNotFound(); + + error PaletteNotFound(); + + event DescriptorUpdated(address oldDescriptor, address newDescriptor); + + event InflatorUpdated(address oldInflator, address newInflator); + + event BackgroundsAdded(uint256 count); + + event PaletteSet(uint8 paletteIndex); + + event BodiesAdded(uint16 count); + + event AccessoriesAdded(uint16 count); + + event HeadsAdded(uint16 count); + + event GlassesAdded(uint16 count); + + struct NounArtStoragePage { + uint16 imageCount; + uint80 decompressedLength; + address pointer; + } + + struct Trait { + NounArtStoragePage[] storagePages; + uint256 storedImagesCount; + } + + function descriptor() external view returns (address); + + function inflator() external view returns (IInflator); + + function setDescriptor(address descriptor) external; + + function setInflator(IInflator inflator) external; + + function addManyBackgrounds(string[] calldata _backgrounds) external; + + function addBackground(string calldata _background) external; + + function palettes(uint8 paletteIndex) external view returns (bytes memory); + + function setPalette(uint8 paletteIndex, bytes calldata palette) external; + + function addBodies( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function addAccessories( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function addHeads( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function addGlasses( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function addBodiesFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function setPalettePointer(uint8 paletteIndex, address pointer) external; + + function addAccessoriesFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function addHeadsFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function addGlassesFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function backgroundsCount() external view returns (uint256); + + function backgrounds(uint256 index) external view returns (string memory); + + function heads(uint256 index) external view returns (bytes memory); + + function bodies(uint256 index) external view returns (bytes memory); + + function accessories(uint256 index) external view returns (bytes memory); + + function glasses(uint256 index) external view returns (bytes memory); + + function getBodiesTrait() external view returns (Trait memory); + + function getAccessoriesTrait() external view returns (Trait memory); + + function getHeadsTrait() external view returns (Trait memory); + + function getGlassesTrait() external view returns (Trait memory); +} diff --git a/packages/nouns-contracts/contracts/interfaces/INounsDescriptor.sol b/packages/nouns-contracts/contracts/interfaces/INounsDescriptor.sol index 5cd1da52c6..6c676f6abd 100644 --- a/packages/nouns-contracts/contracts/interfaces/INounsDescriptor.sol +++ b/packages/nouns-contracts/contracts/interfaces/INounsDescriptor.sol @@ -18,8 +18,9 @@ pragma solidity ^0.8.6; import { INounsSeeder } from './INounsSeeder.sol'; +import { INounsDescriptorMinimal } from './INounsDescriptorMinimal.sol'; -interface INounsDescriptor { +interface INounsDescriptor is INounsDescriptorMinimal { event PartsLocked(); event DataURIToggled(bool enabled); @@ -44,15 +45,15 @@ interface INounsDescriptor { function glasses(uint256 index) external view returns (bytes memory); - function backgroundCount() external view returns (uint256); + function backgroundCount() external view override returns (uint256); - function bodyCount() external view returns (uint256); + function bodyCount() external view override returns (uint256); - function accessoryCount() external view returns (uint256); + function accessoryCount() external view override returns (uint256); - function headCount() external view returns (uint256); + function headCount() external view override returns (uint256); - function glassesCount() external view returns (uint256); + function glassesCount() external view override returns (uint256); function addManyColorsToPalette(uint8 paletteIndex, string[] calldata newColors) external; @@ -84,9 +85,9 @@ interface INounsDescriptor { function setBaseURI(string calldata baseURI) external; - function tokenURI(uint256 tokenId, INounsSeeder.Seed memory seed) external view returns (string memory); + function tokenURI(uint256 tokenId, INounsSeeder.Seed memory seed) external view override returns (string memory); - function dataURI(uint256 tokenId, INounsSeeder.Seed memory seed) external view returns (string memory); + function dataURI(uint256 tokenId, INounsSeeder.Seed memory seed) external view override returns (string memory); function genericDataURI( string calldata name, diff --git a/packages/nouns-contracts/contracts/interfaces/INounsDescriptorMinimal.sol b/packages/nouns-contracts/contracts/interfaces/INounsDescriptorMinimal.sol new file mode 100644 index 0000000000..c49d4c865d --- /dev/null +++ b/packages/nouns-contracts/contracts/interfaces/INounsDescriptorMinimal.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-3.0 + +/// @title Common interface for NounsDescriptor versions, as used by NounsToken and NounsSeeder. + +/********************************* + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░██░░░████░░██░░░████░░░ * + * ░░██████░░░████████░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + *********************************/ + +pragma solidity ^0.8.6; + +import { INounsSeeder } from './INounsSeeder.sol'; + +interface INounsDescriptorMinimal { + /// + /// USED BY TOKEN + /// + + function tokenURI(uint256 tokenId, INounsSeeder.Seed memory seed) external view returns (string memory); + + function dataURI(uint256 tokenId, INounsSeeder.Seed memory seed) external view returns (string memory); + + /// + /// USED BY SEEDER + /// + + function backgroundCount() external view returns (uint256); + + function bodyCount() external view returns (uint256); + + function accessoryCount() external view returns (uint256); + + function headCount() external view returns (uint256); + + function glassesCount() external view returns (uint256); +} diff --git a/packages/nouns-contracts/contracts/interfaces/INounsDescriptorV2.sol b/packages/nouns-contracts/contracts/interfaces/INounsDescriptorV2.sol new file mode 100644 index 0000000000..1276814fae --- /dev/null +++ b/packages/nouns-contracts/contracts/interfaces/INounsDescriptorV2.sol @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: GPL-3.0 + +/// @title Interface for NounsDescriptorV2 + +/********************************* + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░██░░░████░░██░░░████░░░ * + * ░░██████░░░████████░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + *********************************/ + +pragma solidity ^0.8.6; + +import { INounsSeeder } from './INounsSeeder.sol'; +import { ISVGRenderer } from './ISVGRenderer.sol'; +import { INounsArt } from './INounsArt.sol'; +import { INounsDescriptorMinimal } from './INounsDescriptorMinimal.sol'; + +interface INounsDescriptorV2 is INounsDescriptorMinimal { + event PartsLocked(); + + event DataURIToggled(bool enabled); + + event BaseURIUpdated(string baseURI); + + event ArtUpdated(INounsArt art); + + event RendererUpdated(ISVGRenderer renderer); + + error EmptyPalette(); + error BadPaletteLength(); + error IndexNotFound(); + + function arePartsLocked() external returns (bool); + + function isDataURIEnabled() external returns (bool); + + function baseURI() external returns (string memory); + + function palettes(uint8 paletteIndex) external view returns (bytes memory); + + function backgrounds(uint256 index) external view returns (string memory); + + function bodies(uint256 index) external view returns (bytes memory); + + function accessories(uint256 index) external view returns (bytes memory); + + function heads(uint256 index) external view returns (bytes memory); + + function glasses(uint256 index) external view returns (bytes memory); + + function backgroundCount() external view override returns (uint256); + + function bodyCount() external view override returns (uint256); + + function accessoryCount() external view override returns (uint256); + + function headCount() external view override returns (uint256); + + function glassesCount() external view override returns (uint256); + + function addManyBackgrounds(string[] calldata backgrounds) external; + + function addBackground(string calldata background) external; + + function setPalette(uint8 paletteIndex, bytes calldata palette) external; + + function addBodies( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function addAccessories( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function addHeads( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function addGlasses( + bytes calldata encodedCompressed, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function setPalettePointer(uint8 paletteIndex, address pointer) external; + + function addBodiesFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function addAccessoriesFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function addHeadsFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function addGlassesFromPointer( + address pointer, + uint80 decompressedLength, + uint16 imageCount + ) external; + + function lockParts() external; + + function toggleDataURIEnabled() external; + + function setBaseURI(string calldata baseURI) external; + + function tokenURI(uint256 tokenId, INounsSeeder.Seed memory seed) external view override returns (string memory); + + function dataURI(uint256 tokenId, INounsSeeder.Seed memory seed) external view override returns (string memory); + + function genericDataURI( + string calldata name, + string calldata description, + INounsSeeder.Seed memory seed + ) external view returns (string memory); + + function generateSVGImage(INounsSeeder.Seed memory seed) external view returns (string memory); +} diff --git a/packages/nouns-contracts/contracts/interfaces/INounsSeeder.sol b/packages/nouns-contracts/contracts/interfaces/INounsSeeder.sol index 25c15fa1c9..8b1b3f627e 100644 --- a/packages/nouns-contracts/contracts/interfaces/INounsSeeder.sol +++ b/packages/nouns-contracts/contracts/interfaces/INounsSeeder.sol @@ -17,7 +17,7 @@ pragma solidity ^0.8.6; -import { INounsDescriptor } from './INounsDescriptor.sol'; +import { INounsDescriptorMinimal } from './INounsDescriptorMinimal.sol'; interface INounsSeeder { struct Seed { @@ -28,5 +28,5 @@ interface INounsSeeder { uint48 glasses; } - function generateSeed(uint256 nounId, INounsDescriptor descriptor) external view returns (Seed memory); + function generateSeed(uint256 nounId, INounsDescriptorMinimal descriptor) external view returns (Seed memory); } diff --git a/packages/nouns-contracts/contracts/interfaces/INounsToken.sol b/packages/nouns-contracts/contracts/interfaces/INounsToken.sol index 70125c18d7..35a1de045c 100644 --- a/packages/nouns-contracts/contracts/interfaces/INounsToken.sol +++ b/packages/nouns-contracts/contracts/interfaces/INounsToken.sol @@ -18,7 +18,7 @@ pragma solidity ^0.8.6; import { IERC721 } from '@openzeppelin/contracts/token/ERC721/IERC721.sol'; -import { INounsDescriptor } from './INounsDescriptor.sol'; +import { INounsDescriptorMinimal } from './INounsDescriptorMinimal.sol'; import { INounsSeeder } from './INounsSeeder.sol'; interface INounsToken is IERC721 { @@ -32,7 +32,7 @@ interface INounsToken is IERC721 { event MinterLocked(); - event DescriptorUpdated(INounsDescriptor descriptor); + event DescriptorUpdated(INounsDescriptorMinimal descriptor); event DescriptorLocked(); @@ -52,7 +52,7 @@ interface INounsToken is IERC721 { function lockMinter() external; - function setDescriptor(INounsDescriptor descriptor) external; + function setDescriptor(INounsDescriptorMinimal descriptor) external; function lockDescriptor() external; diff --git a/packages/nouns-contracts/contracts/interfaces/ISVGRenderer.sol b/packages/nouns-contracts/contracts/interfaces/ISVGRenderer.sol new file mode 100644 index 0000000000..5935b0f935 --- /dev/null +++ b/packages/nouns-contracts/contracts/interfaces/ISVGRenderer.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-3.0 + +/// @title Interface for SVGRenderer + +/********************************* + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░██░░░████░░██░░░████░░░ * + * ░░██████░░░████████░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + *********************************/ + +pragma solidity ^0.8.6; + +interface ISVGRenderer { + struct Part { + bytes image; + bytes palette; + } + + struct SVGParams { + Part[] parts; + string background; + } + + function generateSVG(SVGParams memory params) external view returns (string memory svg); + + function generateSVGPart(Part memory part) external view returns (string memory partialSVG); + + function generateSVGParts(Part[] memory parts) external view returns (string memory partialSVG); +} diff --git a/packages/nouns-contracts/contracts/libs/Inflate.sol b/packages/nouns-contracts/contracts/libs/Inflate.sol new file mode 100644 index 0000000000..80e408caad --- /dev/null +++ b/packages/nouns-contracts/contracts/libs/Inflate.sol @@ -0,0 +1,870 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.8.0 <0.9.0; + +/// @notice Based on https://github.com/madler/zlib/blob/master/contrib/puff +/// @dev Modified the original code for gas optimizations +/// 1. Disable overflow/underflow checks +/// 2. Chunk some loop iterations +library Inflate { + // Maximum bits in a code + uint256 constant MAXBITS = 15; + // Maximum number of literal/length codes + uint256 constant MAXLCODES = 286; + // Maximum number of distance codes + uint256 constant MAXDCODES = 30; + // Maximum codes lengths to read + uint256 constant MAXCODES = (MAXLCODES + MAXDCODES); + // Number of fixed literal/length codes + uint256 constant FIXLCODES = 288; + + // Error codes + enum ErrorCode { + ERR_NONE, // 0 successful inflate + ERR_NOT_TERMINATED, // 1 available inflate data did not terminate + ERR_OUTPUT_EXHAUSTED, // 2 output space exhausted before completing inflate + ERR_INVALID_BLOCK_TYPE, // 3 invalid block type (type == 3) + ERR_STORED_LENGTH_NO_MATCH, // 4 stored block length did not match one's complement + ERR_TOO_MANY_LENGTH_OR_DISTANCE_CODES, // 5 dynamic block code description: too many length or distance codes + ERR_CODE_LENGTHS_CODES_INCOMPLETE, // 6 dynamic block code description: code lengths codes incomplete + ERR_REPEAT_NO_FIRST_LENGTH, // 7 dynamic block code description: repeat lengths with no first length + ERR_REPEAT_MORE, // 8 dynamic block code description: repeat more than specified lengths + ERR_INVALID_LITERAL_LENGTH_CODE_LENGTHS, // 9 dynamic block code description: invalid literal/length code lengths + ERR_INVALID_DISTANCE_CODE_LENGTHS, // 10 dynamic block code description: invalid distance code lengths + ERR_MISSING_END_OF_BLOCK, // 11 dynamic block code description: missing end-of-block code + ERR_INVALID_LENGTH_OR_DISTANCE_CODE, // 12 invalid literal/length or distance code in fixed or dynamic block + ERR_DISTANCE_TOO_FAR, // 13 distance is too far back in fixed or dynamic block + ERR_CONSTRUCT // 14 internal: error in construct() + } + + // Input and output state + struct State { + ////////////////// + // Output state // + ////////////////// + // Output buffer + bytes output; + // Bytes written to out so far + uint256 outcnt; + ///////////////// + // Input state // + ///////////////// + // Input buffer + bytes input; + // Bytes read so far + uint256 incnt; + //////////////// + // Temp state // + //////////////// + // Bit buffer + uint256 bitbuf; + // Number of bits in bit buffer + uint256 bitcnt; + ////////////////////////// + // Static Huffman codes // + ////////////////////////// + Huffman lencode; + Huffman distcode; + } + + // Huffman code decoding tables + struct Huffman { + uint256[] counts; + uint256[] symbols; + } + + function bits(State memory s, uint256 need) private pure returns (ErrorCode, uint256) { + unchecked { + // Bit accumulator (can use up to 20 bits) + uint256 val; + + // Load at least need bits into val + val = s.bitbuf; + while (s.bitcnt < need) { + if (s.incnt == s.input.length) { + // Out of input + return (ErrorCode.ERR_NOT_TERMINATED, 0); + } + + // Load eight bits + val |= uint256(uint8(s.input[s.incnt++])) << s.bitcnt; + s.bitcnt += 8; + } + + // Drop need bits and update buffer, always zero to seven bits left + s.bitbuf = val >> need; + s.bitcnt -= need; + + // Return need bits, zeroing the bits above that + uint256 ret = (val & ((1 << need) - 1)); + return (ErrorCode.ERR_NONE, ret); + } + } + + function _stored(State memory s) private pure returns (ErrorCode) { + unchecked { + // Length of stored block + uint256 len; + + // Discard leftover bits from current byte (assumes s.bitcnt < 8) + s.bitbuf = 0; + s.bitcnt = 0; + + // Get length and check against its one's complement + if (s.incnt + 4 > s.input.length) { + // Not enough input + return ErrorCode.ERR_NOT_TERMINATED; + } + len = uint256(uint8(s.input[s.incnt++])); + len |= uint256(uint8(s.input[s.incnt++])) << 8; + + if (uint8(s.input[s.incnt++]) != (~len & 0xFF) || uint8(s.input[s.incnt++]) != ((~len >> 8) & 0xFF)) { + // Didn't match complement! + return ErrorCode.ERR_STORED_LENGTH_NO_MATCH; + } + + // Copy len bytes from in to out + if (s.incnt + len > s.input.length) { + // Not enough input + return ErrorCode.ERR_NOT_TERMINATED; + } + if (s.outcnt + len > s.output.length) { + // Not enough output space + return ErrorCode.ERR_OUTPUT_EXHAUSTED; + } + while (len != 0) { + // Note: Solidity reverts on underflow, so we decrement here + len -= 1; + s.output[s.outcnt++] = s.input[s.incnt++]; + } + + // Done with a valid stored block + return ErrorCode.ERR_NONE; + } + } + + function _decode(State memory s, Huffman memory h) private pure returns (ErrorCode, uint256) { + unchecked { + // Current number of bits in code + uint256 len; + // Len bits being decoded + uint256 code = 0; + // First code of length len + uint256 first = 0; + // Number of codes of length len + uint256 count; + // Index of first code of length len in symbol table + uint256 index = 0; + // Error code + ErrorCode err; + + uint256 tempCode; + for (len = 1; len <= MAXBITS; len += 5) { + // Get next bit + (err, tempCode) = bits(s, 1); + if (err != ErrorCode.ERR_NONE) { + return (err, 0); + } + code |= tempCode; + count = h.counts[len]; + + // If length len, return symbol + if (code < first + count) { + return (ErrorCode.ERR_NONE, h.symbols[index + (code - first)]); + } + // Else update for next length + index += count; + first += count; + first <<= 1; + code <<= 1; + + // Get next bit + (err, tempCode) = bits(s, 1); + if (err != ErrorCode.ERR_NONE) { + return (err, 0); + } + code |= tempCode; + count = h.counts[len + 1]; + + // If length len, return symbol + if (code < first + count) { + return (ErrorCode.ERR_NONE, h.symbols[index + (code - first)]); + } + // Else update for next length + index += count; + first += count; + first <<= 1; + code <<= 1; + + // Get next bit + (err, tempCode) = bits(s, 1); + if (err != ErrorCode.ERR_NONE) { + return (err, 0); + } + code |= tempCode; + count = h.counts[len + 2]; + + // If length len, return symbol + if (code < first + count) { + return (ErrorCode.ERR_NONE, h.symbols[index + (code - first)]); + } + // Else update for next length + index += count; + first += count; + first <<= 1; + code <<= 1; + + // Get next bit + (err, tempCode) = bits(s, 1); + if (err != ErrorCode.ERR_NONE) { + return (err, 0); + } + code |= tempCode; + count = h.counts[len + 3]; + + // If length len, return symbol + if (code < first + count) { + return (ErrorCode.ERR_NONE, h.symbols[index + (code - first)]); + } + // Else update for next length + index += count; + first += count; + first <<= 1; + code <<= 1; + + // Get next bit + (err, tempCode) = bits(s, 1); + if (err != ErrorCode.ERR_NONE) { + return (err, 0); + } + code |= tempCode; + count = h.counts[len + 4]; + + // If length len, return symbol + if (code < first + count) { + return (ErrorCode.ERR_NONE, h.symbols[index + (code - first)]); + } + // Else update for next length + index += count; + first += count; + first <<= 1; + code <<= 1; + } + + // Ran out of codes + return (ErrorCode.ERR_INVALID_LENGTH_OR_DISTANCE_CODE, 0); + } + } + + function _construct( + Huffman memory h, + uint256[] memory lengths, + uint256 n, + uint256 start + ) private pure returns (ErrorCode) { + unchecked { + // Current symbol when stepping through lengths[] + uint256 symbol; + // Current length when stepping through h.counts[] + uint256 len; + // Number of possible codes left of current length + uint256 left; + // Offsets in symbol table for each length + uint256[MAXBITS + 1] memory offs; + + // Count number of codes of each length + for (len = 0; len <= MAXBITS; ++len) { + h.counts[len] = 0; + } + for (symbol = 0; symbol < n; ++symbol) { + // Assumes lengths are within bounds + ++h.counts[lengths[start + symbol]]; + } + // No codes! + if (h.counts[0] == n) { + // Complete, but decode() will fail + return (ErrorCode.ERR_NONE); + } + + // Check for an over-subscribed or incomplete set of lengths + + // One possible code of zero length + left = 1; + + for (len = 1; len <= MAXBITS; len += 5) { + // One more bit, double codes left + left <<= 1; + if (left < h.counts[len]) { + // Over-subscribed--return error + return ErrorCode.ERR_CONSTRUCT; + } + // Deduct count from possible codes + left -= h.counts[len]; + + // One more bit, double codes left + left <<= 1; + if (left < h.counts[len + 1]) { + // Over-subscribed--return error + return ErrorCode.ERR_CONSTRUCT; + } + // Deduct count from possible codes + left -= h.counts[len + 1]; + + // One more bit, double codes left + left <<= 1; + if (left < h.counts[len + 2]) { + // Over-subscribed--return error + return ErrorCode.ERR_CONSTRUCT; + } + // Deduct count from possible codes + left -= h.counts[len + 2]; + + // One more bit, double codes left + left <<= 1; + if (left < h.counts[len + 3]) { + // Over-subscribed--return error + return ErrorCode.ERR_CONSTRUCT; + } + // Deduct count from possible codes + left -= h.counts[len + 3]; + + // One more bit, double codes left + left <<= 1; + if (left < h.counts[len + 4]) { + // Over-subscribed--return error + return ErrorCode.ERR_CONSTRUCT; + } + // Deduct count from possible codes + left -= h.counts[len + 4]; + } + + // Generate offsets into symbol table for each length for sorting + offs[1] = 0; + for (len = 1; len < MAXBITS; ++len) { + offs[len + 1] = offs[len] + h.counts[len]; + } + + // Put symbols in table sorted by length, by symbol order within each length + for (symbol = 0; symbol < n; ++symbol) { + if (lengths[start + symbol] != 0) { + h.symbols[offs[lengths[start + symbol]]++] = symbol; + } + } + + // Left > 0 means incomplete + return left > 0 ? ErrorCode.ERR_CONSTRUCT : ErrorCode.ERR_NONE; + } + } + + function _codes( + State memory s, + Huffman memory lencode, + Huffman memory distcode + ) private pure returns (ErrorCode) { + unchecked { + // Decoded symbol + uint256 symbol; + // Length for copy + uint256 len; + // Distance for copy + uint256 dist; + // TODO Solidity doesn't support constant arrays, but these are fixed at compile-time + // Size base for length codes 257..285 + uint16[29] memory lens = [ + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 13, + 15, + 17, + 19, + 23, + 27, + 31, + 35, + 43, + 51, + 59, + 67, + 83, + 99, + 115, + 131, + 163, + 195, + 227, + 258 + ]; + // Extra bits for length codes 257..285 + uint8[29] memory lext = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 3, + 3, + 3, + 3, + 4, + 4, + 4, + 4, + 5, + 5, + 5, + 5, + 0 + ]; + // Offset base for distance codes 0..29 + uint16[30] memory dists = [ + 1, + 2, + 3, + 4, + 5, + 7, + 9, + 13, + 17, + 25, + 33, + 49, + 65, + 97, + 129, + 193, + 257, + 385, + 513, + 769, + 1025, + 1537, + 2049, + 3073, + 4097, + 6145, + 8193, + 12289, + 16385, + 24577 + ]; + // Extra bits for distance codes 0..29 + uint8[30] memory dext = [ + 0, + 0, + 0, + 0, + 1, + 1, + 2, + 2, + 3, + 3, + 4, + 4, + 5, + 5, + 6, + 6, + 7, + 7, + 8, + 8, + 9, + 9, + 10, + 10, + 11, + 11, + 12, + 12, + 13, + 13 + ]; + // Error code + ErrorCode err; + + // Decode literals and length/distance pairs + while (symbol != 256) { + (err, symbol) = _decode(s, lencode); + if (err != ErrorCode.ERR_NONE) { + // Invalid symbol + return err; + } + + if (symbol < 256) { + // Literal: symbol is the byte + // Write out the literal + if (s.outcnt == s.output.length) { + return ErrorCode.ERR_OUTPUT_EXHAUSTED; + } + s.output[s.outcnt] = bytes1(uint8(symbol)); + ++s.outcnt; + } else if (symbol > 256) { + uint256 tempBits; + // Length + // Get and compute length + symbol -= 257; + if (symbol >= 29) { + // Invalid fixed code + return ErrorCode.ERR_INVALID_LENGTH_OR_DISTANCE_CODE; + } + + (err, tempBits) = bits(s, lext[symbol]); + if (err != ErrorCode.ERR_NONE) { + return err; + } + len = lens[symbol] + tempBits; + + // Get and check distance + (err, symbol) = _decode(s, distcode); + if (err != ErrorCode.ERR_NONE) { + // Invalid symbol + return err; + } + (err, tempBits) = bits(s, dext[symbol]); + if (err != ErrorCode.ERR_NONE) { + return err; + } + dist = dists[symbol] + tempBits; + if (dist > s.outcnt) { + // Distance too far back + return ErrorCode.ERR_DISTANCE_TOO_FAR; + } + + // Copy length bytes from distance bytes back + if (s.outcnt + len > s.output.length) { + return ErrorCode.ERR_OUTPUT_EXHAUSTED; + } + while (len != 0) { + // Note: Solidity reverts on underflow, so we decrement here + len -= 1; + s.output[s.outcnt] = s.output[s.outcnt - dist]; + ++s.outcnt; + } + } else { + s.outcnt += len; + } + } + + // Done with a valid fixed or dynamic block + return ErrorCode.ERR_NONE; + } + } + + function _build_fixed(State memory s) private pure returns (ErrorCode) { + unchecked { + // Build fixed Huffman tables + // TODO this is all a compile-time constant + uint256 symbol; + uint256[] memory lengths = new uint256[](FIXLCODES); + + // Literal/length table + for (symbol = 0; symbol < 144; ++symbol) { + lengths[symbol] = 8; + } + for (; symbol < 256; ++symbol) { + lengths[symbol] = 9; + } + for (; symbol < 280; ++symbol) { + lengths[symbol] = 7; + } + for (; symbol < FIXLCODES; ++symbol) { + lengths[symbol] = 8; + } + + _construct(s.lencode, lengths, FIXLCODES, 0); + + // Distance table + for (symbol = 0; symbol < MAXDCODES; ++symbol) { + lengths[symbol] = 5; + } + + _construct(s.distcode, lengths, MAXDCODES, 0); + + return ErrorCode.ERR_NONE; + } + } + + function _fixed(State memory s) private pure returns (ErrorCode) { + unchecked { + // Decode data until end-of-block code + return _codes(s, s.lencode, s.distcode); + } + } + + function _build_dynamic_lengths(State memory s) private pure returns (ErrorCode, uint256[] memory) { + unchecked { + uint256 ncode; + // Index of lengths[] + uint256 index; + // Descriptor code lengths + uint256[] memory lengths = new uint256[](MAXCODES); + // Error code + ErrorCode err; + // Permutation of code length codes + uint8[19] memory order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; + + (err, ncode) = bits(s, 4); + if (err != ErrorCode.ERR_NONE) { + return (err, lengths); + } + ncode += 4; + + // Read code length code lengths (really), missing lengths are zero + for (index = 0; index < ncode; ++index) { + (err, lengths[order[index]]) = bits(s, 3); + if (err != ErrorCode.ERR_NONE) { + return (err, lengths); + } + } + for (; index < 19; ++index) { + lengths[order[index]] = 0; + } + + return (ErrorCode.ERR_NONE, lengths); + } + } + + function _build_dynamic(State memory s) + private + pure + returns ( + ErrorCode, + Huffman memory, + Huffman memory + ) + { + unchecked { + // Number of lengths in descriptor + uint256 nlen; + uint256 ndist; + // Index of lengths[] + uint256 index; + // Error code + ErrorCode err; + // Descriptor code lengths + uint256[] memory lengths = new uint256[](MAXCODES); + // Length and distance codes + Huffman memory lencode = Huffman(new uint256[](MAXBITS + 1), new uint256[](MAXLCODES)); + Huffman memory distcode = Huffman(new uint256[](MAXBITS + 1), new uint256[](MAXDCODES)); + uint256 tempBits; + + // Get number of lengths in each table, check lengths + (err, nlen) = bits(s, 5); + if (err != ErrorCode.ERR_NONE) { + return (err, lencode, distcode); + } + nlen += 257; + (err, ndist) = bits(s, 5); + if (err != ErrorCode.ERR_NONE) { + return (err, lencode, distcode); + } + ndist += 1; + + if (nlen > MAXLCODES || ndist > MAXDCODES) { + // Bad counts + return (ErrorCode.ERR_TOO_MANY_LENGTH_OR_DISTANCE_CODES, lencode, distcode); + } + + (err, lengths) = _build_dynamic_lengths(s); + if (err != ErrorCode.ERR_NONE) { + return (err, lencode, distcode); + } + + // Build huffman table for code lengths codes (use lencode temporarily) + err = _construct(lencode, lengths, 19, 0); + if (err != ErrorCode.ERR_NONE) { + // Require complete code set here + return (ErrorCode.ERR_CODE_LENGTHS_CODES_INCOMPLETE, lencode, distcode); + } + + // Read length/literal and distance code length tables + index = 0; + while (index < nlen + ndist) { + // Decoded value + uint256 symbol; + // Last length to repeat + uint256 len; + + (err, symbol) = _decode(s, lencode); + if (err != ErrorCode.ERR_NONE) { + // Invalid symbol + return (err, lencode, distcode); + } + + if (symbol < 16) { + // Length in 0..15 + lengths[index++] = symbol; + } else { + // Repeat instruction + // Assume repeating zeros + len = 0; + if (symbol == 16) { + // Repeat last length 3..6 times + if (index == 0) { + // No last length! + return (ErrorCode.ERR_REPEAT_NO_FIRST_LENGTH, lencode, distcode); + } + // Last length + len = lengths[index - 1]; + (err, tempBits) = bits(s, 2); + if (err != ErrorCode.ERR_NONE) { + return (err, lencode, distcode); + } + symbol = 3 + tempBits; + } else if (symbol == 17) { + // Repeat zero 3..10 times + (err, tempBits) = bits(s, 3); + if (err != ErrorCode.ERR_NONE) { + return (err, lencode, distcode); + } + symbol = 3 + tempBits; + } else { + // == 18, repeat zero 11..138 times + (err, tempBits) = bits(s, 7); + if (err != ErrorCode.ERR_NONE) { + return (err, lencode, distcode); + } + symbol = 11 + tempBits; + } + + if (index + symbol > nlen + ndist) { + // Too many lengths! + return (ErrorCode.ERR_REPEAT_MORE, lencode, distcode); + } + while (symbol != 0) { + // Note: Solidity reverts on underflow, so we decrement here + symbol -= 1; + + // Repeat last or zero symbol times + lengths[index++] = len; + } + } + } + + // Check for end-of-block code -- there better be one! + if (lengths[256] == 0) { + return (ErrorCode.ERR_MISSING_END_OF_BLOCK, lencode, distcode); + } + + // Build huffman table for literal/length codes + err = _construct(lencode, lengths, nlen, 0); + if ( + err != ErrorCode.ERR_NONE && + (err == ErrorCode.ERR_NOT_TERMINATED || + err == ErrorCode.ERR_OUTPUT_EXHAUSTED || + nlen != lencode.counts[0] + lencode.counts[1]) + ) { + // Incomplete code ok only for single length 1 code + return (ErrorCode.ERR_INVALID_LITERAL_LENGTH_CODE_LENGTHS, lencode, distcode); + } + + // Build huffman table for distance codes + err = _construct(distcode, lengths, ndist, nlen); + if ( + err != ErrorCode.ERR_NONE && + (err == ErrorCode.ERR_NOT_TERMINATED || + err == ErrorCode.ERR_OUTPUT_EXHAUSTED || + ndist != distcode.counts[0] + distcode.counts[1]) + ) { + // Incomplete code ok only for single length 1 code + return (ErrorCode.ERR_INVALID_DISTANCE_CODE_LENGTHS, lencode, distcode); + } + + return (ErrorCode.ERR_NONE, lencode, distcode); + } + } + + function _dynamic(State memory s) private pure returns (ErrorCode) { + unchecked { + // Length and distance codes + Huffman memory lencode; + Huffman memory distcode; + // Error code + ErrorCode err; + + (err, lencode, distcode) = _build_dynamic(s); + if (err != ErrorCode.ERR_NONE) { + return err; + } + + // Decode data until end-of-block code + return _codes(s, lencode, distcode); + } + } + + function puff(bytes memory source, uint256 destlen) internal pure returns (ErrorCode, bytes memory) { + unchecked { + // Input/output state + State memory s = State( + new bytes(destlen), + 0, + source, + 0, + 0, + 0, + Huffman(new uint256[](MAXBITS + 1), new uint256[](FIXLCODES)), + Huffman(new uint256[](MAXBITS + 1), new uint256[](MAXDCODES)) + ); + // Temp: last bit + uint256 last; + // Temp: block type bit + uint256 t; + // Error code + ErrorCode err; + + // Build fixed Huffman tables + err = _build_fixed(s); + if (err != ErrorCode.ERR_NONE) { + return (err, s.output); + } + + // Process blocks until last block or error + while (last == 0) { + // One if last block + (err, last) = bits(s, 1); + if (err != ErrorCode.ERR_NONE) { + return (err, s.output); + } + + // Block type 0..3 + (err, t) = bits(s, 2); + if (err != ErrorCode.ERR_NONE) { + return (err, s.output); + } + + err = ( + t == 0 + ? _stored(s) + : (t == 1 ? _fixed(s) : (t == 2 ? _dynamic(s) : ErrorCode.ERR_INVALID_BLOCK_TYPE)) + ); + // type == 3, invalid + + if (err != ErrorCode.ERR_NONE) { + // Return with error + break; + } + } + + return (err, s.output); + } + } +} diff --git a/packages/nouns-contracts/contracts/libs/MultiPartRLEToSVG.sol b/packages/nouns-contracts/contracts/libs/MultiPartRLEToSVG.sol index 720e727118..cec68ecaf7 100644 --- a/packages/nouns-contracts/contracts/libs/MultiPartRLEToSVG.sol +++ b/packages/nouns-contracts/contracts/libs/MultiPartRLEToSVG.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0 /// @title A library used to convert multi-part RLE compressed images to SVG +/// @dev Used in NFTDescriptor.sol. V2 uses SVGRenderer.sol. /********************************* * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * diff --git a/packages/nouns-contracts/contracts/libs/NFTDescriptorV2.sol b/packages/nouns-contracts/contracts/libs/NFTDescriptorV2.sol new file mode 100644 index 0000000000..a69037dd47 --- /dev/null +++ b/packages/nouns-contracts/contracts/libs/NFTDescriptorV2.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-3.0 + +/// @title A library used to construct ERC721 token URIs and SVG images + +/********************************* + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░██░░░████░░██░░░████░░░ * + * ░░██████░░░████████░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + *********************************/ + +pragma solidity ^0.8.6; + +import { Base64 } from 'base64-sol/base64.sol'; +import { ISVGRenderer } from '../interfaces/ISVGRenderer.sol'; + +library NFTDescriptorV2 { + struct TokenURIParams { + string name; + string description; + string background; + ISVGRenderer.Part[] parts; + } + + /** + * @notice Construct an ERC721 token URI. + */ + function constructTokenURI(ISVGRenderer renderer, TokenURIParams memory params) + public + view + returns (string memory) + { + string memory image = generateSVGImage( + renderer, + ISVGRenderer.SVGParams({ parts: params.parts, background: params.background }) + ); + + // prettier-ignore + return string( + abi.encodePacked( + 'data:application/json;base64,', + Base64.encode( + bytes( + abi.encodePacked('{"name":"', params.name, '", "description":"', params.description, '", "image": "', 'data:image/svg+xml;base64,', image, '"}') + ) + ) + ) + ); + } + + /** + * @notice Generate an SVG image for use in the ERC721 token URI. + */ + function generateSVGImage(ISVGRenderer renderer, ISVGRenderer.SVGParams memory params) + public + view + returns (string memory svg) + { + return Base64.encode(bytes(renderer.generateSVG(params))); + } +} diff --git a/packages/nouns-contracts/contracts/libs/SSTORE2.sol b/packages/nouns-contracts/contracts/libs/SSTORE2.sol new file mode 100644 index 0000000000..7ff65f3991 --- /dev/null +++ b/packages/nouns-contracts/contracts/libs/SSTORE2.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: AGPL-3.0-only + +pragma solidity ^0.8.6; + +/// @notice Read and write to persistent storage at a fraction of the cost. +/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SSTORE2.sol) +/// @author Modified from 0xSequence (https://github.com/0xSequence/sstore2/blob/master/contracts/SSTORE2.sol) +library SSTORE2 { + uint256 internal constant DATA_OFFSET = 1; // We skip the first byte as it's a STOP opcode to ensure the contract can't be called. + + /*/////////////////////////////////////////////////////////////// + WRITE LOGIC + //////////////////////////////////////////////////////////////*/ + + function write(bytes memory data) internal returns (address pointer) { + // Prefix the bytecode with a STOP opcode to ensure it cannot be called. + bytes memory runtimeCode = abi.encodePacked(hex'00', data); + + bytes memory creationCode = abi.encodePacked( + //---------------------------------------------------------------------------------------------------------------// + // Opcode | Opcode + Arguments | Description | Stack View // + //---------------------------------------------------------------------------------------------------------------// + // 0x60 | 0x600B | PUSH1 11 | codeOffset // + // 0x59 | 0x59 | MSIZE | 0 codeOffset // + // 0x81 | 0x81 | DUP2 | codeOffset 0 codeOffset // + // 0x38 | 0x38 | CODESIZE | codeSize codeOffset 0 codeOffset // + // 0x03 | 0x03 | SUB | (codeSize - codeOffset) 0 codeOffset // + // 0x80 | 0x80 | DUP | (codeSize - codeOffset) (codeSize - codeOffset) 0 codeOffset // + // 0x92 | 0x92 | SWAP3 | codeOffset (codeSize - codeOffset) 0 (codeSize - codeOffset) // + // 0x59 | 0x59 | MSIZE | 0 codeOffset (codeSize - codeOffset) 0 (codeSize - codeOffset) // + // 0x39 | 0x39 | CODECOPY | 0 (codeSize - codeOffset) // + // 0xf3 | 0xf3 | RETURN | // + //---------------------------------------------------------------------------------------------------------------// + hex'60_0B_59_81_38_03_80_92_59_39_F3', // Returns all code in the contract except for the first 11 (0B in hex) bytes. + runtimeCode // The bytecode we want the contract to have after deployment. Capped at 1 byte less than the code size limit. + ); + + assembly { + // Deploy a new contract with the generated creation code. + // We start 32 bytes into the code to avoid copying the byte length. + pointer := create(0, add(creationCode, 32), mload(creationCode)) + } + + require(pointer != address(0), 'DEPLOYMENT_FAILED'); + } + + /*/////////////////////////////////////////////////////////////// + READ LOGIC + //////////////////////////////////////////////////////////////*/ + + function read(address pointer) internal view returns (bytes memory) { + return readBytecode(pointer, DATA_OFFSET, pointer.code.length - DATA_OFFSET); + } + + function read(address pointer, uint256 start) internal view returns (bytes memory) { + start += DATA_OFFSET; + + return readBytecode(pointer, start, pointer.code.length - start); + } + + function read( + address pointer, + uint256 start, + uint256 end + ) internal view returns (bytes memory) { + start += DATA_OFFSET; + end += DATA_OFFSET; + + require(pointer.code.length >= end, 'OUT_OF_BOUNDS'); + + return readBytecode(pointer, start, end - start); + } + + /*/////////////////////////////////////////////////////////////// + INTERNAL HELPER LOGIC + //////////////////////////////////////////////////////////////*/ + + function readBytecode( + address pointer, + uint256 start, + uint256 size + ) private view returns (bytes memory data) { + assembly { + // Get a pointer to some free memory. + data := mload(0x40) + + // Update the free memory pointer to prevent overriding our data. + // We use and(x, not(31)) as a cheaper equivalent to sub(x, mod(x, 32)). + // Adding 31 to size and running the result through the logic above ensures + // the memory pointer remains word-aligned, following the Solidity convention. + mstore(0x40, add(data, and(add(add(size, 32), 31), not(31)))) + + // Store the size of the data in the first 32 byte chunk of free memory. + mstore(data, size) + + // Copy the code into memory right after the 32 bytes we used to store the size. + extcodecopy(pointer, add(data, 32), start, size) + } + } +} diff --git a/packages/nouns-contracts/contracts/test/NounsTokenHarness.sol b/packages/nouns-contracts/contracts/test/NounsTokenHarness.sol new file mode 100644 index 0000000000..931307b8b8 --- /dev/null +++ b/packages/nouns-contracts/contracts/test/NounsTokenHarness.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity ^0.8.15; + +import { NounsToken } from '../NounsToken.sol'; +import { INounsDescriptorMinimal } from '../interfaces/INounsDescriptorMinimal.sol'; +import { INounsSeeder } from '../interfaces/INounsSeeder.sol'; +import { IProxyRegistry } from '../external/opensea/IProxyRegistry.sol'; + +contract NounsTokenHarness is NounsToken { + uint256 public currentNounId; + + constructor( + address noundersDAO, + address minter, + INounsDescriptorMinimal descriptor, + INounsSeeder seeder, + IProxyRegistry proxyRegistry + ) NounsToken(noundersDAO, minter, descriptor, seeder, proxyRegistry) {} + + function mintTo(address to) public { + _mintTo(to, currentNounId++); + } + + function mintMany(address to, uint256 amount) public { + for (uint256 i = 0; i < amount; i++) { + mintTo(to); + } + } + + function mintSeed( + address to, + uint48 background, + uint48 body, + uint48 accessory, + uint48 head, + uint48 glasses + ) public { + seeds[currentNounId] = INounsSeeder.Seed({ + background: background, + body: body, + accessory: accessory, + head: head, + glasses: glasses + }); + + _mint(owner(), to, currentNounId++); + } +} diff --git a/packages/nouns-contracts/files/image-data-example-for-populate-via-proposal.json b/packages/nouns-contracts/files/image-data-example-for-populate-via-proposal.json new file mode 100644 index 0000000000..14bac67819 --- /dev/null +++ b/packages/nouns-contracts/files/image-data-example-for-populate-via-proposal.json @@ -0,0 +1,333 @@ +{ + "palette": { + "1": [ + "", + "c5b9a1", + "ffffff", + "cfc2ab", + "63a0f9", + "807f7e", + "caeff9", + "5648ed", + "5a423f", + "b9185c", + "b87b11", + "fffdf2", + "4b4949", + "343235", + "1f1d29", + "068940", + "867c1d", + "ae3208", + "9f21a0", + "f98f30", + "fe500c", + "d26451", + "fd8b5b", + "5a65fa", + "d22209", + "e9265c", + "c54e38", + "80a72d", + "4bea69", + "34ac80", + "eed811", + "62616d", + "ff638d", + "8bc0c5", + "c4da53", + "000000", + "f3322c", + "ffae1a", + "ffc110", + "505a5c", + "ffef16", + "fff671", + "fff449", + "db8323", + "df2c39", + "f938d8", + "5c25fb", + "2a86fd", + "45faff", + "38dd56", + "ff3a0e", + "d32a09", + "903707", + "6e3206", + "552e05", + "e8705b", + "f38b7c", + "e4a499", + "667af9", + "648df9", + "7cc4f2", + "97f2fb", + "a3efd0", + "87e4d9", + "71bde4", + "ff1a0b", + "f78a18", + "2b83f6", + "d62149", + "834398", + "ffc925", + "d9391f", + "bd2d24", + "ff7216", + "254efb", + "e5e5de", + "00a556", + "c5030e", + "abf131", + "fb4694", + "e7a32c", + "fff0ee", + "009c59", + "0385eb", + "00499c", + "e11833", + "26b1f3", + "fff0be", + "d8dadf", + "d7d3cd", + "1929f4", + "eab118", + "0b5027", + "f9f5cb", + "cfc9b8", + "feb9d5", + "f8d689", + "5d6061", + "76858b", + "757576", + "ff0e0e", + "0adc4d", + "fdf8ff", + "70e890", + "f7913d", + "ff1ad2", + "ff82ad", + "535a15", + "fa6fe2", + "ffe939", + "ab36be", + "adc8cc", + "604666", + "f20422", + "abaaa8", + "4b65f7", + "a19c9a", + "58565c", + "da42cb", + "027c92", + "cec189", + "909b0e", + "74580d", + "027ee6", + "b2958d", + "efad81", + "7d635e", + "eff2fa", + "6f597a", + "d4b7b2", + "d18687", + "cd916d", + "6b3f39", + "4d271b", + "85634f", + "f9f4e6", + "f8ddb0", + "b92b3c", + "d08b11", + "257ced", + "a3baed", + "5fd4fb", + "c16710", + "a28ef4", + "3a085b", + "67b1e3", + "1e3445", + "ffd067", + "962236", + "769ca9", + "5a6b7b", + "7e5243", + "a86f60", + "8f785e", + "cc0595", + "42ffb0", + "d56333", + "b8ced2", + "f39713", + "e8e8e2", + "ec5b43", + "235476", + "b2a8a5", + "d6c3be", + "49b38b", + "fccf25", + "f59b34", + "375dfc", + "99e6de", + "27a463", + "554543", + "b19e00", + "d4a015", + "9f4b27", + "f9e8dd", + "6b7212", + "9d8e6e", + "4243f8", + "fa5e20", + "f82905", + "555353", + "876f69", + "410d66", + "552d1d", + "f71248", + "fee3f3", + "c16923", + "2b2834", + "0079fc", + "d31e14", + "f83001", + "8dd122", + "fffdf4", + "ffa21e", + "e4afa3", + "fbc311", + "aa940c", + "eedc00", + "fff006", + "9cb4b8", + "a38654", + "ae6c0a", + "2bb26b", + "e2c8c0", + "f89865", + "f86100", + "dcd8d3", + "049d43", + "d0aea9", + "f39d44", + "eeb78c", + "f9f5e9", + "5d3500", + "c3a199", + "aaa6a4", + "caa26a", + "fde7f5", + "fdf008", + "fdcef2", + "f681e6", + "018146", + "d19a54", + "9eb5e1", + "f5fcff", + "3f9323", + "00fcff", + "4a5358", + "fbc800", + "d596a6", + "ffb913", + "e9ba12", + "767c0e", + "f9f6d1", + "d29607", + "f8ce47", + "395ed1", + "ffc5f0", + "cbc1bc", + "d4cfc0" + ] + }, + "images": { + "glasses": [ + { + "filename": "glasses-hip-rose", + "data": "0x000b1710070300062001000620030001200202022301200100012002020223052002020223032002020223052002020223032002020223022002000120020202230120010001200202022301200300062001000620" + }, + { + "filename": "glasses-square-black-eyes-red", + "data": "0x000b17100703000623010006230300012302020264012301000123020202640523020202640323020202640223020001230202026401230100012302020264022302000123020202640123010001230202026401230300062301000623" + }, + { + "filename": "glasses-square-black-rgb", + "data": "0x000b1710070300062301000623030003230164022301000323016413230200012301650223015a01230100012301650223015a022302000623010006230300062301000623" + }, + { + "filename": "glasses-square-black", + "data": "0x000b171007030006230100062303000123020203230100012302020723020205230202042302000123020203230100012302020423020001230202032301000123020203230300062301000623" + }, + { + "filename": "glasses-square-blue-med-saturated", + "data": "0x000b17100703000643010006430300014302020223014301000143020202230543020202230343020202230243020001430202022301430100014302020223024302000143020202230143010001430202022301430300064301000643" + }, + { + "filename": "glasses-square-blue", + "data": "0x000b17100703000607010006070300010702020223010701000107020202230507020202230307020202230207020001070202022301070100010702020223020702000107020202230107010001070202022301070300060701000607" + }, + { + "filename": "glasses-square-frog-green", + "data": "0x000b171007030006bf010006bf030001bf0202022301bf010001bf0202022305bf0202022303bf0202022302bf020001bf0202022301bf010001bf0202022302bf020001bf0202022301bf010001bf0202022301bf030006bf010006bf" + }, + { + "filename": "glasses-square-fullblack", + "data": "0x000b1710070300062301000623030004230102012301000423010208230102062301020223020006230100072302000623010006230300062301000623" + }, + { + "filename": "glasses-square-green-blue-multi", + "data": "0x000b1710070300060f0100068b0300010f02020223010f0100018b02020223018b034a010f02020223010f014a018b02020223028b0200010f02020223010f0100018b02020223028b0200010f02020223010f0100018b02020223018b0300060f0100068b" + }, + { + "filename": "glasses-square-grey-light", + "data": "0x000b171007030006c7010006c7030001c70202022301c7010001c70202022305c70202022303c70202022302c7020001c70202022301c7010001c70202022302c7020001c70202022301c7010001c70202022301c7030006c7010006c7" + }, + { + "filename": "glasses-square-guava", + "data": "0x000b17100703000637010006370300013702020223013701000137020202230537020202230337020202230237020001370202022301370100013702020223023702000137020202230137010001370202022301370300063701000637" + }, + { + "filename": "glasses-square-honey", + "data": "0x000b171007030006dd010006dd030001dd0202022301dd010001dd0202022305dd0202022303dd0202022302dd020001dd0202022301dd010001dd0202022302dd020001dd0202022301dd010001dd0202022301dd030006dd010006dd" + }, + { + "filename": "glasses-square-magenta", + "data": "0x000b17100703000609010006090300010902020223010901000109020202230509020202230309020202230209020001090202022301090100010902020223020902000109020202230109010001090202022301090300060901000609" + }, + { + "filename": "glasses-square-orange", + "data": "0x000b17100703000614010006140300011402020223011401000114020202230514020202230314020202230214020001140202022301140100011402020223021402000114020202230114010001140202022301140300061401000614" + }, + { + "filename": "glasses-square-pink-purple-multi", + "data": "0x000b171007030006200100069a030001200202022301200100019a02020223019a036e0120020202230120016e019a02020223029a020001200202022301200100019a02020223029a020001200202022301200100019a02020223019a030006200100069a" + }, + { + "filename": "glasses-square-red", + "data": "0x000b17100703000624010006240300012402020223012401000124020202230524020202230324020202230224020001240202022301240100012402020223022402000124020202230124010001240202022301240300062401000624" + }, + { + "filename": "glasses-square-smoke", + "data": "0x000b17100703000659010006590300015902660223015901000159026602230559026602230359026602230259020001590266022301590100015902660223025902000159026602230159010001590266022301590300065901000659" + }, + { + "filename": "glasses-square-teal", + "data": "0x000b1710070300061c0100061c0300011c02020223011c0100011c02020223051c02020223031c02020223021c0200011c02020223011c0100011c02020223021c0200011c02020223011c0100011c02020223011c0300061c0100061c" + }, + { + "filename": "glasses-square-watermelon", + "data": "0x000b17100703000637010006370300013702020223013701000137020202230537020202230337020202230237020001370202022301370100013702020223023702000137020202230137010001370202022301370300063701000637" + }, + { + "filename": "glasses-square-yellow-orange-multi", + "data": "0x000b17100703000626010006130300012602020223012601000113020202230113034201260202022301260142011302020223011301260200012602020223012601000113020202230113012602000126020202230126010001130202022301130300062601000613" + }, + { + "filename": "glasses-square-yellow-saturated", + "data": "0x000b17100703000628010006280300012802020223012801000128020202230528020202230328020202230228020001280202022301280100012802020223022802000128020202230128010001280202022301280300062801000628" + } + ] + } +} diff --git a/packages/nouns-contracts/files/image-data.json b/packages/nouns-contracts/files/image-data-v1.json similarity index 100% rename from packages/nouns-contracts/files/image-data.json rename to packages/nouns-contracts/files/image-data-v1.json diff --git a/packages/nouns-contracts/files/image-data-v2.json b/packages/nouns-contracts/files/image-data-v2.json new file mode 100644 index 0000000000..e8ca4a12cc --- /dev/null +++ b/packages/nouns-contracts/files/image-data-v2.json @@ -0,0 +1,1945 @@ +{ + "bgcolors": [ + "d5d7e1", + "e1d7d5" + ], + "palette": [ + "", + "c5b9a1", + "ffffff", + "cfc2ab", + "63a0f9", + "807f7e", + "caeff9", + "5648ed", + "5a423f", + "b9185c", + "cbc1bc", + "b87b11", + "fffdf2", + "4b4949", + "343235", + "1f1d29", + "068940", + "867c1d", + "ae3208", + "9f21a0", + "f98f30", + "fe500c", + "d26451", + "fd8b5b", + "5a65fa", + "d22209", + "e9265c", + "c54e38", + "80a72d", + "4bea69", + "34ac80", + "eed811", + "62616d", + "ff638d", + "8bc0c5", + "c4da53", + "000000", + "f3322c", + "ffae1a", + "ffc110", + "505a5c", + "ffef16", + "fff671", + "fff449", + "db8323", + "df2c39", + "f938d8", + "5c25fb", + "2a86fd", + "45faff", + "38dd56", + "ff3a0e", + "d32a09", + "903707", + "6e3206", + "552e05", + "e8705b", + "f38b7c", + "e4a499", + "667af9", + "648df9", + "7cc4f2", + "97f2fb", + "a3efd0", + "87e4d9", + "71bde4", + "ff1a0b", + "f78a18", + "2b83f6", + "d62149", + "834398", + "ffc925", + "d9391f", + "bd2d24", + "ff7216", + "254efb", + "e5e5de", + "00a556", + "c5030e", + "abf131", + "fb4694", + "e7a32c", + "fff0ee", + "009c59", + "0385eb", + "00499c", + "e11833", + "26b1f3", + "fff0be", + "d8dadf", + "d7d3cd", + "1929f4", + "eab118", + "0b5027", + "f9f5cb", + "cfc9b8", + "feb9d5", + "f8d689", + "5d6061", + "76858b", + "757576", + "ff0e0e", + "0adc4d", + "fdf8ff", + "70e890", + "f7913d", + "ff1ad2", + "ff82ad", + "535a15", + "fa6fe2", + "ffe939", + "ab36be", + "adc8cc", + "604666", + "f20422", + "abaaa8", + "4b65f7", + "a19c9a", + "58565c", + "da42cb", + "027c92", + "cec189", + "909b0e", + "74580d", + "027ee6", + "b2958d", + "efad81", + "7d635e", + "eff2fa", + "6f597a", + "d4b7b2", + "d18687", + "cd916d", + "6b3f39", + "4d271b", + "85634f", + "f9f4e6", + "f8ddb0", + "b92b3c", + "d08b11", + "257ced", + "a3baed", + "5fd4fb", + "c16710", + "a28ef4", + "3a085b", + "67b1e3", + "1e3445", + "ffd067", + "962236", + "769ca9", + "5a6b7b", + "7e5243", + "a86f60", + "8f785e", + "cc0595", + "42ffb0", + "d56333", + "b8ced2", + "f39713", + "e8e8e2", + "ec5b43", + "235476", + "b2a8a5", + "d6c3be", + "49b38b", + "fccf25", + "f59b34", + "375dfc", + "99e6de", + "27a463", + "554543", + "b19e00", + "d4a015", + "9f4b27", + "f9e8dd", + "6b7212", + "9d8e6e", + "4243f8", + "fa5e20", + "f82905", + "555353", + "876f69", + "410d66", + "552d1d", + "f71248", + "fee3f3", + "c16923", + "2b2834", + "0079fc", + "d31e14", + "f83001", + "8dd122", + "fffdf4", + "ffa21e", + "e4afa3", + "fbc311", + "aa940c", + "eedc00", + "fff006", + "9cb4b8", + "a38654", + "ae6c0a", + "2bb26b", + "e2c8c0", + "f89865", + "f86100", + "dcd8d3", + "049d43", + "d0aea9", + "f39d44", + "eeb78c", + "f9f5e9", + "5d3500", + "c3a199", + "aaa6a4", + "caa26a", + "fde7f5", + "fdf008", + "fdcef2", + "f681e6", + "018146", + "d19a54", + "9eb5e1", + "f5fcff", + "3f9323", + "00fcff", + "4a5358", + "fbc800", + "d596a6", + "ffb913", + "e9ba12", + "767c0e", + "f9f6d1", + "d29607", + "f8ce47", + "395ed1", + "ffc5f0", + "d4cfc0" + ], + "images": { + "bodies": [ + { + "filename": "body-bege-bsod", + "data": "0x0015171f093a0101000d0101000d0101000d0101000d0101000d0101000d0101000b01" + }, + { + "filename": "body-bege-crt", + "data": "0x0015171f093a0301000d0301000d0301000d0301000d0301000d0301000d0301000b03" + }, + { + "filename": "body-blue-sky", + "data": "0x0015171f093a0401000d0401000d0401000d0401000d0401000d0401000d0401000b04" + }, + { + "filename": "body-bluegrey", + "data": "0x0015171f093a0501000d0501000d0501000d0501000d0501000d0501000d0501000b05" + }, + { + "filename": "body-cold", + "data": "0x0015171f093a0601000d0601000d0601000d0601000d0601000d0601000d0601000b06" + }, + { + "filename": "body-computerblue", + "data": "0x0015171f093a0701000d0701000d0701000d0701000d0701000d0701000d0701000b07" + }, + { + "filename": "body-darkbrown", + "data": "0x0015171f093a0801000d0801000d0801000d0801000d0801000d0801000d0801000b08" + }, + { + "filename": "body-darkpink", + "data": "0x0015171f093a0901000d0901000d0901000d0901000d0901000d0901000d0901000b09" + }, + { + "filename": "body-foggrey", + "data": "0x0015171f093a0a01000d0a01000d0a01000d0a01000d0a01000d0a01000d0a01000b0a" + }, + { + "filename": "body-gold", + "data": "0x0015171f093a0b01000d0b01000d0b01000d0b01000d0b01000d0b01000d0b01000b0b" + }, + { + "filename": "body-grayscale-1", + "data": "0x0015171f093a0c01000d0c01000d0c01000d0c01000d0c01000d0c01000d0c01000b0c" + }, + { + "filename": "body-grayscale-7", + "data": "0x0015171f093a0d01000d0d01000d0d01000d0d01000d0d01000d0d01000d0d01000b0d" + }, + { + "filename": "body-grayscale-8", + "data": "0x0015171f093a0e01000d0e01000d0e01000d0e01000d0e01000d0e01000d0e01000b0e" + }, + { + "filename": "body-grayscale-9", + "data": "0x0015171f093a0f01000d0f01000d0f01000d0f01000d0f01000d0f01000d0f01000b0f" + }, + { + "filename": "body-green", + "data": "0x0015171f093a1001000d1001000d1001000d1001000d1001000d1001000d1001000b10" + }, + { + "filename": "body-gunk", + "data": "0x0015171f093a1101000d1101000d1101000d1101000d1101000d1101000d1101000b11" + }, + { + "filename": "body-hotbrown", + "data": "0x0015171f093a1201000d1201000d1201000d1201000d1201000d1201000d1201000b12" + }, + { + "filename": "body-magenta", + "data": "0x0015171f093a1301000d1301000d1301000d1301000d1301000d1301000d1301000b13" + }, + { + "filename": "body-orange-yellow", + "data": "0x0015171f093a1401000d1401000d1401000d1401000d1401000d1401000d1401000b14" + }, + { + "filename": "body-orange", + "data": "0x0015171f093a1501000d1501000d1501000d1501000d1501000d1501000d1501000b15" + }, + { + "filename": "body-peachy-B", + "data": "0x0015171f093a1601000d1601000d1601000d1601000d1601000d1601000d1601000b16" + }, + { + "filename": "body-peachy-a", + "data": "0x0015171f093a1701000d1701000d1701000d1701000d1701000d1701000d1701000b17" + }, + { + "filename": "body-purple", + "data": "0x0015171f093a1801000d1801000d1801000d1801000d1801000d1801000d1801000b18" + }, + { + "filename": "body-red", + "data": "0x0015171f093a1901000d1901000d1901000d1901000d1901000d1901000d1901000b19" + }, + { + "filename": "body-redpinkish", + "data": "0x0015171f093a1a01000d1a01000d1a01000d1a01000d1a01000d1a01000d1a01000b1a" + }, + { + "filename": "body-rust", + "data": "0x0015171f093a1b01000d1b01000d1b01000d1b01000d1b01000d1b01000d1b01000b1b" + }, + { + "filename": "body-slimegreen", + "data": "0x0015171f093a1c01000d1c01000d1c01000d1c01000d1c01000d1c01000d1c01000b1c" + }, + { + "filename": "body-teal-light", + "data": "0x0015171f093a1d01000d1d01000d1d01000d1d01000d1d01000d1d01000d1d01000b1d" + }, + { + "filename": "body-teal", + "data": "0x0015171f093a1e01000d1e01000d1e01000d1e01000d1e01000d1e01000d1e01000b1e" + }, + { + "filename": "body-yellow", + "data": "0x0015171f093a1f01000d1f01000d1f01000d1f01000d1f01000d1f01000d1f01000b1f" + } + ], + "accessories": [ + { + "filename": "accessory-1n", + "data": "0x0017141e0d0100012005000220060001200300012002000120020001200500012005000120020002200100012002000120010001200400012001000120" + }, + { + "filename": "accessory-aardvark", + "data": "0x0018151a0d02000321010001210200052102000121010001210100012101000221" + }, + { + "filename": "accessory-axe", + "data": "0x0017141d0e010205220102042201000102032202000102012201000122020001020200012205000122050001220200" + }, + { + "filename": "accessory-belly-chameleon", + "data": "0x0017121e0d0100012301000123060002230100022305000223010002230500022301000123020001230300" + }, + { + "filename": "accessory-bird-flying", + "data": "0x0018151a0d0100022402000224010001240200022402000124030002240300" + }, + { + "filename": "accessory-bird-side", + "data": "0x0017131c0d040001250400022501000425012401260100042503000325020001250400" + }, + { + "filename": "accessory-bling-anchor", + "data": "0x0015141d0d0127050001270100012703000127030001270100012705000127060001270500032705000127040001270100012701000127030003270200" + }, + { + "filename": "accessory-bling-anvil", + "data": "0x0015161e0b012809000128010001280700012803000128050001280500012803000128070003280900010e0700020e05280500020e03280700030e0700020e03280300" + }, + { + "filename": "accessory-bling-arrow", + "data": "0x0018141e0d04000327050002270400012701000127030001270400022704000327050001270500" + }, + { + "filename": "accessory-bling-cheese", + "data": "0x0015141e0c0127060001270100012704000127030001270200012705000227050001270200012703000627030001270129012701290127040004270500012701290127060002270100" + }, + { + "filename": "accessory-bling-gold-ingot", + "data": "0x0015141b0c01270600012701000127040001270300012702000127050002270400062a02000427022a02000427022a0100" + }, + { + "filename": "accessory-bling-love", + "data": "0x0015141d0c0127060001270100012704000127030001270200012705000227050001270200012703000127012904270200062703000427050002270300" + }, + { + "filename": "accessory-bling-mask", + "data": "0x0015141e0c012706000127010001270400012703000127020001270500022704000627020001270100022701000127020006270300042703000127010002270100012702000127040001270100" + }, + { + "filename": "accessory-bling-rings", + "data": "0x0017141d0d0300032b0300012b0300012b0100032b0200022b0100012b0100012b0100022b0200032b0100012b0300012b0300032b0300" + }, + { + "filename": "accessory-bling-scissors", + "data": "0x0016131c0e012c0300022c0300012c0100012c0100012c0200012c0100012c0300012c0200022c0100042c0100022c" + }, + { + "filename": "accessory-bling-sparkles", + "data": "0x0016141d0c01000127060003270100012702000127010001270200012706000327030007270300032706000127070001270300" + }, + { + "filename": "accessory-body-gradient-checkerdisco", + "data": "0x0015171f09022d0224022d0224022d0224042d0224022d0224022d0224022d0224022e0224022e0224022e0424022e0224022e0224022e0224022f01000124022f0224022f0224042f01000124022f0224022f0224022f02240100013002240230022402300424010001300224023002240230022402310100012402310224023102240431010001240231022402310224023102240100013202240232022402320224" + }, + { + "filename": "accessory-body-gradient-dawn", + "data": "0x0015171f091c331c34021201000d1201000b12023501000d3501000b35023601000d3601000b36023701000b37" + }, + { + "filename": "accessory-body-gradient-dusk", + "data": "0x0015171f091c331c25023801000d3801000d3801000d3801000b38023901000d3901000b39023a01000b3a" + }, + { + "filename": "accessory-body-gradient-glacier", + "data": "0x0015171f090f3b013c013b013c013b013c013b013c013b013c013b013c013b103c0104013c0104013c0104013c0104013c0104013c0104013c030401000d0401000d0401000c04013d0100013d0104013d0104013d0104013d0104013d0104033d01000c3d013e0100013e013d013e013d013e013d013e013d013e013d033e01000b3e" + }, + { + "filename": "accessory-body-gradient-ice", + "data": "0x0015171f091c3f1e4001000d4001000b40023d01000d3d01000d3d01000d3d01000b3d024101000b41" + }, + { + "filename": "accessory-body-gradient-pride", + "data": "0x0015171f091c421c43022b01000d2b01000b2b021001000d1001000b10024401000d4401000b44021301000b13" + }, + { + "filename": "accessory-body-gradient-redpink", + "data": "0x0015171f092a45100901000d0901000d0901000d0901000d0901000b09024601000d4601000b46" + }, + { + "filename": "accessory-body-gradient-sunset", + "data": "0x0015171f092a470e26024301000b43021501000b15024801000d4801000b48024901000d4901000d4901000b49" + }, + { + "filename": "accessory-carrot", + "data": "0x0018131d0e0200011e0100011e0300011e0300024a0200024a0300014a0300014a0400" + }, + { + "filename": "accessory-chain-logo", + "data": "0x0018171c09012701000327010003270100032702000127030001270300012703000327020003270100032701000227010001270300012703000127030002270200022701000327010003270100" + }, + { + "filename": "accessory-checker-RGB", + "data": "0x0015171f090225021d024b0225021d024b0425021d024b0225021d024b0225024b0225021d024b0225021d044b0225021d024b0225021d024b021d0100014b0225021d024b0225041d0100014b0225021d024b0225021d02250100011d024b0225021d024b04250100011d024b0225021d024b0225024b01000125021d024b0225021d044b01000125021d024b0225021d024b021d0100014b0225021d024b0225021d" + }, + { + "filename": "accessory-checker-bigwalk-blue-prime", + "data": "0x0015171f090400030701000307010005070100030701000307030003070100030707000307070003070700030701000307040002070100030701000307010001070200020701000307050001070200020707000307070003070100020704000307010003070100040702000307010003070300" + }, + { + "filename": "accessory-checker-bigwalk-greylight", + "data": "0x0015171f090400034c0100034c0100054c0100034c0100034c0300034c0100034c0700034c0700034c0700034c0100034c0400024c0100034c0100034c0100014c0200024c0100034c0500014c0200024c0700034c0700034c0100024c0400034c0100034c0100044c0200034c0100034c0300" + }, + { + "filename": "accessory-checker-bigwalk-rainbow", + "data": "0x0015171f090400034d010003470100021503130100034d01000347030003130100034d040006130400034e01000313030003150100034e010003130247010003150100034e040002470100031504000347010002470400034d01000347040002130100034d010003470100014e020002130100034d04000113014e020002130400034e01000113" + }, + { + "filename": "accessory-checker-spaced-black", + "data": "0x0015171f09030002240400022406000224040002241100022404000224040004240400022404000224110002240400022406000224040002241100022404000224040004240400022404000224" + }, + { + "filename": "accessory-checker-spaced-white", + "data": "0x0015171f09030002020400020206000202040002021100020204000202040004020400020204000202110002020400020206000202040002021100020204000202040004020400020204000202" + }, + { + "filename": "accessory-checker-vibrant", + "data": "0x0015171f09024f02440250024f02440250044f02440250024f02440250024f0250024f02440250024f02440450024f02440250024f02440250024401000150024f02440250024f044401000150024f02440250024f0244024f010001440250024f02440250044f010001440250024f02440250024f02500100014f02440250024f024404500100014f02440250024f02440250024401000150024f02440250024f0244" + }, + { + "filename": "accessory-checkers-big-green", + "data": "0x0015171f09031003000310030005100300031003000510030003100300021003000310030003100500031003000310050003100300031002000210040003100300041004000310030004100400031003000210030003100300031005000310030003100200" + }, + { + "filename": "accessory-checkers-big-red-cold", + "data": "0x0015171f09031a0300031a0300051a0300031a0300051a0300031a0300021a0300031a0300031a0500031a0300031a0500031a0300031a0200021a0400031a0300041a0400031a0300041a0400031a0300021a0300031a0300031a0500031a0300031a0200" + }, + { + "filename": "accessory-checkers-black", + "data": "0x0015171f09020002240200022402000224040002240200022402000224020002240200022402000224020004240200022402000224020002240300012402000224020002240500012402000224020002240200022402000224020002240200042402000224020002240200022403000124020002240200022405000124020002240200022402000224020002240200022402000224" + }, + { + "filename": "accessory-checkers-blue", + "data": "0x0015171f09024b0200024b0200024b0200044b0200024b0200024b0200024b0200024b0200024b0200024b0400024b0200024b0200024b0200024b0200024b0200024b0200044b0200024b0200024b0200024b0300014b0200024b0200024b0500014b0200024b0200024b0200024b0200024b0200024b0200044b0200024b0200024b0200024b0300014b0200024b0200024b0200" + }, + { + "filename": "accessory-checkers-magenta-80", + "data": "0x0015171f09020002210200022102000221040002210200022102000221020002210200022102000221020004210200022102000221020002210300012102000221020002210500012102000221020002210200022102000221020002210200042102000221020002210200022103000121020002210200022105000121020002210200022102000221020002210200022102000221" + }, + { + "filename": "accessory-chicken", + "data": "0x0018131d0d0300024801000202020001020151010004020300020204000102050001510300" + }, + { + "filename": "accessory-cloud", + "data": "0x0018131a0d0200030202000b02" + }, + { + "filename": "accessory-clover", + "data": "0x0017151e0d0200021e0600031e0400011e0100011e0100021e0100031e0100031e0100021e0100011e0100011e0400031e0500021e0100011e0800021e" + }, + { + "filename": "accessory-collar-sunset", + "data": "0x00151717090e1a0e270e43" + }, + { + "filename": "accessory-cow", + "data": "0x0018141c0d05000152020003520124015201390152010001520124025201000152010001520239015203000152020001520100" + }, + { + "filename": "accessory-decay-gray-dark", + "data": "0x0015171f090e28020006280300032802000b2802000928010002280100022801000128010003280200062801000828030001280200012802000328080008280600012804000228010002280200012801000b2803000b28" + }, + { + "filename": "accessory-decay-pride", + "data": "0x0015171f090e28024206280342032802430b2802430928014302280143022801000128012b0328022b062801000828032b012801100100012802100328071001000828031002440100012804440228014402280244012801000b28021301000b28" + }, + { + "filename": "accessory-dinosaur", + "data": "0x0017131d0d0200035303000153010001530300045302000353010001530100035301000653030001530200" + }, + { + "filename": "accessory-dollar-bling", + "data": "0x0015141e0c012706000227060001270100012704000127030004270500022705000427040002270800022704000427050002270300" + }, + { + "filename": "accessory-dragon", + "data": "0x0017141e0d021001000310020003100100041003000110040003100200021004000110030002100200031002000110020001100400" + }, + { + "filename": "accessory-ducky", + "data": "0x0018131a0e012901000229020003290115010003290100" + }, + { + "filename": "accessory-eth", + "data": "0x0018131d0e020001540400015403000154015501540100055501000354030001540200" + }, + { + "filename": "accessory-eye", + "data": "0x0018151c0d020004550300015501000255010001550100015502000255020001550100015504000155030004550200" + }, + { + "filename": "accessory-flash", + "data": "0x0017151d0d010001020800020207000302020008020200030207000202080001020100" + }, + { + "filename": "accessory-fries", + "data": "0x0017131d0e0127010b0127010b0227010b0127010b01270656032702560227035601270856" + }, + { + "filename": "accessory-glasses-logo-sun", + "data": "0x0018161a0d072402000324010008240100032401000124" + }, + { + "filename": "accessory-glasses-logo", + "data": "0x0018161a0d0757020001570100015701000157010006570100035701000157" + }, + { + "filename": "accessory-glasses", + "data": "0x0017141d0d0857010002570100025702000257010002570700081e0100021e0100021e0200021e0100021e" + }, + { + "filename": "accessory-grid-simple-bege", + "data": "0x0016171e090158010001580100015801000158010001580100015801000158100001580100015801000158010001580100015801000158010001580e0001580300015801000158010001580100015801000158100001580100015801000158010001580100015801000158010001580e00015803000158010001580100015801000158010001580100" + }, + { + "filename": "accessory-heart", + "data": "0x0018141d0d010002590100025901000e590100055903000359050001590300" + }, + { + "filename": "accessory-hoodiestrings-uneven", + "data": "0x0016121b0f01020100020201000202010002020100015a01020200015a0200" + }, + { + "filename": "accessory-id", + "data": "0x0017151a1002000102020005270a02" + }, + { + "filename": "accessory-infinity", + "data": "0x0017141e0d0100020c0400010c0200010c0300010c0700030c0600030c0700010c0300010c0200010c0400020c0100" + }, + { + "filename": "accessory-insignia", + "data": "0x0016131d0e0200015c0300015c012c015c0300015c0300035c0100015c032c035c022c025c032c015c0100035c0100" + }, + { + "filename": "accessory-leaf", + "data": "0x0018141d0d0300045d0200055d0200055d0200055d0200045d0100025d0500" + }, + { + "filename": "accessory-lightbulb", + "data": "0x0017121c0e0c5e0100025e0200025f0200025f0100" + }, + { + "filename": "accessory-lines-45-greens", + "data": "0x0015171f09020001100200011002000110020001100200015d0200015d0200015d0200015d0200015d02000110020001100200011002000110020001100200015d0200015d0200015d0200015d02000110020001100200011002000110020001100200015d0200015d0200015d0200015d0200015d0500011002000110020001100200015d0200015d0200015d0200015d0200015d02000110020001100200011002000110020001100500015d0200015d0200015d02000110020001100200011002000110020001100100" + }, + { + "filename": "accessory-lines-45-rose", + "data": "0x0015171f09020001600200016002000160020001600200016002000160020001600200016002000160020001600200016002000160020001600200016002000160020001600200016002000160020001600200016002000160020001600200016002000160020001600200016002000160020001600500016002000160020001600200016002000160020001600200016002000160020001600200016002000160020001600200016005000160020001600200016002000160020001600200016002000160020001600100" + }, + { + "filename": "accessory-lp", + "data": "0x0016161e0d03000324040007240200072401000324030206240102010001020624030203240100072402000724040003240300" + }, + { + "filename": "accessory-marsface", + "data": "0x0018131d0e0400032401000224030002240200032403000724" + }, + { + "filename": "accessory-matrix-white", + "data": "0x0018131c0e010c0100010c0100010c0500010c0100010c0100010c0500010c0100010c0100010c" + }, + { + "filename": "accessory-moon-block", + "data": "0x0017131d0e0661010001610100016101000161010001610100016101000161010001610100016101000161010003610100026101000361" + }, + { + "filename": "accessory-none", + "data": "0x0000000000" + }, + { + "filename": "accessory-oldshirt", + "data": "0x0015171f09206207591162026301000262035902620159056201000162015903620259046202630100036201590962010001620259016204590362026301000d620100016207590362026301000b62" + }, + { + "filename": "accessory-pizza-bling", + "data": "0x0015141d0c012706000127010001270400012703000127020001270500022706000227050004270400042703000627020006270100" + }, + { + "filename": "accessory-pocket-pencil", + "data": "0x0017151910010001380400010203000564" + }, + { + "filename": "accessory-rain", + "data": "0x0018131d0e04000144010001440200014401000144060001440100014402000144010001440400" + }, + { + "filename": "accessory-rainbow-steps", + "data": "0x0017171c090b000313070004190313030004150419031302470100041504190300024701000415070002470c00" + }, + { + "filename": "accessory-rgb", + "data": "0x0018151e0d030002650500046504000465030002660265025b01000466045b0466045b010002660200025b0100" + }, + { + "filename": "accessory-robot", + "data": "0x0019171b090124020001240200012402000124020001240f00022401000b24" + }, + { + "filename": "accessory-safety-vest", + "data": "0x0015171f0b0414030009140300091403000914030005140100036703000567010003670300056701000367030005670100036703000567010003140300051401000314030005140100031403000514" + }, + { + "filename": "accessory-scarf-clown", + "data": "0x0015151f0c031d0300061d0300061d0300031d0324030006240300062403000324031d0300061d0300061d0300031d03240300062403000324" + }, + { + "filename": "accessory-secret-x", + "data": "0x0018121b0e01680200016801000268020002680100016802000168" + }, + { + "filename": "accessory-shirt-black", + "data": "0x0015151f0c0e24010005240100022402000324020001240169030001240300022407000224070002240700022407000124016907000224070002240400" + }, + { + "filename": "accessory-shrimp", + "data": "0x0018121c0e010002600100036001000260030001600221020001210100" + }, + { + "filename": "accessory-slimesplat", + "data": "0x0017121d0d0200014f0100024f0100024f0200034f0200024f0100024f0100014f0500014f0200014f0300" + }, + { + "filename": "accessory-small-bling", + "data": "0x001514170d0127050001270100012703000127030003270200" + }, + { + "filename": "accessory-snowflake", + "data": "0x0017141d0d010001020300010201000202010001020100020202000302030005020300030202000202010001020100020201000102030001020100" + }, + { + "filename": "accessory-stains-blood", + "data": "0x0016151d0d0500021a0300011a0100041a0400041a0500021a0100011a0100021a0600021a0d00011a0600" + }, + { + "filename": "accessory-stains-zombie", + "data": "0x0017151e0d0100011010000210040001100100021009000210050004100200011001000410050002100100" + }, + { + "filename": "accessory-stripes-and-checks", + "data": "0x0015171f090e6a0e440e290e1d020201000124020202240202022404020100012402020224020202240202022401000102022402020224020204240100010202240202022402020224026a01000b6a024401000b44022901000b29" + }, + { + "filename": "accessory-stripes-big-red", + "data": "0x0015171d092a252a00022501000d2501000d2501000b25" + }, + { + "filename": "accessory-stripes-blit", + "data": "0x0015171b092a5b0e00026b01000b6b0e00022b01000b2b" + }, + { + "filename": "accessory-stripes-blue-med", + "data": "0x0015171f090e440e000e440e00024401000b440e00024401000b440e00024401000b440e00024401000b44" + }, + { + "filename": "accessory-stripes-brown", + "data": "0x0015171f090e360e000e360e00023601000b360e00023601000b360e00023601000b360e00023601000b36" + }, + { + "filename": "accessory-stripes-olive", + "data": "0x0015171f090e6c0e000e6c0e00026c01000b6c0e00026c01000b6c0e00026c01000b6c0e00026c01000b6c" + }, + { + "filename": "accessory-stripes-red-cold", + "data": "0x0015171f090e1a0e000e1a0e00021a01000b1a0e00021a01000b1a0e00021a01000b1a0e00021a01000b1a" + }, + { + "filename": "accessory-sunset", + "data": "0x0017141a0d03000127040001270300012703000327020001270100032701000127" + }, + { + "filename": "accessory-taxi-checkers", + "data": "0x0017171a090267020e0267020e0267020e0467020e0267020e0267020e0267020e01000167020e0267020e0267040e01000167020e0267020e0267020e" + }, + { + "filename": "accessory-tee-yo", + "data": "0x0015171f09022902000129040001290300032903000429040004290900052909000429020001290100012903000129010004290300012901000229010001290100042903000129010002290300042908000129010004290a0004290a0004290a000229" + }, + { + "filename": "accessory-text-yolo", + "data": "0x0017131d0d014f0100014f010002580100014f020002580100014f02000258060001580200024f010001580200024f010002580100024f0100" + }, + { + "filename": "accessory-think", + "data": "0x0018131c0e0302020003020900010206000102" + }, + { + "filename": "accessory-tie-black-on-white", + "data": "0x0015121f0e0424014c0224024c0224024c0224024c0224024c0224024c0224024c0224024c0224024c0224024c0224014c" + }, + { + "filename": "accessory-tie-dye", + "data": "0x0016151f0b0200023c0100016d0200016d0100013c0100033c0200016d0300013c0300013c0200026d0300026e0100013c0100026d0200016e0100011d016e013c0100016d0200016e0100011d016d013c0100016d0100011d0100016e0100011d0100026d0400016e0200011d0300011d0300016e0200031d0100011d0100016e0200016e0100021d0200" + }, + { + "filename": "accessory-tie-purple-on-white", + "data": "0x0015121f0e046f014c026f024c026f024c026f024c026f024c026f024c026f024c026f024c026f024c026f024c026f014c" + }, + { + "filename": "accessory-tie-red", + "data": "0x0016111e0f044202000c42" + }, + { + "filename": "accessory-txt-a2+b2", + "data": "0x0017151d0d020001700500027006000270010001700600037006000170010001700100017005000270060002700100" + }, + { + "filename": "accessory-txt-cc", + "data": "0x0017151d0c01000771010001710700027101000271010002710100027101000171020001710200027101000271010002710100027107000171010007710100" + }, + { + "filename": "accessory-txt-cc2", + "data": "0x0017141c0d037201000472030001720200017203000172020001720300017202000172030001720200037201000372" + }, + { + "filename": "accessory-txt-copy", + "data": "0x0017131d0d027301000273010001730200027301000273010002730700027301000173010003730100027301000173020001730200" + }, + { + "filename": "accessory-txt-dao-black", + "data": "0x0018151b0c022402000124020001240100012401000224010002240100022401000524010003240100012401000124010001240100" + }, + { + "filename": "accessory-txt-doom", + "data": "0x0016161d0b0200012408000324080001240100032407000224010003240700022401000324070002240100032408000124010001240a000124" + }, + { + "filename": "accessory-txt-dope-text", + "data": "0x0017131d0d010001740200017401000274010001740100037402000174070002740100017402000274010002740100017402000374" + }, + { + "filename": "accessory-txt-foo-black", + "data": "0x0019151b0d05240100042401000224010003240200022401000224" + }, + { + "filename": "accessory-txt-ico", + "data": "0x0019171d09027501000d7501000d7501000d7501000d7501000b75" + }, + { + "filename": "accessory-txt-io", + "data": "0x0018131c0d0157030001570100015702000157020001570100015701000257010001570200035703000257" + }, + { + "filename": "accessory-txt-lmao", + "data": "0x0017131d0d013f0300033f0200023f0100023f0100013f0900013f0200033f0100013f0100033f0100013f0100023f" + }, + { + "filename": "accessory-txt-lol", + "data": "0x001715190d01020200020201000102010001020200020201000102010002020100020201000202" + }, + { + "filename": "accessory-txt-mint", + "data": "0x0016141c0d06000115070002150100011502000215010001150100011501000115070002150200041501000115020001150100" + }, + { + "filename": "accessory-txt-nil-grey-dark", + "data": "0x0018151a0d037601000176010001760100017601000176010001760100017601000176010001760100017601000276" + }, + { + "filename": "accessory-txt-noun-f0f", + "data": "0x0017131e0d0100026a0100016a0200016a0100026a0700026a0100016a0100036a0100036a0700026a0100016a0200016a0100026a0100" + }, + { + "filename": "accessory-txt-noun-green", + "data": "0x0017131e0d0100023f0100013f0200013f0100023f0700023f0100013f0100033f0100033f0700023f0100013f0200013f0100023f0100" + }, + { + "filename": "accessory-txt-noun-multicolor", + "data": "0x0017131e0d01000218010001180200011801000218070002770100011501000115027701000315070002100100011002000110010002100100" + }, + { + "filename": "accessory-txt-noun", + "data": "0x0016131d0d0100026d0100016d0200016d0100026d0700026d0100016d0100036d0100036d0700026d0100016d0200016d0100026d0100" + }, + { + "filename": "accessory-txt-pi", + "data": "0x0018131b0d01000620010001200100012003000120010001200300012002000120" + }, + { + "filename": "accessory-txt-pop", + "data": "0x0017131d0d0229040002290400012901000229040002290600022904000229040001290100" + }, + { + "filename": "accessory-txt-rofl", + "data": "0x0017131d0d02020200027802020200027801020100010201000278060003380100012701000238020001270100013803000227" + }, + { + "filename": "accessory-txt-we", + "data": "0x0018151d0c0700011d050001570100011d0100011d02000157010001570100031d015701000157010001570100011d0200015701000157010001570200011d02000157010001570500" + }, + { + "filename": "accessory-txt-yay", + "data": "0x0018151a0c0144010001440100011d0100014401000144010001440100031d01000144020001440100011d0100011d010001440100" + }, + { + "filename": "accessory-wall", + "data": "0x0015171f090a0001630d0001630300026301000b63040001630d0001630900026301000463010006630a0001630d0001630300026301000b63040001630d0001630900" + }, + { + "filename": "accessory-wave", + "data": "0x0017151b0d01000357040002570200015705000157020001570400015703000257010001570600" + }, + { + "filename": "accessory-wet-money", + "data": "0x0018141e0d0179027a0179057a0179017b0179047a0179017b0179057a0179027a0179010001040100010401000104020001040a0001040100" + }, + { + "filename": "accessory-woolweave-bicolor", + "data": "0x0015171f09037c010003150100037c0100027c0e00017c010003150100037c01000315020001150300017c030001150300017c01150200027c010003150100037c0f00027c020003150100037c01000215030001150300017c030001150200017c01150200037c010003150100027c0e00017c0200027c010003150100037c0100" + }, + { + "filename": "accessory-woolweave-dirt", + "data": "0x0015171f09037d0100037d0100037d0100027d0e00017d0100037d0100037d0100037d0200017d0300017d0300017d0300027d0200027d0100037d0100037d0f00027d0200037d0100037d0100027d0300017d0300017d0300017d0200027d0200037d0100037d0100027d0e00017d0200027d0100037d0100037d0100" + }, + { + "filename": "accessory-yingyang", + "data": "0x0018121b0e060e024c020e064c" + }, + { + "filename": "body-bege", + "data": "0x0015171f093a0101000d0101000d0101000d0101000d0101000d0101000d0101000b01" + }, + { + "filename": "body-gray-scale-1", + "data": "0x0015171f093a0c01000d0c01000d0c01000d0c01000d0c01000d0c01000d0c01000b0c" + }, + { + "filename": "body-gray-scale-9", + "data": "0x0015171f093a0f01000d0f01000d0f01000d0f01000d0f01000d0f01000d0f01000b0f" + }, + { + "filename": "body-ice-cold", + "data": "0x0015171f093a0601000d0601000d0601000d0601000d0601000d0601000d0601000b06" + } + ], + "heads": [ + { + "filename": "head-aardvark", + "data": "0x00021e14060500013802000138130002380200023811000338020003380f000438020004380f00033802000338110002380200023813000138020001380f000d380b000d380b000d380b000d380b000d380b000d380b000d380600057e0d380600017e017f017e017f017e0b38097e017f017e017f017e0b380d7e0a380524097e0b380d7e" + }, + { + "filename": "head-abstract", + "data": "0x00041a1405045d01000448010004480100018001000115010001150100045d01240448012404480124018001240115012401150124045d01240448012404480124018001240115012401150124045d01240448012404480124018001240115012401150124045d0124044801240448012401800124011501240115012401001524015901240159012401800124044701240480012404470124015901240159012401800124044701240480012404470124015901240159012401800124044701240480012404470124015901240159012401800124044701240480012404470124015901240159012401800124044701240480012404470100132401000124015501240155012401550124040701240456012404560124015501240155012401550124040701240456012404560124015501240155012401550124010703550124045601240456012401550124015501240155012404070124045601240456012401550124015501240155012404070124045601240456" + }, + { + "filename": "head-ape", + "data": "0x0005191406030004810e00098109000e8106000f810300108104000f8104000f81040001810e82040001810e82040001810e82040001810e82020003810e8202000181018201810f8201000181018203810d8306810d82018102001181" + }, + { + "filename": "head-bag", + "data": "0x00031c140306000e3b0b000e3b0900023b0e00023b0700023b0e00023b0700023b0e00023b05000207023b0e07023b0207030001070127023b040706270407023b01270107020001270107022706070427060702270107020001270807062708070200013b16070100013b0100013b15070100013b0100013b15070100013b0107013b1607013b0107013b1607010018070100070703770e0701001807020016070100" + }, + { + "filename": "head-bagpipe", + "data": "0x00011d19050a000184170003101500018402000110010001841200021003000110017b110001080110017b02100108017b011010000210017b02100184017b021006000184080001840100017b01100100010801000210018406000108070001080400010802000110017b011006000108060001080300010803000184017b0110070001080500010803000108020001080100017b0110020001100200017b0310017b03100108030001080200010802000210017b02000110017b0310017b0310017b030001080100010804000110017b011001000110017b0310017b0310017b011001000108020001080400011003000110017b0310017b0310017b021001080100010809000110017b0310017b0310017b0310017b021008000110017b0310017b0310017b0310017b0310017b06000108017b0310017b0310017b0310017b0310017b01100500010802000210017b031002120210017b0310017b0110050001080400017b0310017b0310017b0310017b0110050001080400017b0310017b0310017b0310017b0600010805000310017b0310017b0310017b0600010807000110017b0310017b02100800010817000184160003841500" + }, + { + "filename": "head-banana", + "data": "0x00041d140304000524047a03270f000324047a05270f000124047a07270f00037a09270e00027a0227012c07270e00017a0327012c0327022c02270e000227012c0527022c02270700012706000827022c02270600032705000827022c02270500052704000c2704000427012c022702000e2702000627012c022701000e2701000827012c1227012c032701001427012c032703000a27032c09270500062701580627015806270700042703580527025804270400" + }, + { + "filename": "head-bank", + "data": "0x00031c15040b0002201400062010000320047303200c000220020d012004730120020d022008000220020d032004730320020d022004001620020016730300032002730420027304200273032004000120010d0120027304200273042002730120010d0120040003200273042002730420027303200400032002730420027304200273032004000320027304200273042002730320040003200273042002730420027303200400032002730420027304200273032004000320027304200273042002730320040003200273042002730420027303200400012012730120030016200100022014730220" + }, + { + "filename": "head-baseball-gameball", + "data": "0x00041a17060800040c0e00080c0a0001250b0c0700020c01250a0c0125010c0400030c01250a0c0125010c0400030c01250a0c0125010c0300040c01250a0c0125020c0200030c01250c0c0125010c0100040c01250c0c0125050c01250e0c0125040c01250e0c0125040c01250e0c0125010c0100030c01250c0c0125010c0200030c01250c0c0125010c0300030c01250a0c0125010c0400040c0225060c0225020c0500050c0625030c07000c0c0a00080c0e00040c0800" + }, + { + "filename": "head-basketball", + "data": "0x00031a160607000543011b0c000443011b0243011b024308000243021b0543011b044305000543011b0443011b0443011b04000143011b0443011b0343011b0343011b014303000843011b0243011b0243011b034302000143011b0743051b044301000c43011b1343011b1343011b0743141b0c43011b1343011b074301000b43011b064302000943051b0443030004430167010f0167010f0167010f011b0243011b024304000643011b0343011b0343011b014305000443011b0443011b04430800021b0543011b02430c000543011b0700" + }, + { + "filename": "head-bat", + "data": "0x00031e14020900018508000185120001850800018511000385060003850c000185020002850186018506000185018602850200018508000585018602850400028501860585070001850186038501860a8501860385018601850600058501860a850186058505000185018614850186018504000185018614850186018503000185018616850186018502000185018616850186018502000185018616850186018502000185018616850186018501000185018618850186028501861885018608850186048502240163012401630224018501860985030002850186038503240102012401020124028501860285030003850500108505000185" + }, + { + "filename": "head-bear", + "data": "0x000518150805870600068702380287060002870238a1870208028702080224018801240188022401080287020802870208072401080287020802870208028702080287020802870208028702080287020802870208028701000e080100" + }, + { + "filename": "head-beer", + "data": "0x000219140605000288020003880b000b8807000f8804000f88030011880200018801430c88016e0288030003430288014302480588016e01880100038903430248014302480143014802880143016e0188010003890343024801430248014302480243016e0200028901000343024801430248014302480243016e0200028901000343024801430248014302480243016e0200028901000343024801430248014302480243016e0200028901000343024801430248014302480243016e0200028901000343024801430248014302480243016e020003890343024801430248014302480243016e030002890343024801430248014302480243016e05000d43016e050005890786028905000e890200" + }, + { + "filename": "head-beet", + "data": "0x00021a14060400031e020002810d00011e011a021e0281010d01810c00021e011a011e0181010d02810d00021e011a010d02810f00011e011a010d0181110002860d00108a0300091a018a011a018a011a018a011a038a0100148a031a108a011a3a8a021a288a021a0f8a031a01000a8a0221068a0300041a018a011a078a011a018a011a05000e8a0300" + }, + { + "filename": "head-bell", + "data": "0x00011c14040b00022716000227130008270f000227010207270d000227010209270b00022701020b270a000e270a000e2709001027080010270800102708001027080010270800108b0800108b06001427040001270102122702000c2703382127010016270100" + }, + { + "filename": "head-bigfoot-yeti", + "data": "0x00021d14020d00048017000680140003800157018001570180140002800157015b0157015b018014000280028c0157018c018011000580018c0157015b0157018010000b800f000b800f000d800d000e80018d0b00048001000a80038d0800048002000a80058d0500048002000b80078d0100048003000c800300058d038004000c800400018d0100018d08000b8010000880028e02801000028d0a800e00068d08800600" + }, + { + "filename": "head-bigfoot", + "data": "0x00021d14020d0004351700063514000335012c0135012c013514000235012c0137012c0137013514000235028f012c018f013511000535018f012c0137012c013510000b350f000b350f000d350d000e3501370b00043501000a3503370800043502000a3505370500043502000b3507370100043503000c3503000537033504000c35040001370100013708000b351000083502170235100002370a350e00063708350600" + }, + { + "filename": "head-blackhole", + "data": "0x00011d17030e000190180001901000019018000190060001600600016004000190060001900500016006000160060001900a00016003000460030001600e000160011a012101600321031a0c00016002000160011a02210460022102600b00016001000160011a01210260049102600121011a01600a000160010001600121016002910424029101600121011a01600100016005000160020002600121016001910624019101600221011a030001900600011a02600191082401910260011a0400029005000260019108240191016001210160011a0300029004000160012101600191082401910160012101600600019003000160012101600191082401910160012101600a000160011a0121016001910624019101600221011a016007000160020003600291042402910260021a0100016007000260021a012102600491026002210160011a010001600a000160011a02210460012101600121011a01600c00021a056003210160021a0200016006000190070001600100031a01600d0001900900016009000190180001900300" + }, + { + "filename": "head-blueberry", + "data": "0x00041a1706070006440c000544069207000144019201570592035503920500024406920155037801550392040001440692025504780155029203000244079201550478015503920200014401570892045504920100024412920344119203441192024412920244129202441292010001440392067808920200014404920293099201440192030002440e92040004440c92060002440992014408000544069201440b0006440700" + }, + { + "filename": "head-bomb", + "data": "0x00041c16070f00010e0b00060e0200030e02840600040e0173090e010001840400020e02730a0e030001840200030e0273090e040001840100100e030001840100100e03000194120e02000142120e0300120e0300120e0300120e0300120e0400100e0500100e0600060e0573030e08000c0e0a000a0e0d00060e0900" + }, + { + "filename": "head-bonsai", + "data": "0x00021e15030c00071012000310031d04100f000510031d0110021d02100c000410011d0210031d0110021d02100b0010100c000e10020003100c00081003000210011d0210020007100600027d03000a10021d06100400037d0610021d0410021d0110011d05100400017d0710021d0d100400037d081001000b100300097d05000810087d0c000310047d0300047d1500067d1400087d0e001295090005950d0f090012950b000e950700" + }, + { + "filename": "head-boombox", + "data": "0x00041b1f060400025915000259150002590d00089602590796040001960900025904000196040001960b0002590200019602000297137002970170011d017001960170090f017001960170012501700297137002970370030f02700196017001960270030f037002970270050f0570050f027002970170070f017001960170070f017002970170070f0370070f017002970170070f017001960170070f017002970270050f0570050f027002970370030f02700196017001960270030f0370029713701200020f1400010f1400010f1400010f1400010f1400010f1400010f1400010f1400010f1400010f1400010f0100" + }, + { + "filename": "head-boot", + "data": "0x00061c140701000698030002980a00069802080100019801990a0007980208019801990a0008980108019801990a000b980a000b980a000b9809000d9808000e980700149801002e9803272398010013840100" + }, + { + "filename": "head-box", + "data": "0x00061c1403040003980f9a0108050004980f9a01080400049801080f9a02080300049801080f9a02080200049802080f9a02080100059802080f9a0308040003080f9a0308040003080f9a070003080f9a0700029a01080f9a0700029a01080f9a0700029a0108059a0a0107000308059a0a0107000308059a0a01070003080f9a0300" + }, + { + "filename": "head-boxingglove", + "data": "0x000418140504000d5604000a560439025602004d56018a015606070b56018a015606070b56018a015606070b56018a015606070b56018a015606070956030001560607095603000f56050003560b270500035601270502012401020327050003560b2705000e560100" + }, + { + "filename": "head-brain", + "data": "0x00051a14060600086b0900036b0321016b0421036b0500016b0321036b0121046b0321016b0300016b0121026b0121016b0121016b0121016b0121026b0121026b0121016b0200016b0121016b0121026b0121026b0121026b0121056b0100066b0121036b0121026b0121026b0121016b0121026b0121046b0121066b0121046b0121026b0121026b0121026b0121036b0121066b0121056b0121026b0121046b0121016b0221026b0121026b0121026b0121036b0121096b0121026b0121036b0121056b0121066b0121076b0121056b0221046b0121016b0100126b0200016b0121036b0221026b0121056b0221016b0300016b0121016b0121026b0221046b0221026b05000e6b0300" + }, + { + "filename": "head-bubble-speech", + "data": "0x00041b160504000e0206001202030014020200140201009a0201001402020014020300120206000f02120003021300020213000202140001020700" + }, + { + "filename": "head-bubblegum", + "data": "0x00021b17050800066a0e00036a029b056a0a00026a029b046a0202046a0700026a019b056a0402046a0500026a019b066a0402056a04000a6a0202026a0202026a03000f6a0202036a0200026a0102116a0100846a0100146a0200146a03000a6a019b076a04000b6a019b066a0500016a019b076a019b046a019b016a0700016a039b066a039b016a0a000a9b0e00069b0800" + }, + { + "filename": "head-burger-dollarmenu", + "data": "0x00071a14060600080b0a00060b0126050b0700040b0126050b0126030b0500020b01260d0b04000e0b0126010b0300120b0200120b020012270100082701980627029801270198012701980227019804270e9801270c9801270498010012980300100b0400100b0200" + }, + { + "filename": "head-cake", + "data": "0x00021a140605000138040001380300013809000138012a013802000138012a013801000138012a013808000138012a012702000138012a012701000138012a01270900012704000127030001270900033d0200033d0100033d08000157023d02000157023d01000157023d0600102103000521060207210200042108020621020004210802052101020200010203210902032102020200020202210e020200020202210e020200020201210f0202001202020012020200012101020221020205210202022102020121010001210102012102020221050202210202022101021521" + }, + { + "filename": "head-calculator", + "data": "0x00051a16060200120302001203020001030489010303890103070701030200060303890103070701030200010304890d03020006030389010303890103038901030200010304890d03020006030389010303890103038901030200010304190d0302000103041901030389010303890103038901030200120302000103105d010302080103015d019c035d019c035d019c015d019c015d029c015d010302080103015d039c015d029c025d019c015d019c015d029c015d010302080103015d019c015d019c015d039c015d019c015d019c015d029c015d010302080103105d010302000103109d010302001203" + }, + { + "filename": "head-calendar", + "data": "0x00041a14050100029e0200029e0200029e0200029e0200029e02000202019e0302019e0302019e0302019e0302019e180201240102012401020124010201240102012401020124010201240102059f1002029f0102029f02020da00102019f0102019f0102019f030201a0010201a0010201a0010201a0010201a0010201a00202059f02020da00102059f030201a0010201a0010201a0010201a0010201a0010201a00202059f02020da00102059f030201a0010201a0010201a0010201a0010201a0010201a00202059f02020da00102059f030201a0010201a0010201a0010201a0010201a0010201a00202059f02020da00102059f030201a0010201a0010201a0062401a00102059f02020da00102059f1602" + }, + { + "filename": "head-camcorder", + "data": "0x00091c14050400047f0500047f060001240100117d03000224017f017d01250f7d02000324017f117d027f03240100117d027f02240200117d027f02240200117d027f022402001124027f022402001124027f022402000e24027f0124027f0224020001240b7d0224027f0124020002240200112403000124" + }, + { + "filename": "head-cannedham", + "data": "0x00041a14060f00017b10000384017b1200027b0f00047b0c00067b0300023a0200097b0500053a01001484508d14a22d07010f0152010f0152010f0152010f01521b071484" + }, + { + "filename": "head-car", + "data": "0x00091c1406050008560d000156080401560b00035608040156090005560804015607000756060401a30104015605000e5602a30456020014560158010014560158045601240228095602280124045602a30156012802a30128015602240456012802a30128025604a30100012802a3012807a3012802a30128010002a305000228090002280500" + }, + { + "filename": "head-cash-register", + "data": "0x00021a1408010004590e000159026301590e00045902000a280100016201590163025902620128084401280262045902620128014406550144012802620170026301700262012808440128026204700262012801440355044401280262042802620128084401288e62022b026202880162028801620288016202880162042b026202880162028801620288016202880162042b1362" + }, + { + "filename": "head-cassettetape", + "data": "0x00071b14050100140f0100020f1202040f0102010f1002030f0102010f0102010f1002020f05a4010203a4020203a4010205a4020f04a4030203a4010202a4030204a4020f04a4030203a4010202a4030204a4020f05a4010203a4020203a4010205a4020f14a4020f1427020f1427010f060d0a200b0d02200100062001000220090d0e20040d" + }, + { + "filename": "head-cat", + "data": "0x00031a14060100020f0d00020f0300040f0900040f0300010f0106040f0500040f0106010f0300010f0306020f0500020f0306010f0300010f0406070f0406010f0300010f0306090f0306010f0300010f01060d0f0106010f0300110f0400100f0400100f0400100f0400100f0400100f0400100f0200053d0506026d0406043d02000806019707060200053d030604970406043d020010060200" + }, + { + "filename": "head-cd", + "data": "0x00031b1805080006a40e0002a4066802a40a0002a40a6802a4070001a40e6801a4050001a401230f6801a4040001a402230e6801a4030001a405230b68024401a4020001a40623016804080368044401a4010001a404210323010804a40108074402a40621010806a40108064402a40621010802a4020002a40108064402a40621010802a4020002a40108069b02a40627010806a40108069b02a40727010804a40108026f059b01a4010001a40427036804080168046f029b01a4020001a402270b68056f01a4030001a40d68036f01a4040001a40f68016f01a4050001a40e6801a4070002a40a6802a40a0002a4066802a40e0006a40800" + }, + { + "filename": "head-chain", + "data": "0x00051e1602030004850100068501000685010003850600049401850694018506940185039406000485010b0685010b0685010b038507000185010b0185010b018502000185010b0185010b018502000185010b0185010b01850700038501940685019406850194068504000394018501020594018501020594018501020594040003850100068501000685010006857500068501000685010006850100048502000185010205940185010205940185010205940185010203940100018501940685010b0685010b06850194048501000185010b0185010b018502000185010b0185010b018502000185010b0185010b018502000185010b0185010b01850100048501940685019406850194068501940185010004940185069401850694018506940185020004850100068501000685010006850300" + }, + { + "filename": "head-chainsaw", + "data": "0x00051d16040300036415000164030001641400016403000164120008640200010e0200010e0200010e0200010e05000864010e0100020e0100020e0100020e0100020e04000864020e0264010e0264010e0264010e0264020e0300010e06640e0e0164020e08640e0e0164010e0200010e06640f0e020008640e0e0164020e0100010e06640e0e0164010e010008640f0e020008640e0e0164020e03640102010e0102010e01640e0e0164010e02000264010e0102010e010201640f0e04000864010e0264010e0264010e0264010e0264010e05000564020e0100020e0100020e0100020e0100020e070004640100010e0200010e0200010e0200010e0200010e0300" + }, + { + "filename": "head-chameleon", + "data": "0x00021c16040b00021e1600021e1500041e1300061e0e000185031e0185041e0185031e0185080003100185031e0485031e0185031005000110022302100185011e0185041e0185011e0185051003000110042401100185021e0485021e018506100200011001230224012302100185061e01850510022302000210022303100185061e018504100324020007100185061e0185041001230224020007100185061e018505100223030004100285081e02850410050003850c1e03850500141e0300161e0200041e048506240485041e0100021e03850e230385031e018505230110012306100123011005230185011e01001623030003230e0003230200" + }, + { + "filename": "head-chart-bars", + "data": "0x00041a1406100004740800041d040004740800041d040004740800041d046a047404000429041d046a047404000429041d046a047404000429041d046a0474041a0429041d046a0474041a0429041d046a0474041a0429041d046a0474041a0429041d046a0474041a0429041d046a0474041a0429041d046a0474041a0429041d046a0474041a0429011d0624016a0474041a0429041d046a0474041a0429041d046a0474" + }, + { + "filename": "head-cheese", + "data": "0x00031a140605000227012c0227022a0d000527022a0d000527032a0b000227012a0227022a012c012a0b000127012a022c0127012a012c032a0a000127012a022c0127012a0127032a09000527032a0227022a08000527072a08000527082a06000527092a060005270a2a050005270a2a040005270c2a030005270c2a03000127012a03270d2a01000127012a012c0227042a012c012a0324052a01000127012a012c0227022a0227072a0127032a05270f2a" + }, + { + "filename": "head-chefhat", + "data": "0x00051c14040500060210000b020c00090203a408020300060204a40c020200030203a410020100250201a4060201a4030201000b0201a4050202a403020300030201a4060201a4030202a404020500030201a4050201a4020201a4050208000e7d0a000ea40a000ea40a0001020c5601020a000e020a000e020500" + }, + { + "filename": "head-cherry", + "data": "0x00011b1505090003100e000110020007100d000b100b000110010007100e000110020003101000011003000110120001100300011011000110040001100d00031901100119040001100442060009190942030009190b4202000919094201020142010009190d4209190d4209190d4209190d4209190d420100091906420319024202000919054201190202034203000919094206000519040005420400" + }, + { + "filename": "head-chicken", + "data": "0x000318140805000156010003560a000756080008560700028807560388030006880456048802000988015604880100888804140c8806140a8804560c8804560488" + }, + { + "filename": "head-chilli", + "data": "0x00041c16050600081d0d000a1d0b00081d0e000a1d0d00071d0225011d0c00041d07250c00011d0a250d000a250d000a250d000b250c000b250d000b250900012502000c250700022503000d250400032504000525052409250500112507000f2509000c250e0007250600" + }, + { + "filename": "head-chipboard", + "data": "0x00061c140513a5040001a501a603a502a701a508a801a501a601a5040005a502a706a501a906a5030001a503aa01a502a701a50aab02a5030001a501aa01ab01aa02a501a906a501a907a501ac01a601a503aa01a501a904a501a903a501a905a501a902a605a501a903a501a905a501a903a501a901a501ac01a605a501a903a501a905a501a902a501a902a502a602a510a903a501ac01a601a501a903a501a90fa5020001a501a902a510a901a501ac01a601a501a901a501a910a501a902a603a501a901a502ab01a502ab01a502ab01a502ab01a502ab02a501ac01a601a501a601a501a901a502ab01a502ab01a502ab01a502ab01a502ab02a502a615a501ac01a6" + }, + { + "filename": "head-chips", + "data": "0x00021c19040d0001241600010702241400030702241200020701020207022410000288050702240e000488050702240c000288010203880507034309000288010205880507024308000a8805070143012406000c880507022404000e8805070224020001070f8805070124010003070f880407010005070f880207020006070f88040006070d88020001430300060703880215068802000243040006070988020003430500060707884c00034315000243160001430200" + }, + { + "filename": "head-chocolate", + "data": "0x000319140701000186010f03980186039809000186010f02860198038601980900020f098607000186010f0398018603980186019807000186010f02860198038601980386019801860400020f0c8604000186010f03980186039801860398018602980100038d0f065a8d0100028a0e1a0200101a0200101a0200031a0c8a011a0200101a0100" + }, + { + "filename": "head-cloud", + "data": "0x00041c14040b000502110009020e000b020c000d020a000f0207001102050014020300150203001502020016020200170201003002010017020100170202001502050012020200" + }, + { + "filename": "head-clover", + "data": "0x00041d16070400031e0500031d0a00051e0300051d0900051e0300051d0700031d051e0100061d021e0400041d061e041d051e0300051d051e031d061e0300061d0110021e031d0110061e0400061d0110011e021d0110061e0700051d0110011d0110051e0a00021e031d0110031d021e0a00051e0110011d0110051d0700061e0110021d011e0110061d0400061e0110031d021e0110061d0300061e031d051e051d0300051e041d011e055d041d010002100100021e061d0110051e031d04100300051d0310051e05100400051d0300051e0a00031d0500031e0700" + }, + { + "filename": "head-clutch", + "data": "0x00071b14030b0004130b0009770413097702000877015c0413015c087702000877065c087702000813015c04ad015c0813010001130877015c0413015c087701000113097704130977015c0100097704130977015c0100097704130977020009770413097702000977041309770200097701020124010201240102087702000977041309770200097704130977" + }, + { + "filename": "head-coffeebean", + "data": "0x0005191608040004ae010004ae060005ae01350136013505ae030002ae013503ae01350124013506ae010002ae013504ae01350124013508ae013505ae01350124013508ae013505ae01350124013508ae013505ae0135012401350eae0135012401350eae0135012401350eae0135012401350eae0135012401350eae0135012401350eae0135012401350bae03240135012401350eae01350124013507ae010006ae01350124013506ae030005ae01350136013505ae060004ae010004ae0400" + }, + { + "filename": "head-cone", + "data": "0x000319140708000225100002250f0004250e0004250e0004250d0006250c0006af0c0006af0b0008af0a0008250a00082509000a2508000aaf08000aaf07000caf06000c25030004250c491425" + }, + { + "filename": "head-console-handheld", + "data": "0x000319140713031011020301110f7a02030111077a01b0077a02030111057a0511017a01b0011101b0017a02030111067a03b0027a011101b00111017a02030111017a0211017a0111017a01b0017a01b0027a01b0011101b0017a020301110f7a020301110f7a020301110f7a020301110f7a020301110f7a020301110f7a150301b1100303b1020301b1010301b1010303b201030325030301b1020301b1010301b1020303b2010303251303" + }, + { + "filename": "head-cookie", + "data": "0x00031a1606070006990c000a9908000e99050007990186089904000d99018602990300129902001299010073990286039901000e9902860299020003990286029901860a99030002990286029905860599040006990186099905000499018604990186049908000a990c0006990700" + }, + { + "filename": "head-cordlessphone", + "data": "0x000a1d1402020009030db1030302000503038a010301b1028901b1028901b1028902b1018a01b103030200020301b10203038a010301b1028901b1028901b1028902b1018a01b1030302000503038a01030db101030124010302000503038a010301b1028901b1028901b1028904b10103012401030200010301b1010301b10103038a010301b1028901b1028901b1028904b101030124010302000503038a010301b1028901b1028901b1028904b101030124010302240503038a01030db10103012401030224020301b10203038a010301b1028901b1028901b1028902b1018901b101030124010302000503038a010301b1028901b1028901b1028902b1018901b10303020009030db10303" + }, + { + "filename": "head-cottonball", + "data": "0x00021c16040a00010216000302014c0202020001020a00010202000202014c07020c000502014c0402014c03020200010206000102014c0402014c0502014c040207000202014c0a02014c020207000302014c0602014c0302014c030206000102014c0202014c0602014c0402014c010204000202014c0302014c0602014c070204000502014c0d02014c04000402014c0f0204001102014c02020100010201001202014c03020100010201000302014c0d02014c020205000102014c0d02014c020206000402014c0202014c0202014c0302014c030207000302014c0302024c07020100010205000302014c0302014c0202014c0402014c01020900014c0d020c000802014c010210000102014c0302014c0900" + }, + { + "filename": "head-cow", + "data": "0x0006191406030001800324058005240500018003240580052403000380032405800524018001000c800524198002240d80030003240b800500032404800324048005000780032404800500078003240480050002800e6003000124018004600208036002080360030002240e6003000224036009080260030002240e60" + }, + { + "filename": "head-crab", + "data": "0x00021b14050400041406000414060007140400071403000914020009140100031402b30c0002b30d140200131404000b14010005140600051401000414070001240200012407000414010010140100041401001014010044140300101406001014060010140600061404b3061406001014060010140300" + }, + { + "filename": "head-crane", + "data": "0x00061f1405060005b413000ab40f000cb40d0003b4050206240b0002b406020824090001b40802092408000902072404b606000a02052408b60300060209240bb6050207240e00040208240f0002020a240f0002020324040205240d0002020d240c0002020c240800" + }, + { + "filename": "head-croc-hat", + "data": "0x00061e150801000e2408000e240700102407000e1e08000e1e08000e1e08000e1e08000e1e08000e1e08000e1e0800151e0100151e0100031e0324021e0424021e0424031e0100051e0124021e0124021e0124021e0124021e0124031e0100051e0424021e0424021e0324011e0100151e" + }, + { + "filename": "head-crown", + "data": "0x00041a14060100015c0700025c0700015c0200015c0700025c0700015c0200025c0500045c0500025c0100028c012c015c0300015c041e015c0300015c012c0242018c0155012c025c0100025c011e029c0110025c0100025c012c011901420255012c055c021e0210055c012c02190100125c0200125c0200125c0200125c0200125c0200125c0200125c0200125c03000136052c0436052c01360300125c0200125c0100" + }, + { + "filename": "head-crt-bsod", + "data": "0x00051a15040400120104001201020004010167025b01670a5b0801025b01670b5b08010167025b01670a5b08010e5b08010e5b08010e5b08010e5b020102b104010e5b08010e5b020102b104010e5b08010e5b020102b104010e5b0f01012401010124060102000a0101240101012401010124050104001201" + }, + { + "filename": "head-crystalball", + "data": "0x00021a14060700062e0c00022e06b7022e0900012e0ab7012e0700012e07b7012e04b7012e0500012e03b7012e0ab7012e0300012e03b7012e01b7012e05b7012e04b7012e0200012e04b7012e05b7032e03b7012e0100012e0cb7012e05b7022e07b7012e0ab7022e12b7022e12b7022e12b7022e12b7012e0100012e10b7012e0200012e10b7012e0300012e0eb7012e040010b8040005b8072404b8040010b80200" + }, + { + "filename": "head-diamond-blue", + "data": "0x00051a18060500024b0104044b0104024b0900034b0104044b0104034b0700034b0104064b0104034b0500044b0104064b0104044b0300044b0102084b0104044b01000204010201040302010401020b04054b0102084b01040a4b0104084b01040a4b0104084b01040a4b0104084b0104054b14040100054b0104064b0104054b0300044b0104064b0104044b0500044b0104044b0104044b0700034b0104044b0104034b0900024b0104044b0104024b0b00024b0104024b0104024b0d00014b0104024b0104014b0f000104024b01041100024b0900" + }, + { + "filename": "head-diamond-red", + "data": "0x00051a1806050002b9014304b9014302b9090003b9014304b9014303b9070003b9014306b9014303b9050004b9014306b9014304b9030004b9010208b9014304b901000243010201430302014301020b4305b9010208b901430ab9014308b901430ab9014308b901430ab9014308b9014305b91443010005b9014306b9014305b9030004b9014306b9014304b9050004b9014304b9014304b9070003b9014304b9014303b9090002b9014304b9014302b90b0002b9014302b9014302b90d0001b9014302b9014301b90f00014302b90143110002b90900" + }, + { + "filename": "head-dictionary", + "data": "0x00051b150501000802040008020100014b01020373010203730102020001020373010203730102024b1402024b010203730102037304020373010203730102024b1402024b010203730102037304020373010203730102024b1402024b010203730d0202730102024b1402024b010203730d0202730102024b1402024b010203730d0202730102024b070206420702024b1402024b14020b4b02020a4b0900044b0900" + }, + { + "filename": "head-dino", + "data": "0x00071d15080300061e0f00061e0c00bd1e0100051e0302011e0302011e0302011e03020100051e0302011e0302011e0302011e03020100141e0100141e" + }, + { + "filename": "head-dna", + "data": "0x00091d160304441200045601000127010004440c000456010001520200012701000156010004440800035601440100012701000152020001270100015601000144010001520244060002560144010001440100012701000152020001270100015601000144010001520100024404000256010001440100014401000127010001520200012701000156010001440100015201000344020002560144010001440100014401000127010001520200012701000156010001440100015201000144010002440256010001440100014401000144010001270100015202000144010001520100012701000156010001440200025602000144010001440100015601000144010001560200014401000152010001270100015601000144010002560244010001440100014401000156010001440100015602000144010001520100012701000156010001440256020003440100014401000156010001440100015602000144010001520100012701000156010002560400024401000144010001560100014401000156020001440100015201000127010003560600034401000156010001440100015602000144010005560a000544010001560100055610000544" + }, + { + "filename": "head-dog", + "data": "0x00061a140603000e98040004860d980186010005860d9806860e9806860e9806860e9806860e9806860e980686049806390498068604980639049806860398083903980686019808390224020e0139028602000398083904240139040003980439022401020324010201240139040003980d390200" + }, + { + "filename": "head-doughnut", + "data": "0x00031a160607000157056d0c00026d0157046d01ba026d08000a6d01ba036d0500086d016e056d021a0400026d02ba016d011a036d016e066d0300076d011a016d0139056d0157026d0200076d0539026d0157036d0100046d016e026d013904000139066d011d016d021d016d016e016d013906000139026e036d011d066d0139060001390c6d013906000139086d0157036d013906000139036d02ba036d0157036d023904000139026d0157046d0100076d0539036d0157026d0200046d01ba066d021a056d0300026d01ba046d0157086d0400076d0157040f016e036d0500026d011a096d016e016d0800011a096d0c00016d021d036d0700" + }, + { + "filename": "head-drill", + "data": "0x00071c140502000e1501a407000f1501a4017f06000f1501a4017f017d017f017d017f017d101501a4027f017d017f017d017f101501a4017f06000f1501a407000f1501a408000e1501a40b00057f01a41100057f02a41000057f03a40f00077f0f00011501240127012401270124081509000e150500" + }, + { + "filename": "head-duck", + "data": "0x00041d1407070006020e0005020c001002060011020500110205001102050011020500110205001102050011020500110205001102050011020500050210470100050204470143014701430a4705021147010005021047" + }, + { + "filename": "head-ducky", + "data": "0x00031c14040c0008270e000527045202270c00052702520224025201270c000527025202240252012701150b0006270452022703150100022707000a2703150200052705000a2703001627020017270100482701001727010017270200162702000b27018b092704000727038b0927070010270300" + }, + { + "filename": "head-earth", + "data": "0x00031a1606070006440c000a4408000344011d0544011d0244021d05000244031d0544061d04000244021d0544071d0300011d0244031d0344091d0200021d0244011d0444091d0100031d08440c1d0d44081d07440e1d0544091d0144061d0444081d0244061d0444071d03440100031d0644071d02440200021d0844041d04440300011d0944041d02440400011d0444081d034405000e4408000a440c0006440700" + }, + { + "filename": "head-egg", + "data": "0x0001191507070004020c00020202af04020900010201af010202af020202af010207000c020500010201af020201af020201af06020400010201af060202af020201af01020300010201af020201af040202af030201af01020200010201af0c0201af01020200010201af0b0201af02020100100201af060201af0a0201af030201af0a0201af020201af030201af0a0201af020201af330202af0202010010020200030201af080201af030203000502021f070205000c020800050201af02020500" + }, + { + "filename": "head-faberge", + "data": "0x0001191406080003270d0001270207012701070127020701270a000207012703070127020709000110040701100407011007000d0706000107012704070127040701270107050001070127018a012702070127018a012702070127018a01270107040002070127040701270407012702070300110702001127010013270100118b020011070200110703000f0704000f0704000f0705000d0706000627032403270900098b0500" + }, + { + "filename": "head-factory-dark", + "data": "0x00031a14080300057d0b00010f0300087d0600020f0b00047d010002251000020f0400010f0300010f0300010f0300020f0300020f0200020f0200020f0200040f0100030f0100030f0100030f0200100f0200100f0200100f0200100f0200100f0200100f0200100f0200100f0200020f0173010f026e010f026e010f0173050f0200100f0200100f0200" + }, + { + "filename": "head-fan", + "data": "0x00031a1606070006520c0003520100015202000352080003520200015202000152020003520500035202000152027f0152027f0152020002520400025202000152027f0152027f0152027f01520100015203000252020001520100017f0152027f0152027f0152017f01000252020001520200015202000152027f0152027f0152017f01000152010001520100025201000152020001520100017f0263017f0152017f010001520200035201000152027f015202000463020001520200015201000352027f0152027f06630152027f0152020002520100017f0152027f01520663027f0152017f0100035201000152027f0152027f0463027f0152027f0152010003520100017f0152027f0152017f0263027f0152027f0152017f02520100015201000152027f0152027f01520100017f0152027f0152027f0152020002520100017f0152027f01520100017f0152027f0152027f02520300015201000152027f015202000152027f0152017f01000252040002520200015202000152027f015202000352050003520200015202000152020003520800035202000152010003520c0006520700" + }, + { + "filename": "head-fence", + "data": "0x00041d1403020001bb060001bb060001bb06000135030003bb0400013502bb040003bb040001bb013501bb010005bb020001bb013503bb020005bb020002bb013507bb020001bb013503bb020003bb013501bb020002bb013505bb013501bb020001bb013503bb020003bb013501bb020008bb013501bb023501bb013503bb023503bb013501bb023502bb013505bb013501bb023501bb013503bb023505bb023508bb013501bb023501bb013503bb023505bb023508bb013501bb020005bb020005bb020005bb013504bb020005bb020001bb013503bb020003bb013501bb013504bb020005bb020001bb013503bb020003bb013501bb013502bb013501bb023505bb023501bb013503bb023503bb013501bb013504bb023505bb023501bb013503bb023501bb013501bb013501bb013504bb023505bb023501bb013503bb023503bb013501bb013504bb020005bb02000586020003bb013506bb020003bb013501bb02000586020003bb013506bb020003bb013501bb020001bb013503bb020005bb" + }, + { + "filename": "head-film-35mm", + "data": "0x0003181405080006240d0006240800102403430727078802270100014301000727078802270343072707880227034307270788022703430727078802270343072707880227034307270788022703430727078802270343072707880227034307270788022703430727078802270343072707880227010001430100022703ae022707880227034307270788022703001024" + }, + { + "filename": "head-film-strip", + "data": "0x00051b140516bc010002bc010002bc010002bc010002bc010002bc010002bc010002bc010016bc02bd01bc10bd01bc04bd01bc10bd01bc04bd01bc10bd01bc04bd01bc10bd01bc03bd017c01bc10bd01bc04bd01bc10bd01bc04bd01bc10bd01bc04bd01bc10bd01bc04bd01bc10bd01bc04bd01bc10bd01bc02bd16bc010002bc010002bc010002bc010002bc010002bc010002bc010002bc010016bc" + }, + { + "filename": "head-fir", + "data": "0x00011f18010e0002101b0004101900061017000310015d041015000310015d061013000310015d0410015d031011000a10015d03100f000c10015d03100d0012100b001410090016100700181005001a1003001c1001001e10060012100b0014100900161007000610065d0c1005001a10270001100e0001100d0002100e0002100b0003100e0003100500" + }, + { + "filename": "head-firehydrant", + "data": "0x00021c14040b0002be140006be110002bf01be02bf01be02bf0f0003bf01be02bf01be03bf0d0003bf01be04bf01be03bf0c0003bf01be04bf01be03bf0b0003bf01be06bf01be03bf0a0003bf01be06bf01be03bf080012be060012be08000ebf0a000ebf060002bf012410be012402bf020002bf012410be012402bf010001be02bf012410be012402bf02be02bf012410be012402bf01be010002bf012403be0b2402be012402bf020002bf012410be012402bf06000ebf0500" + }, + { + "filename": "head-flamingo", + "data": "0x00031b14050c00042103ba0d00062101ba012401ba01210b00072103ba02210900042105000321026007000421080003600700042108000260010f070005210800020f080006210600020f090008210300010f0b0009210e0009210f0008211000062102002b6b0b2106091b21010014210100" + }, + { + "filename": "head-flower", + "data": "0x00031b18050a000250130004500d0002ba0200019b0450019b020002ba070005ba019b0450019b05ba050007ba019b0250019b07ba040007ba041407ba050004ba0214046e021404ba060003ba0114086e011403ba0500029b02ba0114086e011402ba029b03000350019b01140a6e0114019b03500100055001140a6e01140a5001140a6e0114055001000350019b01140a6e0114019b03500300029b02ba0114086e011402ba029b050003ba0114086e011403ba060004ba0214016e0386021404ba050007ba041407ba040007ba019b0250019b07ba050005ba019b0450019b05ba070002ba0200019b0450019b020002ba0d000450130002500a00" + }, + { + "filename": "head-fox", + "data": "0x00031c190405000302140005021200014305020800022401000224040002430502080002430100024303000443030209000643010007430400022406430112014301120743070006020a4309000b02054309000a020100054309000902020004430a00080204000f43050204001043040204001143030204001243020204000543070207430102040005430624020206430500054309020443060001430e000243040004430e000143050001431100024304000124120002430224010001241600" + }, + { + "filename": "head-frog", + "data": "0x00061914070300051d0300041d0500071d0100061d0300041d02100a1d0200041d02100a1d02000d1d0210011d02000d1d0210011d0200101d0200101d020002100e1d0100011d0210331d14680e5d0268010010680100" + }, + { + "filename": "head-garlic", + "data": "0x00051914070700010c0100010c0100010c0e00030c0f00030c0e000158030c015809000158030c0158030c0158030c0500010c0158030c0158030c0158030c01580300020c0158030c0158030c0158030c0158010c0100030c0158030c0158030c0158030c0158050c0158030c0158030c0158030c0158050c0158030c0158030c0158030c0158050c0158030c0158030c0158030c0158050c0158030c0158030c0158030c0158050c0158010c01c0010c0158030c0158030c0158050c0158020c04c0010c0158030c0158020c0100020c0158030c0158030c0158030c0158010c0300010c0158030c0158030c0158030c01580200" + }, + { + "filename": "head-gavel", + "data": "0x000419140108000f3509000f350a000d240b000d270b000127015e0b270b000127015e0b270200013501000235010004350d2704000135020004350d2703000235010005350d270b000d270b000d270b000d270a000f3509000f240800118f0700118f07001124" + }, + { + "filename": "head-ghost-B", + "data": "0x00051b16030c00028d1500048d0b00028d0700058d0600028d0200048d0400028d0104018d0104018d0400048d0200068d0200068d0200068d0300148d0400148d0400148d0400148d0500128d0600128d0600118d0700118d08000f8d07000f8d0600118d0b00028d1400048d1200" + }, + { + "filename": "head-glasses-big", + "data": "0x00091c120204000a8102000a810400018105020481020001810502048104000181050204810200018105020981050207810502098105020781050205810300018105020481020001810502058103000181050204810200018105020581030001810502048102000181050204810400018105020481020001810502048104000a8102000a81" + }, + { + "filename": "head-gnome", + "data": "0x00011a14060900024212000242110004420f0006420e0006420d0008420c0008420b000a4208000ec1030001c2010001c10ec201c1010003c201c10ec201c104c201c10ec201c104c201c10ec201c102c20200104d0400104d0400104d0400104d040003c20124010201240102012401020124010201240102012402c2040003c20b4202c20500088b018f078b0100" + }, + { + "filename": "head-goat", + "data": "0x00051d1805030001b10c00040e060002b10e0004b1030002b10e0002b1017f022401b1020002b10e0002b1017f04b101000fb1017f02b1017f02b1029902000eb1017f02b1017f01b1017f02b103000eb1027f02b1010002b1030010b1030001b1040010b1080010b1080011b1070011b1060005b1017f0cb1060005b1017f01240102012401020124010207b1050004b1017f0ab1010003b1050003b101000ab1040001b1040002b1110001b1030003b1100002b1030001b1120001b1040001b1120001b10400" + }, + { + "filename": "head-goldcoin", + "data": "0x00031a1606070006270c000327042c032708000327022c0427022c032705000227022c0827022c022704000127012c0c27012c012703000227012c0c27012c022702000127012c0927032a0227012c012701000227012c0327032a0827012c0327012c1027012c0227012c1027012c0227012c1027012c0227012c1027012c0327012c112701000127012c102702000227012c0f2703000127012c0227012a0127042a0427012c012704000227022c0827022c022705000327022c0427022c032708000327042c03270c0006270700" + }, + { + "filename": "head-goldfish", + "data": "0x00051b1405020012220500109604001422010029220152032212070152010702221407022212070152010702221407022214070222140703220807032607070222010001220707011501260124022606070122020002220707032606070222030003220c07032206000e220400" + }, + { + "filename": "head-grouper", + "data": "0x00061d1602090001080100010801000108010001080100010810000c080e000f0807000208020004080e7b040004080200137b03000408157b01000508157b02000408117b0108047b02000308107b02c5047b010004080e7b02c5047b0283020003080d7b01c5047b0283030004080c7b01c5047b018304000508057b0208047b010801c5037b018305c501000408047b0108057b020801c5027b018301c5047b010004080200077b040801c5077b030002080600027b0508027b01c5047b100003080c00" + }, + { + "filename": "head-hair", + "data": "0x00031e15020800068f0100058f0f00018f0627018f0527018f0d00018f0127068f0127058f0127018f0900018f0100018f0127018f0627018f0527018f0127018f0100018f0700018f0127018f0127068f0127058f0127018f0127018f0800018f0127018f0127018f0500018f0400018f0127018f0127018f0800018f0127018f0127018f0a00018f0127018f0127018f0800018f0127018f0127018f0a00018f0127018f0127018f0600018f0100018f0127018f0127018f0a00018f0127018f0127018f0100018f0500018f0127018f0127018f0c00018f0127018f0127018f0600018f0127018f0127018f0c00018f0127018f0127018f0600018f0127018f0127018f0c00018f0127018f0127018f0600018f0127018f0127018f0c00018f0127018f0127018f0400018f0100018f0127018f0127018f0c00018f0127018f0127018f0100018f0300018f0127018f0127018f0e00018f0127018f0127018f0400018f0127018f0127018f0e00018f0127018f0127018f0400018f0127018f0127018f0e00018f0127018f0127018f0400018f0127018f0127018f0e00018f0127018f0127018f0200028f0100018f0100018f1000018f0100018f0100028f" + }, + { + "filename": "head-hardhat", + "data": "0x00041d1405050005c605c70d0006c701c605c70b0006c602c701c605c7090007c701c602c701c605c7080008c701c601c701c605c7070009c701c602c705c601c7060009c701c608c7060009c701c608c7060009c701c608c7060009c701c608c7060009c701c608c7060009c701c608c7060009c701c608c7060003c70fc6050004c701c60d2401c609c701c60dc701c61dc7" + }, + { + "filename": "head-heart", + "data": "0x00041c1704050005250400052508000925010008250500062502020625020204250300092501020525020201250102032502001325010202250100142501024b2501001625020016250300142504001425050012250700072502020124062509000e250b000c250d000a2510000625140002250b00" + }, + { + "filename": "head-helicopter", + "data": "0x00031d14020d0002241000016204630262062402620463016210000224190002241600072107570400022106000221019b0121019b0121019b012108570300032104000321019b0121019b0121019b01210957020002630e210557030202570163022401630d210557030202570163022401630d210557030202570100026302000c210a5706000b2108570102015707000a21085701020157080009210657020201570a00082108570c000e210f0001240200012412000e240600" + }, + { + "filename": "head-highheel", + "data": "0x00061b14050200031912000519110006190f0008190e0008190e0008190e0008190e0009190d000b190c000c190b0004190200081909000219040009190700021905000a190500021906000319042404190300025c07000a5c" + }, + { + "filename": "head-hockeypuck", + "data": "0x00051b1505070008050b00030508200305060002050e200205030001051220010501000105142002051420020514200105010e0105122001050120020e02050e200205010d0120040e030508200305020d0220070e0805060d0120040e030d020e010d010e090d0220070e0e0d01200100030e030d020e0b0d01200300050e030d0105010e0205010e050d0600030d020e090d0b00080d0700" + }, + { + "filename": "head-horse-deepfried", + "data": "0x00061b15050900018f0100028f0d0003ad0100068f010003ad0600028f03ad068f020003ad0600028f07ad018f06ad0500038f06ad036e05ad0600028f07ad016e06ad0600028f07ad016e06ad0500038f07ad016e06ad0600028f07ad016e06ad0600028f07ad016e06ad0500038f128b0200028f0e8b0124018b0124018b0100038f028b016e0124016e0124016e0124016e098b048f128b0100038f128b0100018f0100018f0e8b0400" + }, + { + "filename": "head-hotdog", + "data": "0x00031714090500048a07000184013a068a013a018403000284013a068a013a028401000284013a028a016e021a038a013a0484013a038a026e011a028a013a0484013a058a016e011a018a013a0484013a038a026e011a028a013a0484013a028a016e021a038a013a0484013a038a026e011a028a013a0484013a058a016e011a018a013a0484013a038a026e011a028a013a0484013a028a016e021a038a013a0484013a038a026e011a028a013a0484013a058a016e011a018a013a0484013a038a026e011a028a013a0484013a028a016e021a038a013a0484013a038a026e011a028a013a0484013a058a016e011a018a013a0284" + }, + { + "filename": "head-house", + "data": "0x00031c1505080001840f00027d04000184015201840e00021203000184035201840d0002120200018402520184025201840c000212010001840252018401c80184025201840712040002120184035203840352018407120300011201840b5201840712020001840d520184071201840f5207841a52051203520b840452051203520184031203c8031201840452051203520184021205c8021201840452051203520184011207c80112018404520312012701120352018406c8017d02c80184045205120352018405c8027d02c8018404520112032401120352018404c8037d02c801840452051203520b840352077d0e52" + }, + { + "filename": "head-icepop-b", + "data": "0x00071c19020500061d0894051a0600021d059c08020317031a0500011d019c051d0894031a0202021a0400011d019c051d0894031a0202021a0400071d0894051a0117011a04c9071d0894051a0117011a04c9071d0894071a04c9071d0894051a0117011a04c9071d0894071a04c9071d0894071a0400071d0894071a0400011d029c041d0894071a0400011d029c041d01940202019401020394061a0600061d0894051a0a00021d0c00021a0a00011d0d00011a1900011a3300011a0300" + }, + { + "filename": "head-igloo", + "data": "0x00051e14050800060210000402013d0202023d03020c000102033d0302013d0302023d01020a000102013d0602013d0502013d010208000102033d0102043d0102013d0102053d010207000602013d0602013d040206000102013d1002013d010205000502053d0102063d03020500140204001202013d0102013d020202000102023d0902063d0102013d040201000302013d0402013d0502013d0202013d0102013d0202013d010201000302013d0402013d0502013d0302013d0202023b013d0202023d0102053d0102033d0202043d0202023b013d0202013d0302013d0502013d0402013d0102013d0202033d010201000402013d0502013d0402013d0102013d05020100" + }, + { + "filename": "head-island", + "data": "0x00021b140604000410100006100100061d0c000210091d08000810031d01ca031d0500041001ca0310031d01ca0200031d04000210020002ca01000110021d02ca0300021d04000110040002ca0100021d01ca0400021d090002ca0200011d01ca0500011d0400061001ca020002ca0900081001ca010002ca0900081001ca010002ca0900081001ca010002ca0900081001ca010002ca09000e270600102704000d27014704270200022701470127022a0227022a0227014703270147032701000627022a062701470527010014270100" + }, + { + "filename": "head-jellyfish", + "data": "0x00031c1b0507000560016b03600b00016b0e6006000660016b0c60040013600300086005770560016b026002000160016b046009770660010005600d770660016b02600f770260016b05600f770760117706601177036001000160137701600200016013770160020001601377016002000160036f0177036f0177036f0177036f0177036f01600200156f0200016b086f0691066f0200016b0200016b0e6f016b0100016b0200016b0200016b0e00016b0100016b0200016b0200016b0e00016b0100016b0100016b0200016b0f00016b0200026b0200016b1000016b0100026b1300016b0100026b1500026b1500016b" + }, + { + "filename": "head-jupiter", + "data": "0x00011d1a030900088310000c830e000983037e0b00107e02380700057e0f3806000b380939040005380a390938020006390a38087e020009380f7e01000638147e04387c7e0238167e0438147e0638010001380b7e0c3802000e3804260338038304000b3802260224022603830600048308380426048306001483070012830b000c8310000883120008830900" + }, + { + "filename": "head-kangaroo", + "data": "0x00051a1406037f0a00037f0400017f0239017f0800017f0239017f0400017f0339017f0600017f0339017f0500017f0339017f0400017f0339017f0700017f0239027f0200027f0239017f09000a7f0a00087f0c00087f0c00087f0c00087f0c00067f088203240300067f088203240300067f0b820300067f022409820300067f0b820300067f0b82" + }, + { + "filename": "head-ketchup", + "data": "0x0002181408070002250e0002250d0004250c0004250b00068a0a00062406000225028a0225028a0225028a022502000e2401008225038a0225038a0a25048a1825" + }, + { + "filename": "head-laptop", + "data": "0x00061b16051720010c013d120c022014570220145702201457022014570220145702201457022014570220145702201457022014570420010f0120010f0120010f0120010f0120010f0120010f0120010f0120010f0120010f0420130f0320010f0120010f0120010f0120010f0120010f0120010f0120010f0120010f0120010f0420130f1820" + }, + { + "filename": "head-lightning-bolt", + "data": "0x00021e19050800031f1500081f11000c1f0c000c1f0d000b1f0d000b1f0e000a1f0e000a1f0f00091f0f00091f1000081f1000171f0200161f0200151f0400131f0500121f0c000b1f0d000a1f0f00081f1000071f1200051f1300041f1500021f1600011f1700" + }, + { + "filename": "head-lint", + "data": "0x00021b16050a00018d1400018d0f0001920600018d04000141080001920300018d0200038d014101000241090002920200028d0192028d03410400029206000341028d0192018d014101920241018d020001920300018d0200014101920341018d0192018d024101920241028d0300038d034101920341038d024101920141018d0500018d0100018d024101920341018d0192028d014101920141028d0600018d0192024101920241028d0192028d02410192028d010001920100028d0192018d024101920241028d0192028d0241038d010001920200018d0141028d014101920241058d0241028d0192018d01920100058d0741038d01410192038d010001920100038d01920841028d01410192028d020001920200018d01920a41018d0192028d0500038d0141018d01920641018d0192038d0192050001920141028d0192014104240141048d010002920300048d01920741028d0192028d0500018d010002920741028d0192018d0192090001920100014101000341018d0192018d0100018d0e0001410192010001920900" + }, + { + "filename": "head-lips", + "data": "0x00051d150307000425040004250c0007250200072509000d250202032507000e2503020325050013250102022503001825020006250c02062501000525100209251202072514021d250100182502001825030016250500082504020825080010250d000a250800" + }, + { + "filename": "head-lipstick2", + "data": "0x0001181408060003250b0007250800013809250500012501380a25040002250138062501380225040003250438020203250400072502380325040007250238032502000b2b01020f2b01020f2b0102042b0b0e01050f0e01050f0e01050f0e01050f0e01050f0e01050a0e0224030e01050f0e0105040e0b0501020405" + }, + { + "filename": "head-lock", + "data": "0x00031814080400082007000a200500032006000320040002200800022004000120010e08000120010e0400020e0800020e0200107b718b026e0a8b026e028b026e048b0224048b026e088b0224178b" + }, + { + "filename": "head-macaroni", + "data": "0x00081d14030100082a0800082a0100022a060b022a0600022a060b022a0127082a012706000127082a0b2706000b27012908270600082701290227012909270400082702291827012902270100182702001527012902270300162705000627020b0127020b0127020b0627070012270a000e270600" + }, + { + "filename": "head-mailbox", + "data": "0x00071c14050700058a1200058a1500028a0b000a05028a030508000a05028a030508000a05028a030508000a05028a030508000a05028a0305060202000a05028a03050402013b010202000a05028a0305060202000a05028a0305060202000a05028a030501020424010202000f05060202001705" + }, + { + "filename": "head-maze", + "data": "0x00061b14050acb01000ccb0b0001cb040001cb030002cb01000bcb010001cb010004cb010002cb010001cb030001cb070001cb040001cb010002cb030001cb030007cb010004cb010007cb010002cb030001cb080002cb010001cb050001cb010001cb010001cb010006cb010002cb010005cb010001cb010003cb080002cb050001cb050001cb010009cb010003cb010003cb010001cb080001cb010002cb030001cb010001cb010001cb010008cb010001cb010004cb010001cb100002cb010001cb010004cb010007cb010006cb030001cb080001cb070015cb010001cb" + }, + { + "filename": "head-microwave", + "data": "0x00071a1f05010002960f06012202060100029601060e9301220144010f0100029601060e930122010f01440100029601060e93012202c80100029601060e93012202060100029601060e93012202c80100029601060e93012202060100029601060e93012202c80100029601060e93012202060100029601060e93012202c80100010f019601060e9301220206020f019601060e93012202c8020f01960f06012202c8010f02960f0601220206010f1400010f1400010f1400010f1400010f1400010f1400010f1400010f1400010f1400010f1400010f1400" + }, + { + "filename": "head-milk", + "data": "0x00031b14080100014b0d800500014b0680052502800400034b05800925028a034b09800525028a034b0d440300034b0144018001440280014404800144018001440300034b0d440300034b0d440300034b0d440300034b0d440300034b0d440300034b0d440300034b0d440300034b0d440300034b0d44030003c80d800300034b0d440300034b0d440300" + }, + { + "filename": "head-mirror", + "data": "0x00041a1406159802060102010603020a060102029801060102010603020b06010202980102010603020c0601020298010603020d060102029803020106063d0106063d0102029802020206013d0406013d0106013d0406013d010202980102043d0406033d0406013d010202980106013d0206013d0406013d0106013d0406013d010202980106013d0206013d0406013d0106013d0406013d010202980406063d0106063d0102029811060102029811060102029811060102029811060102029812021598" + }, + { + "filename": "head-mixer", + "data": "0x00021a140603000224030002250300022507000173030001240173030001250173030001250300150d0310020d0310020d0310020d0124010d0124020d0110015d0110020d0110015d0110020d0110015d0110020d0125010d0124110d014f010d01b0030d0124040d0124030d0302020d014f010d014f030d0124040d0124030d0373020d014f010d014f030d0124040d0124040d0124090d0124040d0124040d0124090d0124040d0124040d0124050d0120030d0124040d0124040d0124090d0124040d0124040d0124050d0120030d0124040d0124040d0124090d0124040d0124040d0124050d0120020d0302030d0124040d0124080d0373020d0302030d0124040d0220030d0124030d0373030d0124040d0220150d" + }, + { + "filename": "head-moon", + "data": "0x00031a1606070006880c000388035f048808000488035f078805000488025f0688015f038804000e88015f01880300128802000588015f0888015f038801000288015f1288025f1288015f4e880100128802000f88015f02880300058802240688025f018804000b88035f028805000688015f0388015f038808000a880c0006880700" + }, + { + "filename": "head-moose", + "data": "0x00051c15040384010002840c00028401000684010002840c86028401000684010002840c86028401000684010002840c86028401000a840b860d840b860d840b86068404000e860a000f8609000f8609000f86090005860d99060005860d990600058606990285029902850199060005860d990600058601990b8501990b000d990200" + }, + { + "filename": "head-mosquito", + "data": "0x00011f14030c0002361800023603000236140001360300023615000136030001361700013602000136180001360200013618000136020001361400091212000212014a09120f000212014a0b120d000212014a0d120c0011120a00131209000212014a10120900141209001b120200151208000a1207860c000212078607120d000f120800" + }, + { + "filename": "head-mountain-snowcap", + "data": "0x00031c15040a00040213000102028e030211000102018e060210000102018e06020f000a020e000102018e0602018e01020d000c020c000c020b000e020a000e020900021e0202021e0402021e0302011e0800021e0102041e0202041e0102021e0700021e0202051e0102041e0202021e0600021e02020a1e0202021e0500031e0202051e0102041e0202031e0300021e01020f1e0102031e01000b1e0302071e0102021e0100161e0400061e0600061e0300" + }, + { + "filename": "head-mouse", + "data": "0x00031e1407070f0400070f0500070f0400070f0500070f0400070f0500070f0400070f0500070f0400070f0500070f0400070f0500070f0400070f07000e0509000e0509000e0509000e0509000e050400030f02000e050400030f02000e050400030f0200120505000e05012001050120010505000805024c0105024c0505050012050300" + }, + { + "filename": "head-mug", + "data": "0x00031b140209000680020001800e0003800400018003000280010001800900018002000380030003800e000280010001802a001602030001020170014c1102014c010201000102014c01020170014c1102014c0302010001020170024c1002014c0202020001020170024c1002014c0202020001020170024c1002014c0302010001020170024c1002014c010201000102014c01020170024c120202000102014c01020170014c1102050001020170014c1102060001020170014c040204380402014c0202080001020170014c040202380402014c02020a0001020170024c0602024c02020400" + }, + { + "filename": "head-mushroom", + "data": "0x00021c1504080008560d000856025204560800035601520456025204560252025605000856045205560152025603000a5602520a560200035602520c56035202560100035604520656025202560552035601520256025203560152035602520256055203560152105603521b56010016560400125608000eaf0a000eaf0a000eaf0a000eaf0a000eaf0a0002af045608af0a0002af01560224015608af0c0004560d00" + }, + { + "filename": "head-mustard", + "data": "0x0002181408070002270e0002270d0004270c0004270b00068b0a00062406000227028b0227028b0227028b022702000e2401008247038b0247038b0a47048b1847" + }, + { + "filename": "head-nigiri", + "data": "0x00051c1404040002ce01cd03ce01cd03ce01cd03ce01cd01ce060001cd03ce01cd03ce01cd03ce01cd03ce01cd03ce020002ce01cd04ce01cd03ce01cd03ce01cd03ce01cd07ce01cd03ce01cd03ce01cd03ce01cd03ce01cd07ce01cd03ce01cd03ce01cd03ce01cd03ce01cd07ce120203ce0100160202001602030014020300160202001602030014020300160202000a0203cf090203001402050012020300" + }, + { + "filename": "head-noodles", + "data": "0x00021e1402100001371b0001370500013714000137040002370b0001d0010001d0010001d005000137020002370c0001d0015d01d0015d01d0015d01d002000299038903170a0001d0015d01d0025d0317039906890217080001d0015d01d0025d0217041a038903c2028901170299060001d0015d01d0015d0217061a018901c2034701c201890117039903001c0c01001a0c02001a8a0300188a0400180c0500168a0600160c0700140c0900070c078a040c0b00100c0e000c0c0800" + }, + { + "filename": "head-onion", + "data": "0x00041a14060a00019d1100019d0100019d0100019d1000039d10000138039d01380900029d0138039d0138039d0138039d0138019d0300039d0138039d0138039d0138039d0138029d0100049d0138039d0138039d0138039d0138079d0138039d0138039d0138039d0138079d0138039d0138039d0138039d0138079d0138039d0138039d0138039d0138079d0138039d0138039d0138039d0138079d0138039d0138039d0138039d0138079d0138039d0138039d0138039d0138079d01c8019d0124019d0138039d0138029d01c80138039d0100039d0138029d0424019d0138039d0138029d0300029d0138039d0138039d0138039d0138019d0500019d0138039d0138039d0138039d01380300" + }, + { + "filename": "head-orangutan", + "data": "0x0002181406070001250e000b2506000b2507000c2504000e2503000625070f042503000425070f0425030002250c0f0125030002250c0f0125030002250c0f0125030002250c0f0125030002250c0f01250300100f0200040f0a08020f0200030f0c08010f0200030f010801250208010f0108010f030801250108010f0200030f01250a080125010f0200030f01250a240125010f0200030f0c25010f" + }, + { + "filename": "head-orca", + "data": "0x00021b14010d00010e1900020e1800030e1700040e1600050e1500060e12000b0e0d000e0e0b00100e0300030e0300110e0400030e0100130e0300170e0400160e0300180e0200030e0100140e0100030e0200130e0100030e0400080e090c0a00060e090c0c00040e090c0400" + }, + { + "filename": "head-otter", + "data": "0x000918140704000b8704000e8703000f8702000f8702000f870100328702000287048006240380020001d104870180062401800287020002d1038004d1012403d10280020008d1012401d1012404d1" + }, + { + "filename": "head-outlet", + "data": "0x0004181608245208a4075202a4012404a4012402a4065202a4012404a4012402a4065201a4037d02a4037d01a4065204a4022404a4065204a4022404a4075208a4185208a4075202a4012404a4012402a4065202a4012404a4012402a4065201a4037d02a4037d01a4065204a4022404a4065204a4022404a4075208a42452" + }, + { + "filename": "head-owl", + "data": "0x000218140507000ad2080001d20ad301d2060001d201d304d402d304d401d301d2050001d201d30ad401d301d2050001d201d301d402d501d302d401d302d501d401d301d2050001d201d303d401d302d401d303d401d301d2050001d201d304d402d304d401d301d2050002d201d308d402d301d20400042c01d308d401d301d20300062c08d401d301d20300062c01d207d401d301d20200072c01d207d401d301d20200072c01d207d401d301d20200072c01d207d401d301d20200062c02d207d401d20300052c03d206d401d20400032c04d206d401d2040001d2012c07d206d403000bd207d40100" + }, + { + "filename": "head-oyster", + "data": "0x00021d14040a00058211000482038304820e000182098301820c000382098303820a00018205830399058301820700048202830999028304820400018205830999058301820400018202830f990283018202000382018311990183048203831199038302820283139902830282048306990352079903830182010002820383049905520499038302820400028201830399075203990183028208000182019902560752025601990182090001820f5601820700048203560582035604820600018202d6058203d6058202d60182070011d60400" + }, + { + "filename": "head-paintbrush", + "data": "0x00091c18020700036e0573097602250600046e027301b10273097602250600046e0573087603250100096e0573087603250a6e0573087603250a6e0573087603250a6e0573077604250a6e0573077604250100096e0573077604250600046e0573077604250600036e0225017301b10273067605250700036e05730676052516000125010002251800022518000125190001250100" + }, + { + "filename": "head-panda", + "data": "0x000519140601000424090004240100062407000c24090209240b0207240d020224010002240e02012403001002030010020300100203001002030010020300100203000a020424020203000a02042402020300070206240302030010020100" + }, + { + "filename": "head-paperclip", + "data": "0x00091d14031bd7180002d7180002d7180002d7030010d7050002d7030001d7140002d7030001d7140002d7030001d7140002d7030001d7140002d7030017d7190014d70600" + }, + { + "filename": "head-peanut", + "data": "0x00041b1605040005d80f0002d8036104d80c0002d8016103c9036102d80b0002d8016101c902d8016102c9016101d80a0002d8026103d8016102d8016102d8090001d8016102c9036101d8046102d8080001d8016102d8016103d8016101d802c9016105d8040001d801610bd8016106d8020002d8016112d8020001d8016110d8016101d8020002d8016112d8020002d801610dd8026102d803000fd802c9016101d8040005d8036105d8016102d8016101d8050002d8016102d802c9056101d8026102d8060002d8026102d8016104c9016102c901d8090002d8036104d8016103d80b0003d8046103d80f0005d80400" + }, + { + "filename": "head-pencil-tip", + "data": "0x0003171409060002240c0002240b0004240a000424090006240800022401580324070002240358032406000758012405000a5804000a5803000c5802000c5801001e58042705580327015806270358072708381127" + }, + { + "filename": "head-peyote", + "data": "0x00021e14030a0001d9020001da020001d9140001d901db010001da010001db01d9120001d9020001db01dc01da01dc01db020001d9110002db05dc02db0e0001d9010002aa01dd02aa03dd02aa01dd02aa010001d9090002d902aa01dd04aa01dd04aa01dd02aa02d9090002aa01dd02aa02d901aa01dd01aa02d902aa01dd02aa090002aa01dd02aa02d902aa01dd02aa02d902aa01dd02aa070002aa01dd0faa01dd02aa050017aa020001d9010017aa010001d9010001d917aa01d9010002d917aa02d9010001d917aa01d9010001d9010017aa010001d9020002aa01da11aa01da02aa050001aa13da01aa060015aa080011aa0500" + }, + { + "filename": "head-piano", + "data": "0x00041b15080400050f0c00020f0105015a0105040f0900020f0105080f08000b0f07000d0f06000d0f06000e0f05000e0f05000f0f0400110f02004d0f015a070f015a050f015a040f015a010f015a010f015a010f015a010f015a010f015a010f015a010f015a010f015a020f115a140f" + }, + { + "filename": "head-pickle", + "data": "0x00031b150504000410100008100d00031001c006100c000310015d031001c002100b00021001c00610015d02100a000210015d031001c0071008000610015d041001c0015d05100400011001c0121002000110015d13100100151001001610010015100100131001c001100100021001c01010015d011002000110015d121002000b10012402c0015d04100400031001c0015d011001c00410025d051006000510015d091009000b100400" + }, + { + "filename": "head-pie", + "data": "0x00011c14040b0002cc100002cc030002cc050002cc0b0002cc030002cc030002cc0b0002cc030002cc050002cc0b0002cc080002cc0b0002cc04000209040002cc0b0002cc02000209011a0109020002cc0f0001de040901de0e0002de010903de020903de010902de080012de050001de010910de010901de030016de020001de04bb01de04bb01de04bb01de04bb01de01bb010033bb029603bb0197019603bb0196019703bb029605bb01960197029601970296019302960197029601970296019702960197029601bb010001960197029601970296099301970296019702960300019702960197029601930296019702960197029601970296019701960400019702960197029601970296019702960197029601970296019701960200" + }, + { + "filename": "head-piggybank", + "data": "0x00041d14030b0003431600014303940143050002770b00036d012603940126026d02000177016d017709000277026d017705130177026d0177026d017708000177106d0177050001770100036d01020f6d0177030001770200146d0177020001770100136d0113016d047701000177166d017701000277166d017702000177146d037702000277156d017703000177146d017704000377106d0277060013770800067701130202011306770c000c770700" + }, + { + "filename": "head-pill", + "data": "0x00061d140305000925071e08000c25081e0500062501020725081e0300032502020a25091e0200032502020b25081e01001125091e1125091e1125091e1125091e1125091e01001025061e0110011e02000f25071e0110011e03000a2503240125061e0110011e05000c25081e08000925071e0500" + }, + { + "filename": "head-pillow", + "data": "0x000319160702df0e0002e00ddf05e0010002df0ee0020003df0de0020003df08e003df02e0020003df0de0020003df02e002df09e0020003df0de0020003df0de0020003df0de0020003df0de0020003df0de0020003df0de0020003df0de0020003df0de0020003df05e004df04e0020003df0de0020002df0ee001000ddf05e002df0e0002e0" + }, + { + "filename": "head-pineapple", + "data": "0x000319140706000110010002e1010001100a0001e10100021002e10210010001e1080003e1011002e1011003e10a0006e10a00022902270229022702290600022902270229022702290227022904000229022702290227022902270229030001290227022902270229022702290227012902000129022702290227022902270229022701290200012702290227022902270229022702290127020001270229022702290227022902270229012702001127010010270200102701001227010002270343012704430127034302270200022703430127044301270343022703000e270200" + }, + { + "filename": "head-pipe", + "data": "0x00061c150509170e0009990e0009990f00030804991000030804991000030804991000030804991000030804990c0003170100030804990c170399010003081399010003081399010004081299010006080124010201240102012408080399020015080300140814000308" + }, + { + "filename": "head-pirateship", + "data": "0x00011f14030c0002241b00019913000199030008240f00022404000824020002240b00019905000124015201240252012401520124020001990900025601990500032402520324010003560800035605000424015203240200035607000456030002240152042401520124010003560700065601000924030001990b00019907000199070001990b000199070001990700019906000d2701990700019906000c98012701990700019906000198022409980127089801990100052701980224099801270199010001980100019801000198010001990127049801000c980a2703980500049801241098080002980324019801240198012401980124019801240198012404980a00029801240e980c000f980800" + }, + { + "filename": "head-pizza", + "data": "0x000319140708000238100002380f000138022901380e000138022901380d000138042901380c00013801290238012901380b00013802290238022901380a0001380629013809000138082901380800013808290138070001380a290138060001380a290138050001380c290138040001380c290138030001380329033808290138020001380129013801290338052902380129013801000138082903240529023810290138" + }, + { + "filename": "head-plane", + "data": "0x00041e14030d000202180005021300090210000b020e000c0246000bc810000bc810000bc810000cc80f000cc8090002c8040012c80200010202c8040005c8060207c8020001020ac8090205c8010001c801020925020206240202052502000102010007c80b0205c802000102" + }, + { + "filename": "head-pop", + "data": "0x000318140802000ca30300061505290315010005150129031504290315022902150129011501290315042904150129021501290415052903150129081504290115022905150129031504290b1505290b1504290b1505290b1504290b1504290b1504290a150529091504290b1503290315012901240202012401290215010002290c1503000ca30200" + }, + { + "filename": "head-porkbao", + "data": "0x00051914070500025801000258010002580a0002580184025801840258090002580184025801840258018401580800015801840258018402580184025806000e5804000e5803001058020010580200105801005158037e1858010010580100" + }, + { + "filename": "head-potato", + "data": "0x00061d15040f0001c91600077b1000037b01c9077b0b000b7b02c9027b07000f7b01c9027b0400167b0200177b0100187b0100187b0100187b01c9187b0100107b02c9057b0300097b01240102012401020124017b02c9057b0400057b02c90d7b0600047b02c90b7b0b000a7b0900" + }, + { + "filename": "head-pufferfish", + "data": "0x00041c160509000169020001691000016901000669010001690700034a03000569014a04690700054a0269034a07690600044a0369034a0369024a03690500034a0469034a0369024a04690400034a10690600126905001269050012690300054a0d69064a046901940b6901940469064a029409690294064a0a69044a0769064a02940469014a0236014a02690194054a030006940269044a0169039408000e940a000c940d0008940800" + }, + { + "filename": "head-pumpkin", + "data": "0x00051b1406080003b001c501b0100003b001c501b0100003b001c501b00b00072501b0072506000725014907250300022501490725014907250149042501490725014907250149042501490725014907250149042501490725014907250149042501490725014907250149042501490725014907250149042501490725014907250149042501490725014907250149042501490586016e0386016e058601490425014907250149072501490425014907250149072501490225" + }, + { + "filename": "head-pyramid", + "data": "0x00031e14030800018701b11900028701b11700038702b11600038703b11400058703b11300058704b1110002870285028701b1028702b11000078705b10e00088706b10d00088707b10b000a8707b10a000a8708b108000b8709b107000c8706b1028701b105000d870ab104000187038501870185078707b1038701b102000987032403870bb101000f870cb1" + }, + { + "filename": "head-queencrown", + "data": "0x00021b14050a00025c1300015c01190142015c1200015c01420119015c0e00035c0200025c0200035c0900015c0300015c0100025c0100015c0300015c0500035c0500045c0500035c0100015c0200015c03000242015c018c0155015c02420300015c0200025c0200015c01000442015c0255015c04420100015c0200025c01000142015c0542015c0155018c015c0542015c01420100015c0100015c0142015c0542045c0542015c0142015c0200015c0142015c0642025c0642015c0142015c0200015c0242015c0442045c0442015c0242015c0300015c0242015c0342015c028b015c0342015c0242015c0400015c0242015c0342015c028b015c0342015c0242015c0300025c0142035c0242015c028b015c0242035c0142025c0300125c050010360500055c0842055c0400125c0200" + }, + { + "filename": "head-rabbit", + "data": "0x0004171509037308000673080006730800067308000673080065731e050b2404050202040502021f05" + }, + { + "filename": "head-rainbow", + "data": "0x00041a140608000c1907000d19060003190b15050004190b150400021903150b470300031903150b4702000119031503470b1001000219031503470b10031903150347031008550319031503470310085503190315034703100355051303190315034703100355051303190315034703100355031302000319031503470310035503130200031903150347031003240313020003190315034703100355031302000319031503470310035503130200" + }, + { + "filename": "head-rangefinder", + "data": "0x00061b1405020002050100020501000d7302050b7303050173020f0102010f01730205027301050373020d037303050173040f017302050173020511730105010f010d0205110d020f140d020f140d020f140d020f140d020f140d020f140d020f120d0205020f080d0505050d0205020f140d010f010514730105" + }, + { + "filename": "head-raven", + "data": "0x00041e14080100080f1100070f0c000c0f0b000c0f09000e0f08000e0f08000f0f0600100f0600100f0600100f0600100f0600090f070e0600080f0c0e0200070f0f0e070f0f0e070f0d0e0200080f090e0500" + }, + { + "filename": "head-retainer", + "data": "0x00091d15050400032115000121011a062110000321011a06210d000521011a0221011a04210b000921011a062108000221011a0321011a0621011a032106000221021a0321011a0321021a0121031a0121060002210f1a022104000221111a012104000121031a04a4011a04a4011a04a4011a022102a40221021a012101a40121011a01a4011a01a4021a01a4011a01a4011a012101a40321010001a4052101a4022103a4022103a4022106a4030003a41200" + }, + { + "filename": "head-rgb", + "data": "0x00011c16040900066510000a650d000c650b000e650a000e65090010650800016506290265066a01650700016607290202076a015b0500026606290402066a025b0300036605290602056a035b0200036605290602056a035b0100056603290802036a055b056603290802036a055b066602290802026a065b076601290802016a075b086601e2060201e2085b086608e2085b0100086606e2085b0200086606e2085b0300086604e2085b0500086602e2085b080006660200065b0500" + }, + { + "filename": "head-ring", + "data": "0x00021a1506060008500c00025001020250016d02500d000350016d02500c00032b0450032b0800022b021f022b0250022b021f022b0500012b021f0a2b021f012b0300052b011f0700052b0200032b011f0b00032b0100032b021f0c00042b0102012b011f0d00062b011f0d00062b011f0d00062b011f0d00012b0102042b011f0d00012b0102042b011f0d00032b0100032b021f0a00032b0200052b081f052b0300102b05000e2b08000a2b0500" + }, + { + "filename": "head-road", + "data": "0x00061c1403020017e3020017e3020017d4020017e3020017e3010017e3020017e3020017e3020017e3020017e3010018e3010017e4020017e3020001e303e403e303e403e303e403e303e401e3020017e30200" + }, + { + "filename": "head-robot", + "data": "0x00031c140405000e200a000e200800120506000105012002050120020501200205012002050120020501200105060012050600120506000105102001050400010501001205040001050100120501000105010003201205010001050100010f02201205062012050220020f02201205062012050220010f03000105010f025a010f025a010f025a010f025a010f025a010f0105032003000105010f020c010f020c010f020c010f020c010f020c010f010506000105100f0105060012050300" + }, + { + "filename": "head-rock", + "data": "0x00031b14050b00030d1200010d0320020d0f00010d0120010d0420020d0c00020d0220010d0520020d0500050d0520010d0620010d0300010d1220010d0100010d0520040d0a20010d0100010d0920010d0920010d0100010d0220010d1020010d0100010d0720020d0120070d0220010d0100010d0520020d0c20020d1420020d0420010d0e20030d0420010d0820020d0120030d0300010d0420010d0420030d0220010d0220010d0400010d0520030d0420010d0220010d0600050d0420030d0320010d0700010d0c20010d0400" + }, + { + "filename": "head-rosebud", + "data": "0x00021c14040c0001951500011a010002951300021a04951000041a06950d00041a08950b00051a09950900061a0a950800051a0b950700061a0395011e08950600061a0395011e08950300011e0200061a0295021e08950200011e0100011e0100071a0195021e08950100011e0200041e051a0195021e0695041e0300051e031a0195021e0495051e0500051e021a041e0295051e0700041e011a011e0124021e0124011e0195041e0900031e011a021e0224021e0195031e0b000c1e0c000c1e0600" + }, + { + "filename": "head-ruler-triangular", + "data": "0x00021c1508019b1300019b01501200029b01501100019b03501000019b04500f00029b04500e00019b06500d00019b07500c00029b07500b00019b09500a00019b0350010006500900029b0250020006500800019b0350030006500700019b0350040006500600029b0250050006500500019b0350060006500400019b10500300029b0950049b03500200019b0a50049b04500100019b1350" + }, + { + "filename": "head-saguaro", + "data": "0x00031c14040c00047a1400057a0a00047a0500057a0a00047a0200027a0100057a0a00047a0200027a0100057a0700027a0100047a0200027a0100057a0700027a0100047a0200017a02b0057a0200027a0100027a0100017a01b0047a0500057a0200027a0100027a0300047a0500057a0100037a0100027a0400037a0500047a0200037a01b0017a0100027a0200047a0200017a0100047a0200037a0300027a0200047a0200017a0100047a0200027a0400027a0200047a0200017a01b0047a0200027a0400037a0100047a030001b0047a0100037a0500027a01b0047a04b0047a0100037a0600017a01b0077a02b0037a0100027a0900027a0324037a01b0037a01b0027a0a00077a01b0037a01b0027a0500" + }, + { + "filename": "head-sailboat", + "data": "0x00011c14040d0001021600020201000102130003020100010212000402010002021000020202df0102010002020f00030202df0102010003020d000702010003020c000802010004020a0009020100040209000a020100050207000b020100050206000c020100060204000d020100060203000e02010007021a00188401000184149901840300018401991084019901840500018410990184070010840400" + }, + { + "filename": "head-sandwich", + "data": "0x00041d14030d000189180003e1170002e1011b170003e1100008840189078408000784017e028401890484017e048405000284017e088401890184017e088403000884017e0a84017e048402001884020018e5020018560200016e0656016e0856016e07560100011d186e041d066e081d056e041d0100041d0299051d0399051d0299011d0100011d0400069908240699070012990400" + }, + { + "filename": "head-saturn", + "data": "0x00051c16030b0004e6130008e60f000ce60200023b030005520ee60100023b0200015205000ee605000152040002150de6011504000152040003150ce60115050001520200025603150be602150500015201000256041509e60315060001520356061505e604150700015202560f150800015204560b150152020001e6050001560252055606150256010001520800025602520a5603000152040002e60100045603520756040001520200013b02e60200065603520356050001520200023b050007560352050001520b000456040005520100" + }, + { + "filename": "head-saw", + "data": "0x00091e15020c9810a301000b9810a3020003980100069810a3020002980300059810a3020002980300059810a3020002980300059810a3020002980300059810a302000298030005980ea3010001a302000298030005980ca3010001a30400039801000298012702980ba3010001a30500099803a3025205a3010001a30600099802a3025205a3010001a3100008a30c00" + }, + { + "filename": "head-scorpion", + "data": "0x00031e1403060008e7130008e7130008e7100004e7050003e70f0004e7020003e803e70f0004e7020001e8010002e802e70d0003e7070003e80e0003e7180003e7170003e7180003e7180003e7180003e703000de8080003e7020010e80300039f05e710e803e7019f030004e702e802e902e802e902e802e901e807e7030004e704e802e902e802e904e806e708000ee8010003e7039f" + }, + { + "filename": "head-shark", + "data": "0x00031c14030a0004ec160005ec150005ec140005ec080001ec0b0006ec080001ec08000b44050002ec05000e44040003ec02001144040003ec01001244030004ec1344030003ec1344030003ec104401ec0144040003ec104401ec0144030003ec01001144040002ec02001144040001ec0300034401ec014401ec0244023d0102013d0102013d0102013d040001ec0400024401ec014401ec0244023d0102013d0102013d0102023d09000644093d0400" + }, + { + "filename": "head-shower", + "data": "0x00011c19040b00020e1600020e1300080e0e000c0e0b000e0e0900102008000820010c0120030c03200800102009000e440a000e440900104408001044080010440700124406001244060012440500144404001444040014440300164402000144010001441000014401000144020004440e0004440100014401000144010001440e0001440100014401000144190001440100014410000144010001440100" + }, + { + "filename": "head-skateboard", + "data": "0x00091e1402030016c0040003c0016b036a016b0ac0016b036a016b03c0020001c0011c01c0016b036a016b0ac0016b036a016b01c0011c01c0010002c0011c01c0016b036a016b0ac0016b036a016b01c0011c04c0011c03c0017d0ec0017d03c0011c04c0011c03c0017d0ec0017d03c0011c04c0011c03c0017d0ec0017d03c0011c04c0011c03c0017d0ec0017d03c0011c04c0011c01c0016b036a016b0ac0016b036a016b01c0011c02c0010001c0011c01c0016b036a016b05c0030f02c0016b036a016b01c0011c01c0020003c0016b036a016b0ac0016b036a016b03c0040016c00300" + }, + { + "filename": "head-skeleton-hat", + "data": "0x000519150704000a44050010440200104401002444010010af020010af020010af020010af020010af020010af020010af020007af01b101af01b106af04000caf060002af01b101af016e01af01b101af01b101af01b101af060003af01b101af01b101af01b101af01b101af01b107000baf0300" + }, + { + "filename": "head-skilift", + "data": "0x00011e1403010001240100142401000124010001240800012401000124100001240200152401000124070001241a0001241a0002241900042418000b240c001489060001890a78018909780189050001890a7801890778016701780189050001890a7801890778016701780189050001890a7801890778016701780189050001890a780189097801890500163405001689050016340500063406240a3405001634070012340500" + }, + { + "filename": "head-smile", + "data": "0x00051d140306000425060004250a00082502000825040001250200142502000825020208250202082501021625010202250402102504020325160205251402032501000325120203250200042510020425030004250e020425040006250a0206250500142507000a2502020625090010250c000c250700" + }, + { + "filename": "head-snowglobe", + "data": "0x00051914080600048d0a00038d0152038d0152038d0400018d0152058d0152068d01520200048d0152018d0352028d0152038d0100038d0152018d0198025201980252038d0152028d0152048d025203980252098d025205980252038d0152038d0252039801270198012701980252078d0998088d04980127019801270298088d09980152068d015209980252028d1152010004520412075202000f0802000f080100" + }, + { + "filename": "head-snowmobile", + "data": "0x00071e15050c0001041800010414000305010002041600010502041600010502041600012401040227140003240427080003240600032402270156052705000c24012703560104052703000b24022702560804020002240902022702560804020005020124110202000602032401020b05030001040a020a05030001040200012401050124010501240105012401000e040200" + }, + { + "filename": "head-spaghetti", + "data": "0x00041a1c060c0003850a00038503000185038601850800038501860485028601d0028506000185028601d0018504860285048605000486018504860185058605000f860500015603860256028601d002560386015604001056040010560300037e0c56027e0300127e0100297e0202017e0102017e0702017e0302017e0102027e0402017e0702017e0302017e0102027e0c02017e0502027e010010020100027e0100017e0e00017e0100027e0100017e0e00017e0100027e0100017e0e00017e0100027e0100017e0e00017e0100027e0100017e0e00017e0100017e0200017e0e00017e0400017e0e00017e0400017e0e00017e0200" + }, + { + "filename": "head-sponge", + "data": "0x00041914080100032a0200022a0200042a0300012a0223032a0123092a0100012a0223092a0323022a0100072a0223022a0323022a0100032a0223022a0223022a0323022a0100032a02230a2a0100102a0100102a0100542a0100012a02230d2a0100012a0223032a0524042a03000d2a0123012a02000e2a0200" + }, + { + "filename": "head-squid", + "data": "0x00011c1a020d00026b1700046b1500036b01ed026b1300056b01ed026b1100076b01ed026b0f000c6b0d000e6b0b0001500e6b0150090002500e6b025007000250106b025005000350106b035003000450106b015001ed025002000450106b025001ed015002000450106b045002000450106b045003000350106b035002000150020003500e6b035002000150016b015003000246015001240102012401020124010201240102012401020150024604000150016b0150020003460c50034603000150016b01500100144603000150014601000146010002460100024606000246010002460100024603000346010001460200014608000146020001460200014604000146130001500146180001500146180001500146180001500200" + }, + { + "filename": "head-stapler", + "data": "0x00081c140407000d2508001225040016250100172501001725010017250100172505191273010006191173010004190125021911000519122501003019" + }, + { + "filename": "head-star-sparkles", + "data": "0x00021b17050a0002ad1000012a020001ad022a01ad120001ad022a01ad110001ad042a01ad0300012a0100012a0500012a040001ad042a01ad0400012a0500032a020001ad062a01ad0200012a0100012a0500012a030001ad062a01ad0c0002ad082a02ad080002ad0c2a02ad040002ad102a02ad010001ad142a02ad142a01ad010002ad102a02ad040002ad0c2a02ad080001ad0a2a01ad0a0001ad0a2a01ad0600012a020001ad072a03ad022a01ad080001ad0c2a01ad070001ad062a02ad062a01ad060001ad042a02ad020002ad042a01ad060001ad022a02ad060002ad022a01ad070002ad0a0002ad0400" + }, + { + "filename": "head-steak", + "data": "0x00071b160504000e52060002520619033905190252030001520919013908190152020001520919013908190152010001520a190139091902520a190139091902520a190139091902520a190139091902520a190139091902520139091901390919035202390519033901190352051901520100035208390119015201390152041902520200085202390119035204190152050007520239051903520b000a520d0007520400" + }, + { + "filename": "head-sunset", + "data": "0x00031d14030900084a1000044a0143024a0143044a0c00054a0143014a0243014a0143054a0900014a0143014a0c43014a0143014a0700014a0143014a0443012701430227014301270443014a0143014a0500014a0143014a03430a270343014a0143014a0400024a034303270129012702290127012903270343024a0300024a03430327082903270343024a0200024a024303270a2903270243024a0100034a024302270c2902270243054a024302270e2902270243034a0143014a024302270d2901270243014a0143034a024302270e2902270243044a024302270e2902270243034a0143014a024302270c2902270243014a0143034a02430227062902020127052902270243054a024302270c2902270243034a0100034a024302270a2902270243034a0100" + }, + { + "filename": "head-taco-classic", + "data": "0x00051d14030a00038f0168028f1200038f0168018f0168048f0e00038f0168018f015801680158018f0168028f0168018f0b00018f0268018f0368011202580368038f0a00028f026808510158038f0800018f0168018f015802120151018b0351018b025102120268028f0600028f01680651018b0751038f0600018f01120d51018b02510168018f0500018f015801120151018b0e5101120158018f03000168018f1451018f040001680451018b0c51018b0251026803000112145101120200016801000351018b0d51018b0151018b0251030001681651016803000551018b0551018b0751018b0251010001680300145101680200" + }, + { + "filename": "head-taxi", + "data": "0x00041c170405000ee60a0001e603c8040205c801e6090001e603c8040207c801e6080001e602c8040208c801e6070001e602c8040204c8034403c801e6060001e601c8040204c8014403c8014402c801e6040016e6020016e6020016e6020016e6020016e6020016e6020016e6020002e6012010e6012002e6010001200138142001380a20061e0920010008e6061e08e60300020f0500061e0500020f0400020e1000020e0400020e1000020e0200" + }, + { + "filename": "head-thumbsup", + "data": "0x00011a14050a00012c02e6120001e6012c02e6110001e6012c02e61100012c03e6100005e60f0006e60e0006e60e0006e6012c07e6040008e6012c07e6012c0ce6012c07e6012c0ee6012c06e6012c0de6072c01000ae6012c14e6012c08e6012c0be6012c09e6012c0ce6082c010001e6022c05e6012c02e6012c08e6010008e6042c06e6012c01e6040004e6012c03e6012c07e6012c050008e6072c0200" + }, + { + "filename": "head-toaster", + "data": "0x00031a1f0504000e85060002850cd802850500018503d8089a03d80185060001850cd801850700018502d8089a02d801850600010c0e73010c0500010c0e73010c0500010c0e73010c020e0300010c0e73010c020e0300010c0e73010c0500010c0e73010c0500010c0e73010c0500010c0e73010c0500010c0e73010c0500010c0e73010c0400120e01000220120e010001200100120e01000120140001201400012014000120140001201400012014000120140001201400012014000120140001201400" + }, + { + "filename": "head-toiletpaper-full", + "data": "0x00071a16050100020a11020200020a11020100040a1102040a1102040a1102010a017d010e010a1102010a017d010e010a1102010a017d010e010a1102010a017d010e010a1102040a1102040a1102040a11020100020a027d010a0102010a0102010a0102010a0102010a0102010a0102010a01020300020a017d100205000c020a0008020800" + }, + { + "filename": "head-tooth", + "data": "0x00041917060a0005580700045801000258050202580400015804020158030201580502015802000158060203580702015801000158100202581102025811020258110202581102025811020258110201580100015810020158020001580e020158030001580e020158040001580202097d02020158040001580d020158050001580402035804020158060001580302015803000158030201580700015802020158040001580202015808000258060002580300" + }, + { + "filename": "head-toothbrush-fresh", + "data": "0x00021914011000016816000168011d016815000168021d046811000168061d01680d000668021d0102011d01680a000368081d0102011d0168090001680d1d0168090001680d1d016809000102011d0102011d0102011d0102011d0102011d0102011d0102011d010209000f0209000f0209000f0209000f0209000f0201000144010002440100134402000144020013440100024401000544012401470124014701240a440700114407001144" + }, + { + "filename": "head-tornado", + "data": "0x00031c150406000c8209000282017d0282047f057d038206000282027d0b82017d0382050003820f7d03820300168203000b7d0182017d0782060011820900047d0182017d0182017d05820a000c820b000d820a000b820b000b820c00098210000a8208000182080008820600018205000182010001820100017d049d0282017d0682010001820300018201000482067d08820700128206000482080004820500" + }, + { + "filename": "head-trashcan", + "data": "0x00031b1405090005050f000205040001050f0001050200090505001105050008050724010e0700010e08240a0e020006050324030e0505010e040002050320020503200205032002050100010e0200030503200205032002050320030502000105010002050320020503200205032002050100010503000205032002050320020503200205050002050320020503200205032002050500020503200205032002050320020505000205032002050320020503200205050002050320020503200205032002050500020501200524022002050320020505000205032002050320020503200205050011050300" + }, + { + "filename": "head-turing", + "data": "0x00041d19031500018a07001262018a01620500028a016201cc01830162018301cc01620283016201cc0183016201cc018301620183018a01620400018a01950262028301620283016201cc018301620283016202830162018301cc028a0300018a01951462018a0300018a01000262018301cc016202830162018301cc0162018301cc01620283016202830162018a0300018a0100028a0283016201cc01830162028301620283016201cc0183016201cc01830162018a0200028a01950162018a1262018a01950100038a0162018a018301cc01620283016201cc01830162018301cc016202830162018301cc0162018a0100028a0100018a0162018a0283016201cc018301620283016202830162018301cc016202830162018a0100028a0100018a0162018a1262018a0100028a0100018a0162018a018301cc016202830162028301620283016201cc0183016202830162018a0100028a0100038a02830162018301cc0162018301cc0162018301cc01620283016201cc01830162018a0100028a0100018a1462018a0100028a0100018a02620202016202020162020201620202016202020162020201620200028a0100018a0262020201620202016202020162020201620202016202020162018a0100028a0100018a1462018a0100028a0100018a0195110001950100028a0100018a0200028a1100018a0400018a0100028a1600018a010001951800028a1600" + }, + { + "filename": "head-ufo", + "data": "0x00021e15020e0001501a0003501a0001501800065014000a5010000e440d000a4401060144020602440c000c44020602440b0012440a0012440a001244090014440800144408001444080014500600185003000550026e0150026e0150026e0150026e0150026e0150026e045001000650026e0150026e0150026e0150026e0150026e0150026e0550040014500d000a500900" + }, + { + "filename": "head-undead", + "data": "0x00021b16050600027a03271100047a0200027a0327070001270300027a0300057a08000127017a0200027a0200037a0b000127017a0200027a0200037a0b00027a0200027a0200027a02000181030001270500027a0200037a0100027a0500017a02270400027a0300057a0500047a010001810200027a0200057a0600037a010002810100027a0200057a0700027a04000a7a0400047a0500107a06000f7a0200028105000a7a040002810700087a0a0001810300087a0d000181017a01240126012401260124027a01810300018107000381067a038109000e81090001810100038102000281010001810e000181090001810300" + }, + { + "filename": "head-unicorn", + "data": "0x00041b16040b00021d1200011d0300021d060001270b00021d0100021d04000227080003670100051d020003270600031d0367071d032701670400011d0100031d0767011d042702670500031d01210767042703670600011d02210767032704670600032107670227056705000421076701270667060003210e67060003210e6706000321126001000221023b0e6001210160012101600100043b036001210167012401670124016701240167012106600200033b12600200033b12600300023b1600013b1200" + }, + { + "filename": "head-vent", + "data": "0x00081c1404330201240102012401020124010201240202012401020124010201240102012408020120010201200102012001020120020201200102012001020120010201200802012001020120010201200102012002020120010201200102012001020120010201240602012001020120010201200102012002020120010201200102012001020120010201240402012001020120010201200102012001020120020201200102012001020120010201200102012401020120040201200102012001020120010201200202012001020120010201200102012001020124060201200102012001020120010201200202012001020120010201200102012001020201050201200102012001020120010201200202012001020120010201200102012008020101010201010102010101020101020201010102010101020101010201013502" + }, + { + "filename": "head-void", + "data": "0x00051b14050124020001240200012402000124020001240200012402000124020001242c000124140001242c000124140001242c000124140001242c000124140001242c00012402000124020001240200012402000124020001240200012402000124" + }, + { + "filename": "head-volcano", + "data": "0x00031c15040800082010000120064201200f000220064302200e00012001420629014201200d00022003420320024202200c0002200142042001420220014201200b00022001420b200a000420010d0520010d032009000520010d0520010d042008000520010d0520010d042007000520010d0720010d042006000520010d0720010d042005000620010d0720010d052004000520010d0920010d042003000220020d0f20010d022002000220020d0520010d0c2001000a20010d0342010d0420020d0920010d0220010d0920020d0320020014200200" + }, + { + "filename": "head-volleyball", + "data": "0x00031b1505090004d40f0001d401ee02d4020202d401ee01d40a0003d401ee02d4020202d401ee03d4070001d401ee03d401ee04d401ee03d401ee01d4050003d401ee02d401ee04d401ee02d401ee03d4040004d40aee02d4010201d4030004d401ee0ad401ee04d4020003d401ee0cd401ee01d4010201d4020003d401ee0cd401ee01d4010201d4010004d401ee0cd401ee01d4010206d401ee0cd401ee02d4010205d401ee0cd401ee02d4010205d401ee0cd401ee04d4010003d401ee0cd401ee04d4010003d401ee0cd401ee03d4020001d4010202d401ee0ad401ee04d4030001d4010202d40aee04d4040003d401ee02d401ee04d401ee02d401ee03d4050001d401ee03d401ee04d401ee03d401ee01d40300" + }, + { + "filename": "head-wall", + "data": "0x00031a15060238041b01840238011b01380f1b0184131b0184131b01840d1b0100128401000238011b0138091b01840238111b0184131b0184131b0184061b0100128401000238041b01840138121b0184131b0184131b01840d1b0100128401000238011b0138091b018402380b1b0338031b0184131b0184131b0184061b" + }, + { + "filename": "head-wallet", + "data": "0x00081d1403020008a40e8d0200029801a408520ec80298012401a408520ec80e9801080d980ba40198010801980a44029801a4057d05a4019801080d9801a4017d03a4017d05a40198010801980a27029801a4017d03a4017d05a4019801080d9801a4027d01a4027d05a40198010801980a99029801a4017d03a4017d05a40198010801980a99029801a4057d01a4034801a4019801080d980ba401980108199801080c98" + }, + { + "filename": "head-wallsafe", + "data": "0x00091d14041a08117f010805250208017f0f08017f010805250208017f0f08017f0808017f0f08017f0108012501080125010801250208017f0f08017f0808017f0f08017f0108012501080125010801250208017f010801a40d08017f0808017f01a4010801a40c08017f0108012501080125010801250208017f010801a40208010201240102012401020124010201240308017f0808117f010801a401080125010801a41a08" + }, + { + "filename": "head-washingmachine", + "data": "0x0003191f0402000f0a0600020a0173010a0173010a0175010a0173010a0152010a01560175020a0500020a0175010a0175010a0173010a0175030a01440175020a0500037310520200037306520473065202000373045202730476027304520200037303520173087601730352020003730352017308760173035202000373025201730a760173025202000373025201730a760173025202000373025201730a760173025202000373025201730a76017302520200037303520173087601730352020003730352017308760173035202000373045202730476027304520224037301520244035204730652012401000373105201240100037310520124140001241400012414000124140001241400012414000124140001241400012414000124140001241400" + }, + { + "filename": "head-watch", + "data": "0x00041a150802000c0b05000827011f0127021f0227030001270e52012702000127065202790652012702000127035201790652017903520127020001270e52012702000127015201790a52017901520127020001270e5201270100010b01270e520127010b02270e520127020b01270e520127010b02270e5201270100010b0127045201790452017904520127020001270e520127020001270652027906520127020001270e52012703000e2705000c0b0400" + }, + { + "filename": "head-watermelon", + "data": "0x00031b15050400051e1000051e02250e00051e0125011902250d00041e0225012403250b00041e08250a00031e06250124011902250800041e02250124011907250700031e0d250600031e0e250500031e0f250400031e10250300031e11250300021e12250200031e1125011e0200021e1025011e0400021e042501240119012401190625011e0600031e0a25021e0800041e0625021e0d00071e0700" + }, + { + "filename": "head-wave", + "data": "0x00021c1401120004df13000adf0f0002df014b0adf0d0005df024b0244014b02df014b02df0b0002df024b01df024b0144054b02df014b01df090002df024b01df024b01df034b01df0144024b03df090001df034b01df024b01df024b01df064b01df080002df024b01df024b01df034b01df024b0300014b01df080001df034b01df024b01df054b040001df080001df0d4b0d0001df0d4b0c0002df0d4b0c0001df0e4b0b0001df0f4b0b0001df0f4b0a0001df074b0144024b0144034b0144014b0a0001df044b01df024b0144034b0144034b0144014b050001df020001df044b01df044b0144034b0244054b040002df164b0100014b" + }, + { + "filename": "head-weed", + "data": "0x00011d15020d0001101900021019000210010001101600041010000110060004100700011008000210060003100100011004000210080003100100011002000510040003100900041002000610010004100a00051002000410010005100b00051001000410010004100600011006000d1006000110010002100100011003000b10050002100200041002001310030017100600131009000f1010000310015d0310015d011011000510035d03100e000f100b001110090002100f0002100400" + }, + { + "filename": "head-weight", + "data": "0x00021a140506000128089701960b0001280197072801960b0001280197060001280196070003280d970196040003280397010f0197010f0197020f04970196040003280397020f0297010f05970196040003280397010f0197010f0197010f0197010f03970196040003280397010f0197010f0297020f03970196030003280f970196020003280f970196020003280f970196020003280f970196020003280f970196020003280f970196010003281197019603281197019603280497092804970196032811970196032811970196" + }, + { + "filename": "head-werewolf", + "data": "0x00061c1404030005980700059807000598070005980700059807000598070011270700110707001127070002980e820198070002980e820198060003980e820198050004980e820198040005981182029803000298018201d6018201d60f8202000398018201d6018201d6018204240102012401020324038202000498018201d6018201d602240102062401020224018202000598018201d6018201d60c830300" + }, + { + "filename": "head-whale-alive", + "data": "0x00021e15021100044b1700064b1500084b13000a4b1100064b010f054b0300014b0400014b0600064b010f014b010f054b0200024b0200024b05000f4b01570100064b05000f4b01570200044b07000d4b03570200034b07000c4b04570200054b05000b4b055702000157134b065703000157114b0757030003570e4b0757050005570a4b085705000657084b085707000557014b030f034b085709000357074b08570b000157064b0857100009570900" + }, + { + "filename": "head-whale", + "data": "0x00041a1606080009d60a000cd6070005d6080e060005d6010e097d040005d6010e037d0282017d0282017d0182030005d6010e017d0282017d0282017d0282017d0182020005d6010e0482017d0282017d0282017d0182010005d6010e0582017d0282017d0282017d018206d6010e0582017d0282017d0282017d018206d6010e0582017d0282017d0282017d018206d6010e0582017d0282017d0282017d018206d6010e0482017d0382017d0282017d018206d6010e0382017d0382017d0382017d018203d6010e02d6010e0282017d0382017d0382017d028202d6030e01d602990182017d0282017d0382017d038203d6010e02d60399017d0282017d0282017d0382010006d60399017d0282017d0282017d028208000399110003990b00" + }, + { + "filename": "head-wine", + "data": "0x00051b14053f700102157001021570010203701295011a019502701495027014950270149502701495027014950370129502700100017012950170020002700695041a06950270030003700c95037006000e700400" + }, + { + "filename": "head-wizardhat", + "data": "0x00041b1404030008ec0e0006ec014704ec0c0001ec020002ec034704ec0b000147030002ec014706ec08000547020004ec014704ec08000347040002ec014701ec014701ec014702ec0700014701000147050002ec014706ec0e000aec0c0008ec014702ec0c0001ec014705ec034702ec0b0008ec014703ec0b0004ec014707ec0a000dec09000eec080007ec050f02ec0700125503001655" + }, + { + "filename": "head-zebra", + "data": "0x00061b14060a00010201240a000224035f0102012401020124010202240100035f05000202035f0102012401020124010201240200035f05000224055f0124035f0124045f05000202065f0324055f05000224065f0324055f05000202075f0124065f05000224075f0124065f05000202075f0124065f050002240e5f050002020c5f0624010002240d5f012401020124010201240302025f0102012401020124010201240102035f09240d5f052403020d5f0524" + } + ], + "glasses": [ + { + "filename": "glasses-hip-rose", + "data": "0x000b1710070300062101000621030001210202022401210100012102020224052102020224032102020224052102020224032102020224022102000121020202240121010001210202022401210300062101000621" + }, + { + "filename": "glasses-square-black-eyes-red", + "data": "0x000b17100703000624010006240300012402020265012401000124020202650524020202650324020202650224020001240202026501240100012402020265022402000124020202650124010001240202026501240300062401000624" + }, + { + "filename": "glasses-square-black-rgb", + "data": "0x000b1710070300062401000624030003240165022401000324016513240200012401660224015b01240100012401660224015b022402000624010006240300062401000624" + }, + { + "filename": "glasses-square-black", + "data": "0x000b171007030006240100062403000124020203240100012402020724020205240202042402000124020203240100012402020424020001240202032401000124020203240300062401000624" + }, + { + "filename": "glasses-square-blue-med-saturated", + "data": "0x000b17100703000644010006440300014402020224014401000144020202240544020202240344020202240244020001440202022401440100014402020224024402000144020202240144010001440202022401440300064401000644" + }, + { + "filename": "glasses-square-blue", + "data": "0x000b17100703000607010006070300010702020224010701000107020202240507020202240307020202240207020001070202022401070100010702020224020702000107020202240107010001070202022401070300060701000607" + }, + { + "filename": "glasses-square-frog-green", + "data": "0x000b171007030006c0010006c0030001c00202022401c0010001c00202022405c00202022403c00202022402c0020001c00202022401c0010001c00202022402c0020001c00202022401c0010001c00202022401c0030006c0010006c0" + }, + { + "filename": "glasses-square-fullblack", + "data": "0x000b1710070300062401000624030004240102012401000424010208240102062401020224020006240100072402000624010006240300062401000624" + }, + { + "filename": "glasses-square-green-blue-multi", + "data": "0x000b171007030006100100068c030001100202022401100100018c02020224048c0110020202240110028c02020224028c020001100202022401100100018c02020224028c020001100202022401100100018c02020224018c030006100100068c" + }, + { + "filename": "glasses-square-grey-light", + "data": "0x000b171007030006c8010006c8030001c80202022401c8010001c80202022405c80202022403c80202022402c8020001c80202022401c8010001c80202022402c8020001c80202022401c8010001c80202022401c8030006c8010006c8" + }, + { + "filename": "glasses-square-guava", + "data": "0x000b17100703000638010006380300013802020224013801000138020202240538020202240338020202240238020001380202022401380100013802020224023802000138020202240138010001380202022401380300063801000638" + }, + { + "filename": "glasses-square-honey", + "data": "0x000b171007030006de010006de030001de0202022401de010001de0202022405de0202022403de0202022402de020001de0202022401de010001de0202022402de020001de0202022401de010001de0202022401de030006de010006de" + }, + { + "filename": "glasses-square-magenta", + "data": "0x000b17100703000609010006090300010902020224010901000109020202240509020202240309020202240209020001090202022401090100010902020224020902000109020202240109010001090202022401090300060901000609" + }, + { + "filename": "glasses-square-orange", + "data": "0x000b17100703000615010006150300011502020224011501000115020202240515020202240315020202240215020001150202022401150100011502020224021502000115020202240115010001150202022401150300061501000615" + }, + { + "filename": "glasses-square-pink-purple-multi", + "data": "0x000b171007030006210100069b030001210202022401210100019b02020224049b0121020202240121029b02020224029b020001210202022401210100019b02020224029b020001210202022401210100019b02020224019b030006210100069b" + }, + { + "filename": "glasses-square-red", + "data": "0x000b17100703000625010006250300012502020224012501000125020202240525020202240325020202240225020001250202022401250100012502020224022502000125020202240125010001250202022401250300062501000625" + }, + { + "filename": "glasses-square-smoke", + "data": "0x000b1710070300065a0100065a0300015a02670224015a0100015a02670224055a02670224035a02670224025a0200015a02670224015a0100015a02670224025a0200015a02670224015a0100015a02670224015a0300065a0100065a" + }, + { + "filename": "glasses-square-teal", + "data": "0x000b1710070300061d0100061d0300011d02020224011d0100011d02020224051d02020224031d02020224021d0200011d02020224011d0100011d02020224021d0200011d02020224011d0100011d02020224011d0300061d0100061d" + }, + { + "filename": "glasses-square-watermelon", + "data": "0x000b171007030006a1010006a1030001a10202022401a1010001a10202022405a10202022403a10202022402a1020001a10202022401a1010001a10202022402a1020001a10202022401a1010001a10202022401a1030006a1010006a1" + }, + { + "filename": "glasses-square-yellow-orange-multi", + "data": "0x000b1710070300062701000614030001270202022401270100011402020224041401270202022401270214020202240214020001270202022401270100011402020224021402000127020202240127010001140202022401140300062701000614" + }, + { + "filename": "glasses-square-yellow-saturated", + "data": "0x000b17100703000629010006290300012902020224012901000129020202240529020202240329020202240229020001290202022401290100012902020224022902000129020202240129010001290202022401290300062901000629" + } + ] + } +} \ No newline at end of file diff --git a/packages/nouns-contracts/files/images-data-test-new-art.json b/packages/nouns-contracts/files/images-data-test-new-art.json new file mode 100644 index 0000000000..9ba2c26af7 --- /dev/null +++ b/packages/nouns-contracts/files/images-data-test-new-art.json @@ -0,0 +1,1628 @@ +{ + "images": { + "bodies": [ + { + "filename": "body-green-reversed", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_000", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_001", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_002", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_003", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_004", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_005", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_006", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_007", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_008", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_009", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_010", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_011", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_012", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_013", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_014", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_015", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_016", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_017", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_018", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_019", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_020", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_021", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_022", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_023", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_024", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_025", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_026", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_027", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_028", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_029", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_030", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_031", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_032", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_033", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_034", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_035", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_036", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_037", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_038", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_039", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_040", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_041", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_042", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_043", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_044", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_045", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_046", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_047", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_048", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_049", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_050", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_051", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_052", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_053", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_054", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_055", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_056", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_057", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_058", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_059", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_060", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_061", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_062", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_063", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_064", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_065", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_066", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_067", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_068", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_069", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_070", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_071", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_072", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_073", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_074", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_075", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_076", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_077", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_078", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_079", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_080", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_081", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_082", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_083", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_084", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_085", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_086", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_087", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_088", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_089", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_090", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_091", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_092", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_093", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_094", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_095", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_096", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_097", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_098", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + }, + { + "filename": "body-green-reversed_099", + "data": "0x0015171f09431001000d1001000d1001000d1001000d1001000d1001000d1001000210" + } + ], + "accessories": [ + { + "filename": "accessory-txt-dao-black-reversed", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_000", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_001", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_002", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_003", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_004", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_005", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_006", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_007", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_008", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_009", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_010", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_011", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_012", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_013", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_014", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_015", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_016", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_017", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_018", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_019", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_020", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_021", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_022", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_023", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_024", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_025", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_026", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_027", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_028", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_029", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_030", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_031", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_032", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_033", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_034", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_035", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_036", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_037", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_038", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_039", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_040", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_041", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_042", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_043", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_044", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_045", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_046", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_047", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_048", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_049", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_050", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_051", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_052", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_053", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_054", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_055", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_056", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_057", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_058", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_059", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_060", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_061", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_062", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_063", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_064", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_065", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_066", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_067", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_068", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_069", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_070", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_071", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_072", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_073", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_074", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_075", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_076", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_077", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_078", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_079", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_080", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_081", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_082", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_083", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_084", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_085", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_086", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_087", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_088", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_089", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_090", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_091", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_092", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_093", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_094", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_095", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_096", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_097", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_098", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + }, + { + "filename": "accessory-txt-dao-black-reversed_099", + "data": "0x0018141b0b010001240200012402000324010002240100022401000224010005240100012401000124010001240100012401000224" + } + ], + "heads": [ + { + "filename": "head-thumbsup-reversed", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_000", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_001", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_002", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_003", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_004", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_005", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_006", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_007", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_008", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_009", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_010", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_011", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_012", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_013", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_014", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_015", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_016", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_017", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_018", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_019", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_020", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_021", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_022", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_023", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_024", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_025", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_026", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_027", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_028", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_029", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_030", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_031", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_032", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_033", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_034", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_035", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_036", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_037", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_038", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_039", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_040", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_041", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_042", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_043", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_044", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_045", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_046", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_047", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_048", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_049", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_050", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_051", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_052", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_053", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_054", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_055", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_056", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_057", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_058", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_059", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_060", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_061", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_062", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_063", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_064", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_065", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_066", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_067", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_068", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_069", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_070", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_071", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_072", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_073", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_074", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_075", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_076", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_077", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_078", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_079", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_080", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_081", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_082", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_083", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_084", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_085", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_086", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_087", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_088", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_089", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_090", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_091", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_092", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_093", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_094", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_095", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_096", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_097", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_098", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + }, + { + "filename": "head-thumbsup-reversed_099", + "data": "0x00011b1406080002e6012c110002e6012c01e6110002e6012c01e6110003e6012c110005e6100006e6100006e6080007e6012c06e6060001e6012c07e6012c08e6030001e6012c07e6012c0be6012c06e6012c0de60100072c17e6012c0be6012c08e6012c0ae6012c09e6012c0ae60100082c0ce6010008e6012c02e6012c05e6022c01e6010001e6012c06e6042c08e60100012c07e6012c03e6012c04e60500072c08e60400" + } + ], + "glasses": [ + { + "filename": "glasses-hip-rose-reversed_reversed", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_000", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_001", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_002", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_003", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_004", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_005", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_006", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_007", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_008", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_009", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_010", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_011", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_012", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_013", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_014", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_015", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_016", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_017", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_018", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_019", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_020", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_021", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_022", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_023", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_024", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_025", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_026", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_027", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_028", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_029", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_030", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_031", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_032", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_033", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_034", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_035", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_036", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_037", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_038", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_039", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_040", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_041", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_042", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_043", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_044", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_045", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_046", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_047", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_048", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_049", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_050", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_051", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_052", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_053", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_054", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_055", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_056", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_057", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_058", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_059", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_060", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_061", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_062", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_063", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_064", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_065", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_066", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_067", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_068", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_069", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_070", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_071", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_072", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_073", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_074", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_075", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_076", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_077", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_078", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_079", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_080", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_081", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_082", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_083", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_084", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_085", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_086", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_087", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_088", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_089", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_090", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_091", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_092", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_093", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_094", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_095", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_096", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_097", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_098", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + }, + { + "filename": "glasses-hip-rose-reversed_reversed_099", + "data": "0x000b1910090621010006210300012102240202012101000121022402020121030001210224020203210224020205210224020203210224020205210224020201210100012102240202012102000721010006210300" + } + ] + } +} \ No newline at end of file diff --git a/packages/nouns-contracts/foundry.toml b/packages/nouns-contracts/foundry.toml index 3ad1c161c1..2d051c48aa 100644 --- a/packages/nouns-contracts/foundry.toml +++ b/packages/nouns-contracts/foundry.toml @@ -3,3 +3,4 @@ src = 'contracts' libs = ['lib', '../../node_modules'] cache_path = 'foundry-cache' out = 'foundry-out' +solc_version = '0.8.15' \ No newline at end of file diff --git a/packages/nouns-contracts/hardhat.config.ts b/packages/nouns-contracts/hardhat.config.ts index a95f899dff..6d469b0503 100644 --- a/packages/nouns-contracts/hardhat.config.ts +++ b/packages/nouns-contracts/hardhat.config.ts @@ -3,7 +3,7 @@ import { HardhatUserConfig } from 'hardhat/config'; import dotenv from 'dotenv'; import '@nomiclabs/hardhat-waffle'; import '@nomiclabs/hardhat-etherscan'; -import '@float-capital/solidity-coverage'; +import 'solidity-coverage'; import '@typechain/hardhat'; import 'hardhat-abi-exporter'; import '@openzeppelin/hardhat-upgrades'; @@ -14,7 +14,7 @@ dotenv.config(); const config: HardhatUserConfig = { solidity: { - version: '0.8.6', + version: '0.8.15', settings: { optimizer: { enabled: true, diff --git a/packages/nouns-contracts/package.json b/packages/nouns-contracts/package.json index 2cf4ec8475..15e20edf69 100644 --- a/packages/nouns-contracts/package.json +++ b/packages/nouns-contracts/package.json @@ -25,7 +25,7 @@ "prepare": "yarn build" }, "devDependencies": { - "@float-capital/solidity-coverage": "^0.7.17", + "solidity-coverage": "0.7.21", "@nomiclabs/hardhat-ethers": "^2.0.6", "@nomiclabs/hardhat-etherscan": "^3.0.3", "@nomiclabs/hardhat-waffle": "^2.0.3", diff --git a/packages/nouns-contracts/tasks/deploy-and-configure-short-times-descriptorv1.ts b/packages/nouns-contracts/tasks/deploy-and-configure-short-times-descriptorv1.ts new file mode 100644 index 0000000000..1ccabe7053 --- /dev/null +++ b/packages/nouns-contracts/tasks/deploy-and-configure-short-times-descriptorv1.ts @@ -0,0 +1,103 @@ +import { task, types } from 'hardhat/config'; +import { printContractsTable } from './utils'; + +task('deploy-and-configure-short-times-descriptorv1', 'Deploy and configure all contracts') + .addFlag('startAuction', 'Start the first auction upon deployment completion') + .addFlag('autoDeploy', 'Deploy all contracts without user interaction') + .addFlag('updateConfigs', 'Write the deployed addresses to the SDK and subgraph configs') + .addOptionalParam('weth', 'The WETH contract address') + .addOptionalParam('noundersdao', 'The nounders DAO contract address') + .addOptionalParam( + 'auctionTimeBuffer', + 'The auction time buffer (seconds)', + 30 /* 30 seconds */, + types.int, + ) + .addOptionalParam( + 'auctionReservePrice', + 'The auction reserve price (wei)', + 1 /* 1 wei */, + types.int, + ) + .addOptionalParam( + 'auctionMinIncrementBidPercentage', + 'The auction min increment bid percentage (out of 100)', + 2 /* 2% */, + types.int, + ) + .addOptionalParam( + 'auctionDuration', + 'The auction duration (seconds)', + 60 * 2 /* 2 minutes */, + types.int, + ) + .addOptionalParam('timelockDelay', 'The timelock delay (seconds)', 60 /* 1 min */, types.int) + .addOptionalParam( + 'votingPeriod', + 'The voting period (blocks)', + 80 /* 20 min (15s blocks) */, + types.int, + ) + .addOptionalParam('votingDelay', 'The voting delay (blocks)', 1, types.int) + .addOptionalParam( + 'proposalThresholdBps', + 'The proposal threshold (basis points)', + 100 /* 1% */, + types.int, + ) + .addOptionalParam( + 'quorumVotesBps', + 'Votes required for quorum (basis points)', + 1_000 /* 10% */, + types.int, + ) + .setAction(async (args, { run }) => { + // Deploy the Nouns DAO contracts and return deployment information + const contracts = await run('deploy-short-times-descriptorv1', args); + + // Verify the contracts on Etherscan + await run('verify-etherscan', { + contracts, + }); + + // Populate the on-chain art + await run('populate-descriptor-v1', { + nftDescriptor: contracts.NFTDescriptor.address, + nounsDescriptor: contracts.NounsDescriptor.address, + }); + + // Transfer ownership of all contract except for the auction house. + // We must maintain ownership of the auction house to kick off the first auction. + const executorAddress = contracts.NounsDAOExecutor.address; + await contracts.NounsDescriptor.instance.transferOwnership(executorAddress); + await contracts.NounsToken.instance.transferOwnership(executorAddress); + await contracts.NounsAuctionHouseProxyAdmin.instance.transferOwnership(executorAddress); + console.log( + 'Transferred ownership of the descriptor, token, and proxy admin contracts to the executor.', + ); + + // Optionally kick off the first auction and transfer ownership of the auction house + // to the Nouns DAO executor. + if (args.startAuction) { + const auctionHouse = contracts.NounsAuctionHouse.instance.attach( + contracts.NounsAuctionHouseProxy.address, + ); + await auctionHouse.unpause({ + gasLimit: 1_000_000, + }); + await auctionHouse.transferOwnership(executorAddress); + console.log( + 'Started the first auction and transferred ownership of the auction house to the executor.', + ); + } + + // Optionally write the deployed addresses to the SDK and subgraph configs. + if (args.updateConfigs) { + await run('update-configs', { + contracts, + }); + } + + printContractsTable(contracts); + console.log('Deployment Complete.'); + }); diff --git a/packages/nouns-contracts/tasks/deploy-and-configure.ts b/packages/nouns-contracts/tasks/deploy-and-configure.ts index 2297677ba1..a2b7f56d5f 100644 --- a/packages/nouns-contracts/tasks/deploy-and-configure.ts +++ b/packages/nouns-contracts/tasks/deploy-and-configure.ts @@ -1,10 +1,5 @@ -import { task } from 'hardhat/config'; -import { DeployedContract } from './types'; - -interface ContractRow { - Address: string; - 'Deployment Hash'?: string; -} +import { task, types } from 'hardhat/config'; +import { printContractsTable } from './utils'; task('deploy-and-configure', 'Deploy and configure all contracts') .addFlag('startAuction', 'Start the first auction upon deployment completion') @@ -12,7 +7,12 @@ task('deploy-and-configure', 'Deploy and configure all contracts') .addFlag('updateConfigs', 'Write the deployed addresses to the SDK and subgraph configs') .addOptionalParam('weth', 'The WETH contract address') .addOptionalParam('noundersdao', 'The nounders DAO contract address') - .addOptionalParam('auctionTimeBuffer', 'The auction time buffer (seconds)') + .addOptionalParam( + 'auctionTimeBuffer', + 'The auction time buffer (seconds)', + 5 * 60 /* 5 minutes */, + types.int, + ) .addOptionalParam('auctionReservePrice', 'The auction reserve price (wei)') .addOptionalParam( 'auctionMinIncrementBidPercentage', @@ -35,14 +35,14 @@ task('deploy-and-configure', 'Deploy and configure all contracts') // Populate the on-chain art await run('populate-descriptor', { - nftDescriptor: contracts.NFTDescriptor.address, - nounsDescriptor: contracts.NounsDescriptor.address, + nftDescriptor: contracts.NFTDescriptorV2.address, + nounsDescriptor: contracts.NounsDescriptorV2.address, }); // Transfer ownership of all contract except for the auction house. // We must maintain ownership of the auction house to kick off the first auction. const executorAddress = contracts.NounsDAOExecutor.address; - await contracts.NounsDescriptor.instance.transferOwnership(executorAddress); + await contracts.NounsDescriptorV2.instance.transferOwnership(executorAddress); await contracts.NounsToken.instance.transferOwnership(executorAddress); await contracts.NounsAuctionHouseProxyAdmin.instance.transferOwnership(executorAddress); console.log( @@ -71,19 +71,6 @@ task('deploy-and-configure', 'Deploy and configure all contracts') }); } - console.table( - Object.values(contracts).reduce( - (acc: Record, contract: DeployedContract) => { - acc[contract.name] = { - Address: contract.address, - }; - if (contract.instance?.deployTransaction) { - acc[contract.name]['Deployment Hash'] = contract.instance.deployTransaction.hash; - } - return acc; - }, - {}, - ), - ); + printContractsTable(contracts); console.log('Deployment Complete.'); }); diff --git a/packages/nouns-contracts/tasks/deploy-descriptor-v2.ts b/packages/nouns-contracts/tasks/deploy-descriptor-v2.ts new file mode 100644 index 0000000000..953cd5d7c1 --- /dev/null +++ b/packages/nouns-contracts/tasks/deploy-descriptor-v2.ts @@ -0,0 +1,117 @@ +import { task } from 'hardhat/config'; +import { ContractName, DeployedContract } from './types'; +import { printContractsTable } from './utils'; + +async function delay(seconds: number) { + return new Promise(resolve => setTimeout(resolve, 1000 * seconds)); +} + +task('deploy-descriptor-v2', 'Deploy NounsDescriptorV2 & populate it with art') + .addParam( + 'daoExecutor', + 'The address of the NounsDAOExecutor that should be the owner of the descriptor.', + ) + .setAction(async ({ daoExecutor }, { ethers, run, network }) => { + const contracts: Record = {} as Record< + ContractName, + DeployedContract + >; + const [deployer] = await ethers.getSigners(); + console.log(`Deploying from address ${deployer.address}`); + + const nonce = await deployer.getTransactionCount(); + const expectedNounsArtAddress = ethers.utils.getContractAddress({ + from: deployer.address, + nonce: nonce + 4, + }); + + console.log('Deploying contracts...'); + const library = await (await ethers.getContractFactory('NFTDescriptorV2', deployer)).deploy(); + contracts.NFTDescriptorV2 = { + name: 'NFTDescriptorV2', + address: library.address, + instance: library, + constructorArguments: [], + libraries: {}, + }; + + const renderer = await (await ethers.getContractFactory('SVGRenderer', deployer)).deploy(); + contracts.SVGRenderer = { + name: 'SVGRenderer', + address: renderer.address, + instance: renderer, + constructorArguments: [], + libraries: {}, + }; + + const nounsDescriptorFactory = await ethers.getContractFactory('NounsDescriptorV2', { + libraries: { + NFTDescriptorV2: library.address, + }, + }); + const nounsDescriptor = await nounsDescriptorFactory.deploy( + expectedNounsArtAddress, + renderer.address, + ); + contracts.NounsDescriptorV2 = { + name: 'NounsDescriptorV2', + address: nounsDescriptor.address, + constructorArguments: [expectedNounsArtAddress, renderer.address], + instance: nounsDescriptor, + libraries: { + NFTDescriptorV2: library.address, + }, + }; + + const inflator = await (await ethers.getContractFactory('Inflator', deployer)).deploy(); + contracts.Inflator = { + name: 'Inflator', + address: inflator.address, + instance: inflator, + constructorArguments: [], + libraries: {}, + }; + + const art = await ( + await ethers.getContractFactory('NounsArt', deployer) + ).deploy(nounsDescriptor.address, inflator.address); + contracts.NounsArt = { + name: 'NounsArt', + address: art.address, + constructorArguments: [nounsDescriptor.address, inflator.address], + instance: art, + libraries: {}, + }; + + console.log('Waiting for contracts to be deployed'); + for (const c of Object.values(contracts)) { + console.log(`Waiting for ${c.name} to be deployed`); + await c.instance.deployTransaction.wait(); + console.log('Done'); + } + + console.log('Deployment complete:'); + printContractsTable(contracts); + + console.log('Populating Descriptor...'); + await run('populate-descriptor', { + nftDescriptor: contracts.NFTDescriptorV2.address, + nounsDescriptor: contracts.NounsDescriptorV2.address, + }); + console.log('Population complete.'); + + console.log('Transfering ownership to DAO Executor...'); + await nounsDescriptor.transferOwnership(daoExecutor); + console.log('Transfer complete.'); + + if (network.name !== 'localhost') { + console.log('Waiting 1 minute before verifying contracts on Etherscan'); + await delay(60); + + console.log('Verifying contracts on Etherscan...'); + await run('verify-etherscan', { + contracts, + }); + console.log('Verify complete.'); + } + }); diff --git a/packages/nouns-contracts/tasks/deploy-local.ts b/packages/nouns-contracts/tasks/deploy-local.ts index ef94d721b3..f5d84b11d5 100644 --- a/packages/nouns-contracts/tasks/deploy-local.ts +++ b/packages/nouns-contracts/tasks/deploy-local.ts @@ -38,11 +38,16 @@ task('deploy-local', 'Deploy contracts to hardhat') const proxyRegistryAddress = '0xa5409ec958c83c3f309868babaca7c86dcb077c1'; - const AUCTION_HOUSE_PROXY_NONCE_OFFSET = 7; - const GOVERNOR_N_DELEGATOR_NONCE_OFFSET = 10; + const NOUNS_ART_NONCE_OFFSET = 5; + const AUCTION_HOUSE_PROXY_NONCE_OFFSET = 10; + const GOVERNOR_N_DELEGATOR_NONCE_OFFSET = 13; const [deployer] = await ethers.getSigners(); const nonce = await deployer.getTransactionCount(); + const expectedNounsArtAddress = ethers.utils.getContractAddress({ + from: deployer.address, + nonce: nonce + NOUNS_ART_NONCE_OFFSET, + }); const expectedNounsDAOProxyAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonce + GOVERNOR_N_DELEGATOR_NONCE_OFFSET, @@ -53,18 +58,27 @@ task('deploy-local', 'Deploy contracts to hardhat') }); const contracts: Record = { WETH: {}, - NFTDescriptor: {}, - NounsDescriptor: { + NFTDescriptorV2: {}, + SVGRenderer: {}, + NounsDescriptorV2: { + args: [expectedNounsArtAddress, () => contracts.SVGRenderer.instance?.address], libraries: () => ({ - NFTDescriptor: contracts.NFTDescriptor.instance?.address as string, + NFTDescriptorV2: contracts.NFTDescriptorV2.instance?.address as string, }), }, + Inflator: {}, + NounsArt: { + args: [ + () => contracts.NounsDescriptorV2.instance?.address, + () => contracts.Inflator.instance?.address, + ], + }, NounsSeeder: {}, NounsToken: { args: [ args.noundersdao || deployer.address, expectedAuctionHouseProxyAddress, - () => contracts.NounsDescriptor.instance?.address, + () => contracts.NounsDescriptorV2.instance?.address, () => contracts.NounsSeeder.instance?.address, proxyRegistryAddress, ], diff --git a/packages/nouns-contracts/tasks/deploy-short-times-descriptorv1.ts b/packages/nouns-contracts/tasks/deploy-short-times-descriptorv1.ts new file mode 100644 index 0000000000..93459abdfb --- /dev/null +++ b/packages/nouns-contracts/tasks/deploy-short-times-descriptorv1.ts @@ -0,0 +1,296 @@ +import { default as NounsAuctionHouseABI } from '../abi/contracts/NounsAuctionHouse.sol/NounsAuctionHouse.json'; +import { + ChainId, + ContractDeployment, + ContractName, + ContractNameDescriptorV1, + DeployedContract, +} from './types'; +import { Interface } from 'ethers/lib/utils'; +import { task, types } from 'hardhat/config'; +import promptjs from 'prompt'; + +promptjs.colors = false; +promptjs.message = '> '; +promptjs.delimiter = ''; + +const proxyRegistries: Record = { + [ChainId.Mainnet]: '0xa5409ec958c83c3f309868babaca7c86dcb077c1', + [ChainId.Rinkeby]: '0xf57b2c51ded3a29e6891aba85459d600256cf317', +}; +const wethContracts: Record = { + [ChainId.Mainnet]: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', + [ChainId.Ropsten]: '0xc778417e063141139fce010982780140aa0cd5ab', + [ChainId.Rinkeby]: '0xc778417e063141139fce010982780140aa0cd5ab', + [ChainId.Kovan]: '0xd0a1e359811322d97991e03f863a0c30c2cf029c', +}; + +const AUCTION_HOUSE_PROXY_NONCE_OFFSET = 6; +const GOVERNOR_N_DELEGATOR_NONCE_OFFSET = 9; + +task('deploy-short-times-descriptorv1', 'Deploy all Nouns contracts with NounsDescriptor v1') + .addFlag('autoDeploy', 'Deploy all contracts without user interaction') + .addOptionalParam('weth', 'The WETH contract address', undefined, types.string) + .addOptionalParam('noundersdao', 'The nounders DAO contract address', undefined, types.string) + .addOptionalParam( + 'auctionTimeBuffer', + 'The auction time buffer (seconds)', + 30 /* 30 seconds */, + types.int, + ) + .addOptionalParam( + 'auctionReservePrice', + 'The auction reserve price (wei)', + 1 /* 1 wei */, + types.int, + ) + .addOptionalParam( + 'auctionMinIncrementBidPercentage', + 'The auction min increment bid percentage (out of 100)', + 2 /* 2% */, + types.int, + ) + .addOptionalParam( + 'auctionDuration', + 'The auction duration (seconds)', + 60 * 2 /* 2 minutes */, + types.int, + ) + .addOptionalParam('timelockDelay', 'The timelock delay (seconds)', 60 /* 1 min */, types.int) + .addOptionalParam( + 'votingPeriod', + 'The voting period (blocks)', + 80 /* 20 min (15s blocks) */, + types.int, + ) + .addOptionalParam('votingDelay', 'The voting delay (blocks)', 1, types.int) + .addOptionalParam( + 'proposalThresholdBps', + 'The proposal threshold (basis points)', + 100 /* 1% */, + types.int, + ) + .addOptionalParam( + 'quorumVotesBps', + 'Votes required for quorum (basis points)', + 1_000 /* 10% */, + types.int, + ) + .setAction(async (args, { ethers }) => { + const network = await ethers.provider.getNetwork(); + const [deployer] = await ethers.getSigners(); + + // prettier-ignore + const proxyRegistryAddress = proxyRegistries[network.chainId] ?? proxyRegistries[ChainId.Rinkeby]; + + if (!args.noundersdao) { + console.log( + `Nounders DAO address not provided. Setting to deployer (${deployer.address})...`, + ); + args.noundersdao = deployer.address; + } + if (!args.weth) { + const deployedWETHContract = wethContracts[network.chainId]; + if (!deployedWETHContract) { + throw new Error( + `Can not auto-detect WETH contract on chain ${network.name}. Provide it with the --weth arg.`, + ); + } + args.weth = deployedWETHContract; + } + + const nonce = await deployer.getTransactionCount(); + const expectedAuctionHouseProxyAddress = ethers.utils.getContractAddress({ + from: deployer.address, + nonce: nonce + AUCTION_HOUSE_PROXY_NONCE_OFFSET, + }); + const expectedNounsDAOProxyAddress = ethers.utils.getContractAddress({ + from: deployer.address, + nonce: nonce + GOVERNOR_N_DELEGATOR_NONCE_OFFSET, + }); + const deployment: Record = {} as Record< + ContractNameDescriptorV1, + DeployedContract + >; + const contracts: Record = { + NFTDescriptor: {}, + NounsDescriptor: { + libraries: () => ({ + NFTDescriptor: deployment.NFTDescriptor.address, + }), + }, + NounsSeeder: {}, + NounsToken: { + args: [ + args.noundersdao, + expectedAuctionHouseProxyAddress, + () => deployment.NounsDescriptor.address, + () => deployment.NounsSeeder.address, + proxyRegistryAddress, + ], + }, + NounsAuctionHouse: { + waitForConfirmation: true, + }, + NounsAuctionHouseProxyAdmin: {}, + NounsAuctionHouseProxy: { + args: [ + () => deployment.NounsAuctionHouse.address, + () => deployment.NounsAuctionHouseProxyAdmin.address, + () => + new Interface(NounsAuctionHouseABI).encodeFunctionData('initialize', [ + deployment.NounsToken.address, + args.weth, + args.auctionTimeBuffer, + args.auctionReservePrice, + args.auctionMinIncrementBidPercentage, + args.auctionDuration, + ]), + ], + waitForConfirmation: true, + validateDeployment: () => { + const expected = expectedAuctionHouseProxyAddress.toLowerCase(); + const actual = deployment.NounsAuctionHouseProxy.address.toLowerCase(); + if (expected !== actual) { + throw new Error( + `Unexpected auction house proxy address. Expected: ${expected}. Actual: ${actual}.`, + ); + } + }, + }, + NounsDAOExecutor: { + args: [expectedNounsDAOProxyAddress, args.timelockDelay], + }, + NounsDAOLogicV1: { + waitForConfirmation: true, + }, + NounsDAOProxy: { + args: [ + () => deployment.NounsDAOExecutor.address, + () => deployment.NounsToken.address, + args.noundersdao, + () => deployment.NounsDAOExecutor.address, + () => deployment.NounsDAOLogicV1.address, + args.votingPeriod, + args.votingDelay, + args.proposalThresholdBps, + args.quorumVotesBps, + ], + waitForConfirmation: true, + validateDeployment: () => { + const expected = expectedNounsDAOProxyAddress.toLowerCase(); + const actual = deployment.NounsDAOProxy.address.toLowerCase(); + if (expected !== actual) { + throw new Error( + `Unexpected Nouns DAO proxy address. Expected: ${expected}. Actual: ${actual}.`, + ); + } + }, + }, + }; + + for (const [name, contract] of Object.entries(contracts)) { + let gasPrice = await ethers.provider.getGasPrice(); + if (!args.autoDeploy) { + const gasInGwei = Math.round(Number(ethers.utils.formatUnits(gasPrice, 'gwei'))); + + promptjs.start(); + + const result = await promptjs.get([ + { + properties: { + gasPrice: { + type: 'integer', + required: true, + description: 'Enter a gas price (gwei)', + default: gasInGwei, + }, + }, + }, + ]); + gasPrice = ethers.utils.parseUnits(result.gasPrice.toString(), 'gwei'); + } + + let nameForFactory: string; + switch (name) { + case 'NounsDAOExecutor': + nameForFactory = 'NounsDAOExecutorTest'; + break; + case 'NounsDAOLogicV1': + nameForFactory = 'NounsDAOLogicV1Harness'; + break; + default: + nameForFactory = name; + break; + } + + const factory = await ethers.getContractFactory(nameForFactory, { + libraries: contract?.libraries?.(), + }); + + const deploymentGas = await factory.signer.estimateGas( + factory.getDeployTransaction( + ...(contract.args?.map(a => (typeof a === 'function' ? a() : a)) ?? []), + { + gasPrice, + }, + ), + ); + const deploymentCost = deploymentGas.mul(gasPrice); + + console.log( + `Estimated cost to deploy ${name}: ${ethers.utils.formatUnits( + deploymentCost, + 'ether', + )} ETH`, + ); + + if (!args.autoDeploy) { + const result = await promptjs.get([ + { + properties: { + confirm: { + pattern: /^(DEPLOY|SKIP|EXIT)$/, + description: + 'Type "DEPLOY" to confirm, "SKIP" to skip this contract, or "EXIT" to exit.', + }, + }, + }, + ]); + if (result.operation === 'SKIP') { + console.log(`Skipping ${name} deployment...`); + continue; + } + if (result.operation === 'EXIT') { + console.log('Exiting...'); + return; + } + } + console.log(`Deploying ${name}...`); + + const deployedContract = await factory.deploy( + ...(contract.args?.map(a => (typeof a === 'function' ? a() : a)) ?? []), + { + gasPrice, + }, + ); + + if (contract.waitForConfirmation) { + await deployedContract.deployed(); + } + + deployment[name as ContractNameDescriptorV1] = { + name: nameForFactory, + instance: deployedContract, + address: deployedContract.address, + constructorArguments: contract.args?.map(a => (typeof a === 'function' ? a() : a)) ?? [], + libraries: contract?.libraries?.() ?? {}, + }; + + contract.validateDeployment?.(); + + console.log(`${name} contract deployed to ${deployedContract.address}`); + } + + return deployment; + }); diff --git a/packages/nouns-contracts/tasks/deploy-test-token.ts b/packages/nouns-contracts/tasks/deploy-test-token.ts new file mode 100644 index 0000000000..696818d119 --- /dev/null +++ b/packages/nouns-contracts/tasks/deploy-test-token.ts @@ -0,0 +1,56 @@ +import { task } from 'hardhat/config'; +import { ContractName, DeployedContract } from './types'; + +async function delay(seconds: number) { + return new Promise(resolve => setTimeout(resolve, 1000 * seconds)); +} + +task('deploy-test-token', 'Deploy NounsTokenHarness given a descriptor') + .addParam('descriptorAddress', 'Address of a deployed descriptor contractor') + .addParam('seederAddress', 'Address of a deployed seeder contract') + .setAction(async ({ descriptorAddress, seederAddress }, { ethers, run, network }) => { + const [deployer] = await ethers.getSigners(); + console.log(`Deploying from address ${deployer.address}`); + + const proxyRegistryAddress = '0xa5409ec958c83c3f309868babaca7c86dcb077c1'; + + const token = await ( + await ethers.getContractFactory('NounsTokenHarness', deployer) + ).deploy( + deployer.address, + deployer.address, + descriptorAddress, + seederAddress, + proxyRegistryAddress, + ); + console.log(`NounsTokenHarness deployed to: ${token.address}`); + + if (network.name !== 'localhost') { + console.log('Waiting 1 minute before verifying contracts on Etherscan'); + await delay(60); + + console.log('Verifying contracts on Etherscan...'); + const contracts: Record = {} as Record; + + contracts.NounsTokenHarness = { + name: 'NounsTokenHarness', + address: token.address, + constructorArguments: [ + deployer.address, + deployer.address, + descriptorAddress, + seederAddress, + proxyRegistryAddress, + ], + instance: token, + libraries: {}, + }; + + await run('verify-etherscan', { + contracts, + }); + console.log('Verify complete.'); + } + + console.log('Done'); + }); diff --git a/packages/nouns-contracts/tasks/deploy.ts b/packages/nouns-contracts/tasks/deploy.ts index 1248179b3e..90835cd3f9 100644 --- a/packages/nouns-contracts/tasks/deploy.ts +++ b/packages/nouns-contracts/tasks/deploy.ts @@ -19,8 +19,9 @@ const wethContracts: Record = { [ChainId.Kovan]: '0xd0a1e359811322d97991e03f863a0c30c2cf029c', }; -const AUCTION_HOUSE_PROXY_NONCE_OFFSET = 6; -const GOVERNOR_N_DELEGATOR_NONCE_OFFSET = 9; +const NOUNS_ART_NONCE_OFFSET = 4; +const AUCTION_HOUSE_PROXY_NONCE_OFFSET = 9; +const GOVERNOR_N_DELEGATOR_NONCE_OFFSET = 12; task('deploy', 'Deploys NFTDescriptor, NounsDescriptor, NounsSeeder, and NounsToken') .addFlag('autoDeploy', 'Deploy all contracts without user interaction') @@ -104,6 +105,10 @@ task('deploy', 'Deploys NFTDescriptor, NounsDescriptor, NounsSeeder, and NounsTo } const nonce = await deployer.getTransactionCount(); + const expectedNounsArtAddress = ethers.utils.getContractAddress({ + from: deployer.address, + nonce: nonce + NOUNS_ART_NONCE_OFFSET, + }); const expectedAuctionHouseProxyAddress = ethers.utils.getContractAddress({ from: deployer.address, nonce: nonce + AUCTION_HOUSE_PROXY_NONCE_OFFSET, @@ -117,18 +122,24 @@ task('deploy', 'Deploys NFTDescriptor, NounsDescriptor, NounsSeeder, and NounsTo DeployedContract >; const contracts: Record = { - NFTDescriptor: {}, - NounsDescriptor: { + NFTDescriptorV2: {}, + SVGRenderer: {}, + NounsDescriptorV2: { + args: [expectedNounsArtAddress, () => deployment.SVGRenderer.address], libraries: () => ({ - NFTDescriptor: deployment.NFTDescriptor.address, + NFTDescriptorV2: deployment.NFTDescriptorV2.address, }), }, + Inflator: {}, + NounsArt: { + args: [() => deployment.NounsDescriptorV2.address, () => deployment.Inflator.address], + }, NounsSeeder: {}, NounsToken: { args: [ args.noundersdao, expectedAuctionHouseProxyAddress, - () => deployment.NounsDescriptor.address, + () => deployment.NounsDescriptorV2.address, () => deployment.NounsSeeder.address, proxyRegistryAddress, ], diff --git a/packages/nouns-contracts/tasks/descriptor-art-to-console.ts b/packages/nouns-contracts/tasks/descriptor-art-to-console.ts new file mode 100644 index 0000000000..6dda33f15a --- /dev/null +++ b/packages/nouns-contracts/tasks/descriptor-art-to-console.ts @@ -0,0 +1,86 @@ +import { writeFileSync } from 'fs'; +import { task, types } from 'hardhat/config'; +import ImageData from '../files/image-data-v2.json'; +import { dataToDescriptorInput } from './utils'; +import path from 'path'; +import { ethers } from 'ethers'; + +const saveToFileAbiEncoded = ( + filepath: string, + traitPage: { encodedCompressed: string; originalLength: number; itemCount: number }, +) => { + const abiEncoded = ethers.utils.defaultAbiCoder.encode( + ['bytes', 'uint80', 'uint16'], + [traitPage.encodedCompressed, traitPage.originalLength, traitPage.itemCount], + ); + writeFileSync(filepath, abiEncoded); + console.log(`Saved traitPage to ${filepath}`); +}; + +task( + 'descriptor-art-to-console', + 'Prints the descriptor art config in the final format, to be used in foundry / manual tests.', +) + .addOptionalParam( + 'count', + 'The length of the image slice to take from each of the image arrays', + undefined, + types.int, + ) + .addOptionalParam('start', 'The index at which to start the image slice', undefined, types.int) + .addOptionalParam( + 'exportPath', + 'Where to save abi encoded files to be used in forge tests', + path.join(__dirname, '../test/foundry/files/descriptor_v2/'), + ) + .setAction(async ({ count, start, exportPath }, { ethers }) => { + const { bgcolors, palette, images } = ImageData; + let { bodies, accessories, heads, glasses } = images; + + if (count !== undefined) { + start = start === undefined ? 0 : start; + + bodies = bodies.slice(start, count + start); + accessories = accessories.slice(start, count + start); + heads = heads.slice(start, count + start); + glasses = glasses.slice(start, count + start); + } + + const bodiesPage = dataToDescriptorInput(bodies.map(({ data }) => data)); + const accessoriesPage = dataToDescriptorInput(accessories.map(({ data }) => data)); + const headsPage = dataToDescriptorInput(heads.map(({ data }) => data)); + const glassesPage = dataToDescriptorInput(glasses.map(({ data }) => data)); + const paletteValue = `0x000000${palette.join('')}`; + + writeFileSync( + path.join(exportPath, 'paletteAndBackgrounds.abi'), + ethers.utils.defaultAbiCoder.encode(['bytes', 'string[]'], [paletteValue, bgcolors]), + ); + + console.log('=== PALETTE ===\n'); + console.log(`paletteValue: '${paletteValue}'\n`); + + console.log('=== BODIES ===\n'); + console.log(`bodiesCompressed: '${bodiesPage.encodedCompressed}'\n`); + console.log(`bodiesLength: ${bodiesPage.originalLength}\n`); + console.log(`bodies count: ${bodiesPage.itemCount}`); + saveToFileAbiEncoded(path.join(exportPath, 'bodiesPage.abi'), bodiesPage); + + console.log('=== ACCESSORIES ===\n'); + console.log(`accessoriesCompressed: '${accessoriesPage.encodedCompressed}'\n`); + console.log(`accessoriesLength: ${accessoriesPage.originalLength}\n`); + console.log(`accessories count: ${accessoriesPage.itemCount}`); + saveToFileAbiEncoded(path.join(exportPath, 'accessoriesPage.abi'), accessoriesPage); + + console.log('=== HEADS ===\n'); + console.log(`headsCompressed: '${headsPage.encodedCompressed}'\n`); + console.log(`headsLength: ${headsPage.originalLength}\n`); + console.log(`heads count: ${headsPage.itemCount}`); + saveToFileAbiEncoded(path.join(exportPath, 'headsPage.abi'), headsPage); + + console.log('=== GLASSES ===\n'); + console.log(`glassesCompressed: '${glassesPage.encodedCompressed}'\n`); + console.log(`glassesLength: ${glassesPage.originalLength}\n`); + console.log(`glasses count: ${glassesPage.itemCount}\n`); + saveToFileAbiEncoded(path.join(exportPath, 'glassesPage.abi'), glassesPage); + }); diff --git a/packages/nouns-contracts/tasks/descriptor-v1-export-abi.ts b/packages/nouns-contracts/tasks/descriptor-v1-export-abi.ts new file mode 100644 index 0000000000..cd18bf07ad --- /dev/null +++ b/packages/nouns-contracts/tasks/descriptor-v1-export-abi.ts @@ -0,0 +1,34 @@ +import { writeFileSync } from 'fs'; +import { task, types } from 'hardhat/config'; +import path from 'path'; +import ImageData from '../files/image-data-v1.json'; + +task( + 'descriptor-v1-export-abi', + 'Exports the image-data to abi files to be able to load from forge tests', +) + .addOptionalParam( + 'exportPath', + 'Where to save abi encoded files to be used in forge tests', + path.join(__dirname, '../test/foundry/files/descriptor_v1/'), + ) + .setAction(async ({ exportPath }, { ethers }) => { + const { bgcolors, palette, images } = ImageData; + let { bodies, accessories, heads, glasses } = images; + + const abiEncoded = ethers.utils.defaultAbiCoder.encode( + ['string[]', 'string[]', 'bytes[]', 'bytes[]', 'bytes[]', 'bytes[]'], + [ + bgcolors, + palette, + bodies.map(({ data }) => data), + accessories.map(({ data }) => data), + heads.map(({ data }) => data), + glasses.map(({ data }) => data), + ], + ); + + const filepath = path.join(exportPath, 'image-data.abi'); + writeFileSync(filepath, abiEncoded); + console.log(`Saved image-data to ${filepath}`); + }); diff --git a/packages/nouns-contracts/tasks/index.ts b/packages/nouns-contracts/tasks/index.ts index 9fb99135f6..bdd8b0b97d 100644 --- a/packages/nouns-contracts/tasks/index.ts +++ b/packages/nouns-contracts/tasks/index.ts @@ -9,3 +9,12 @@ export * from './populate-descriptor'; export * from './run-local'; export * from './verify-etherscan'; export * from './update-configs'; +export * from './descriptor-art-to-console'; +export * from './descriptor-v1-export-abi'; +export * from './deploy-descriptor-v2'; +export * from './deploy-short-times-descriptorv1'; +export * from './deploy-and-configure-short-times-descriptorv1'; +export * from './populate-descriptor-via-proposal'; +export * from './deploy-test-token'; +export * from './populate-descriptor-v1'; +export * from './upgrade-descriptor-via-proposal'; diff --git a/packages/nouns-contracts/tasks/populate-descriptor-v1.ts b/packages/nouns-contracts/tasks/populate-descriptor-v1.ts new file mode 100644 index 0000000000..93f7415f5f --- /dev/null +++ b/packages/nouns-contracts/tasks/populate-descriptor-v1.ts @@ -0,0 +1,47 @@ +import { task, types } from 'hardhat/config'; +import ImageData from '../files/image-data-v1.json'; +import { chunkArray } from '../utils'; + +task('populate-descriptor-v1', 'Populates the descriptor with color palettes and Noun parts') + .addOptionalParam( + 'nftDescriptor', + 'The `NFTDescriptor` contract address', + '0x5FbDB2315678afecb367f032d93F642f64180aa3', + types.string, + ) + .addOptionalParam( + 'nounsDescriptor', + 'The `NounsDescriptor` contract address', + '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512', + types.string, + ) + .setAction(async ({ nftDescriptor, nounsDescriptor }, { ethers }) => { + const descriptorFactory = await ethers.getContractFactory('NounsDescriptor', { + libraries: { + NFTDescriptor: nftDescriptor, + }, + }); + const descriptorContract = descriptorFactory.attach(nounsDescriptor); + + const { bgcolors, palette, images } = ImageData; + const { bodies, accessories, heads, glasses } = images; + + // Chunk head and accessory population due to high gas usage + await descriptorContract.addManyBackgrounds(bgcolors); + await descriptorContract.addManyColorsToPalette(0, palette); + await descriptorContract.addManyBodies(bodies.map(({ data }) => data)); + + const accessoryChunk = chunkArray(accessories, 10); + for (const chunk of accessoryChunk) { + await descriptorContract.addManyAccessories(chunk.map(({ data }) => data)); + } + + const headChunk = chunkArray(heads, 10); + for (const chunk of headChunk) { + await descriptorContract.addManyHeads(chunk.map(({ data }) => data)); + } + + await descriptorContract.addManyGlasses(glasses.map(({ data }) => data)); + + console.log('Descriptor populated with palettes and parts.'); + }); diff --git a/packages/nouns-contracts/tasks/populate-descriptor-via-proposal.ts b/packages/nouns-contracts/tasks/populate-descriptor-via-proposal.ts new file mode 100644 index 0000000000..830a786347 --- /dev/null +++ b/packages/nouns-contracts/tasks/populate-descriptor-via-proposal.ts @@ -0,0 +1,125 @@ +import { task } from 'hardhat/config'; +import { dataToDescriptorInput } from './utils'; +import { readFileSync } from 'fs'; + +// see image-data-example-for-populate-via-proposal.json for an example input file +task( + 'populate-descriptor-via-proposal', + 'Populates the descriptor with color palettes and Noun parts; accepts an input JSON with missing properies.', +) + .addParam('nounsDescriptor', 'The `NounsDescriptor` contract address') + .addParam('daoAddress', 'The `NounsDAOProxy` contract address') + .addParam('imageDataPath', 'The path to the image data JSON file') + .setAction(async ({ nounsDescriptor, daoAddress, imageDataPath }, { ethers }) => { + const ImageData = JSON.parse(readFileSync(imageDataPath, 'utf-8')); + + const targets = []; + const values = []; + const signatures = []; + const calldatas = []; + + if (ImageData.bgcolors) { + targets.push(nounsDescriptor); + values.push(0); + signatures.push('addManyBackgrounds(string[])'); + calldatas.push(ethers.utils.defaultAbiCoder.encode(['string[]'], [ImageData.bgcolors])); + } + + if (ImageData.palettes) { + for (const [index, colors] of Object.entries(ImageData.palettes)) { + targets.push(nounsDescriptor); + values.push(0); + signatures.push('setPalette(uint8,bytes)'); + calldatas.push( + ethers.utils.defaultAbiCoder.encode( + ['uint8', 'bytes'], + [parseInt(index), `0x000000${(colors as string[]).join('')}`], + ), + ); + } + } + + if (ImageData.images) { + const { bodies, accessories, heads, glasses } = ImageData.images; + + if (bodies) { + const bodiesPage = dataToDescriptorInput( + (bodies as [{ data: string }]).map(({ data }) => data), + ); + + targets.push(nounsDescriptor); + values.push(0); + signatures.push('addBodies(bytes,uint80,uint16)'); + calldatas.push( + ethers.utils.defaultAbiCoder.encode( + ['bytes', 'uint80', 'uint16'], + [bodiesPage.encodedCompressed, bodiesPage.originalLength, bodiesPage.itemCount], + ), + ); + } + + if (heads) { + const headsPage = dataToDescriptorInput( + (heads as [{ data: string }]).map(({ data }) => data), + ); + + targets.push(nounsDescriptor); + values.push(0); + signatures.push('addHeads(bytes,uint80,uint16)'); + calldatas.push( + ethers.utils.defaultAbiCoder.encode( + ['bytes', 'uint80', 'uint16'], + [headsPage.encodedCompressed, headsPage.originalLength, headsPage.itemCount], + ), + ); + } + + if (glasses) { + const glassesPage = dataToDescriptorInput( + (glasses as [{ data: string }]).map(({ data }) => data), + ); + + targets.push(nounsDescriptor); + values.push(0); + signatures.push('addGlasses(bytes,uint80,uint16)'); + calldatas.push( + ethers.utils.defaultAbiCoder.encode( + ['bytes', 'uint80', 'uint16'], + [glassesPage.encodedCompressed, glassesPage.originalLength, glassesPage.itemCount], + ), + ); + } + + if (accessories) { + const accessoriesPage = dataToDescriptorInput( + (accessories as [{ data: string }]).map(({ data }) => data), + ); + + targets.push(nounsDescriptor); + values.push(0); + signatures.push('addAccessories(bytes,uint80,uint16)'); + calldatas.push( + ethers.utils.defaultAbiCoder.encode( + ['bytes', 'uint80', 'uint16'], + [ + accessoriesPage.encodedCompressed, + accessoriesPage.originalLength, + accessoriesPage.itemCount, + ], + ), + ); + } + } + + const dao = (await ethers.getContractFactory('NounsDAOLogicV1')).attach(daoAddress); + const propTx = await dao.propose( + targets, + values, + signatures, + calldatas, + '# Add 8/8 Nouniversary Art\nThis proposal adds the art the community designed and voted on to NounsToken.', + ); + await propTx.wait(); + + console.log('Proposal submitted!'); + }); diff --git a/packages/nouns-contracts/tasks/populate-descriptor.ts b/packages/nouns-contracts/tasks/populate-descriptor.ts index 58ed0dd390..abf0d60e2f 100644 --- a/packages/nouns-contracts/tasks/populate-descriptor.ts +++ b/packages/nouns-contracts/tasks/populate-descriptor.ts @@ -1,6 +1,6 @@ import { task, types } from 'hardhat/config'; -import ImageData from '../files/image-data.json'; -import { chunkArray } from '../utils'; +import ImageData from '../files/image-data-v2.json'; +import { dataToDescriptorInput } from './utils'; task('populate-descriptor', 'Populates the descriptor with color palettes and Noun parts') .addOptionalParam( @@ -15,10 +15,12 @@ task('populate-descriptor', 'Populates the descriptor with color palettes and No '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512', types.string, ) - .setAction(async ({ nftDescriptor, nounsDescriptor }, { ethers }) => { - const descriptorFactory = await ethers.getContractFactory('NounsDescriptor', { + .setAction(async ({ nftDescriptor, nounsDescriptor }, { ethers, network }) => { + const options = { gasLimit: network.name === 'hardhat' ? 30000000 : undefined }; + + const descriptorFactory = await ethers.getContractFactory('NounsDescriptorV2', { libraries: { - NFTDescriptor: nftDescriptor, + NFTDescriptorV2: nftDescriptor, }, }); const descriptorContract = descriptorFactory.attach(nounsDescriptor); @@ -26,22 +28,38 @@ task('populate-descriptor', 'Populates the descriptor with color palettes and No const { bgcolors, palette, images } = ImageData; const { bodies, accessories, heads, glasses } = images; - // Chunk head and accessory population due to high gas usage - await descriptorContract.addManyBackgrounds(bgcolors); - await descriptorContract.addManyColorsToPalette(0, palette); - await descriptorContract.addManyBodies(bodies.map(({ data }) => data)); - - const accessoryChunk = chunkArray(accessories, 10); - for (const chunk of accessoryChunk) { - await descriptorContract.addManyAccessories(chunk.map(({ data }) => data)); - } + const bodiesPage = dataToDescriptorInput(bodies.map(({ data }) => data)); + const headsPage = dataToDescriptorInput(heads.map(({ data }) => data)); + const glassesPage = dataToDescriptorInput(glasses.map(({ data }) => data)); + const accessoriesPage = dataToDescriptorInput(accessories.map(({ data }) => data)); - const headChunk = chunkArray(heads, 10); - for (const chunk of headChunk) { - await descriptorContract.addManyHeads(chunk.map(({ data }) => data)); - } + await descriptorContract.addManyBackgrounds(bgcolors); + await descriptorContract.setPalette(0, `0x000000${palette.join('')}`); - await descriptorContract.addManyGlasses(glasses.map(({ data }) => data)); + await descriptorContract.addBodies( + bodiesPage.encodedCompressed, + bodiesPage.originalLength, + bodiesPage.itemCount, + options, + ); + await descriptorContract.addHeads( + headsPage.encodedCompressed, + headsPage.originalLength, + headsPage.itemCount, + options, + ); + await descriptorContract.addGlasses( + glassesPage.encodedCompressed, + glassesPage.originalLength, + glassesPage.itemCount, + options, + ); + await descriptorContract.addAccessories( + accessoriesPage.encodedCompressed, + accessoriesPage.originalLength, + accessoriesPage.itemCount, + options, + ); console.log('Descriptor populated with palettes and parts.'); }); diff --git a/packages/nouns-contracts/tasks/run-local.ts b/packages/nouns-contracts/tasks/run-local.ts index 036e664ec4..c87f0614fd 100644 --- a/packages/nouns-contracts/tasks/run-local.ts +++ b/packages/nouns-contracts/tasks/run-local.ts @@ -12,8 +12,8 @@ task( const contracts = await run('deploy-local'); await run('populate-descriptor', { - nftDescriptor: contracts.NFTDescriptor.instance.address, - nounsDescriptor: contracts.NounsDescriptor.instance.address, + nftDescriptor: contracts.NFTDescriptorV2.instance.address, + nounsDescriptor: contracts.NounsDescriptorV2.instance.address, }); await contracts.NounsAuctionHouse.instance @@ -22,9 +22,21 @@ task( gasLimit: 1_000_000, }); - await run('create-proposal', { - nounsDaoProxy: contracts.NounsDAOProxy.instance.address, - }); + // Transfer ownership + const executorAddress = contracts.NounsDAOExecutor.instance.address; + await contracts.NounsDescriptorV2.instance.transferOwnership(executorAddress); + await contracts.NounsToken.instance.transferOwnership(executorAddress); + await contracts.NounsAuctionHouseProxyAdmin.instance.transferOwnership(executorAddress); + await contracts.NounsAuctionHouse.instance + .attach(contracts.NounsAuctionHouseProxy.instance.address) + .transferOwnership(executorAddress); + console.log( + 'Transferred ownership of the descriptor, token, and proxy admin contracts to the executor.', + ); + + // await run('create-proposal', { + // nounsDaoProxy: contracts.NounsDAOProxy.instance.address, + // }); const { chainId } = await ethers.provider.getNetwork(); diff --git a/packages/nouns-contracts/tasks/types/index.ts b/packages/nouns-contracts/tasks/types/index.ts index 9dd05f46e2..9070614f2f 100644 --- a/packages/nouns-contracts/tasks/types/index.ts +++ b/packages/nouns-contracts/tasks/types/index.ts @@ -8,7 +8,13 @@ export enum ChainId { } // prettier-ignore -export type ContractName = 'NFTDescriptor' | 'NounsDescriptor' | 'NounsSeeder' | 'NounsToken' | 'NounsAuctionHouse' | 'NounsAuctionHouseProxyAdmin' | 'NounsAuctionHouseProxy' | 'NounsDAOExecutor' | 'NounsDAOLogicV1' | 'NounsDAOProxy'; +export type DescriptorV1ContractNames = 'NFTDescriptor' | 'NounsDescriptor'; +// prettier-ignore +export type DescriptorV2ContractNames = 'NFTDescriptorV2' | 'NounsDescriptorV2' | 'SVGRenderer' | 'NounsArt' | 'Inflator'; +// prettier-ignore +export type ContractName = DescriptorV2ContractNames | 'NounsSeeder' | 'NounsToken' | 'NounsAuctionHouse' | 'NounsAuctionHouseProxyAdmin' | 'NounsAuctionHouseProxy' | 'NounsDAOExecutor' | 'NounsDAOLogicV1' | 'NounsDAOProxy'; +// prettier-ignore +export type ContractNameDescriptorV1 = DescriptorV1ContractNames | 'NounsSeeder' | 'NounsToken' | 'NounsAuctionHouse' | 'NounsAuctionHouseProxyAdmin' | 'NounsAuctionHouseProxy' | 'NounsDAOExecutor' | 'NounsDAOLogicV1' | 'NounsDAOProxy'; export interface ContractDeployment { args?: (string | number | (() => string))[]; @@ -24,3 +30,8 @@ export interface DeployedContract { constructorArguments: (string | number)[]; libraries: Record; } + +export interface ContractRow { + Address: string; + 'Deployment Hash'?: string; +} diff --git a/packages/nouns-contracts/tasks/update-configs.ts b/packages/nouns-contracts/tasks/update-configs.ts index a15d37c5f6..c82bb44a79 100644 --- a/packages/nouns-contracts/tasks/update-configs.ts +++ b/packages/nouns-contracts/tasks/update-configs.ts @@ -1,5 +1,5 @@ import { task, types } from 'hardhat/config'; -import { ContractName, DeployedContract } from './types'; +import { ContractName, ContractNameDescriptorV1, DeployedContract } from './types'; import { readFileSync, writeFileSync } from 'fs'; import { execSync } from 'child_process'; import { join } from 'path'; @@ -7,7 +7,12 @@ import { join } from 'path'; task('update-configs', 'Write the deployed addresses to the SDK and subgraph configs') .addParam('contracts', 'Contract objects from the deployment', undefined, types.json) .setAction( - async ({ contracts }: { contracts: Record }, { ethers }) => { + async ( + { + contracts, + }: { contracts: Record }, + { ethers }, + ) => { const { name: network, chainId } = await ethers.provider.getNetwork(); // Update SDK addresses @@ -17,8 +22,12 @@ task('update-configs', 'Write the deployed addresses to the SDK and subgraph con addresses[chainId] = { nounsToken: contracts.NounsToken.address, nounsSeeder: contracts.NounsSeeder.address, - nounsDescriptor: contracts.NounsDescriptor.address, - nftDescriptor: contracts.NFTDescriptor.address, + nounsDescriptor: contracts.NounsDescriptorV2 + ? contracts.NounsDescriptorV2.address + : contracts.NounsDescriptor.address, + nftDescriptor: contracts.NFTDescriptorV2 + ? contracts.NFTDescriptorV2.address + : contracts.NFTDescriptor.address, nounsAuctionHouse: contracts.NounsAuctionHouse.address, nounsAuctionHouseProxy: contracts.NounsAuctionHouseProxy.address, nounsAuctionHouseProxyAdmin: contracts.NounsAuctionHouseProxyAdmin.address, diff --git a/packages/nouns-contracts/tasks/upgrade-descriptor-via-proposal.ts b/packages/nouns-contracts/tasks/upgrade-descriptor-via-proposal.ts new file mode 100644 index 0000000000..86455f7710 --- /dev/null +++ b/packages/nouns-contracts/tasks/upgrade-descriptor-via-proposal.ts @@ -0,0 +1,24 @@ +import { task } from 'hardhat/config'; + +task('upgrade-descriptor-via-proposal', 'Upgrade NounsToken to use Descriptor V2.') + .addParam('descriptor', 'The `NounsDescriptorV2` contract address') + .addParam('dao', 'The `NounsDAOProxy` contract address') + .addParam('token', 'The `NounsToken` contract address') + .setAction(async ({ descriptor, dao, token }, { ethers }) => { + const targets = [token as string]; + const values = [0]; + const signatures = ['setDescriptor(address)']; + const calldatas = [ethers.utils.defaultAbiCoder.encode(['address'], [descriptor])]; + + const gov = (await ethers.getContractFactory('NounsDAOLogicV1')).attach(dao); + const propTx = await gov.propose( + targets, + values, + signatures, + calldatas, + `# Upgrade NounsToken descriptor to V2\nThis proposal calls a function on NounsToken to set its descriptor to V2.`, + ); + await propTx.wait(); + + console.log('Proposal submitted!'); + }); diff --git a/packages/nouns-contracts/tasks/utils/index.ts b/packages/nouns-contracts/tasks/utils/index.ts new file mode 100644 index 0000000000..94cbaeb77a --- /dev/null +++ b/packages/nouns-contracts/tasks/utils/index.ts @@ -0,0 +1,40 @@ +import { ethers } from 'ethers'; +import { deflateRawSync } from 'zlib'; +import { ContractName, ContractRow, DeployedContract } from '../types'; + +export function dataToDescriptorInput(data: string[]): { + encodedCompressed: string; + originalLength: number; + itemCount: number; +} { + const abiEncoded = ethers.utils.defaultAbiCoder.encode(['bytes[]'], [data]); + const encodedCompressed = `0x${deflateRawSync( + Buffer.from(abiEncoded.substring(2), 'hex'), + ).toString('hex')}`; + + const originalLength = abiEncoded.substring(2).length / 2; + const itemCount = data.length; + + return { + encodedCompressed, + originalLength, + itemCount, + }; +} + +export function printContractsTable(contracts: Record) { + console.table( + Object.values(contracts).reduce( + (acc: Record, contract: DeployedContract) => { + acc[contract.name] = { + Address: contract.address, + }; + if (contract.instance?.deployTransaction) { + acc[contract.name]['Deployment Hash'] = contract.instance.deployTransaction.hash; + } + return acc; + }, + {}, + ), + ); +} diff --git a/packages/nouns-contracts/tasks/verify-etherscan.ts b/packages/nouns-contracts/tasks/verify-etherscan.ts index c80dff0fbb..c389e80f49 100644 --- a/packages/nouns-contracts/tasks/verify-etherscan.ts +++ b/packages/nouns-contracts/tasks/verify-etherscan.ts @@ -1,13 +1,5 @@ -import { Contract } from 'ethers'; import { task, types } from 'hardhat/config'; -import { ContractName } from './types'; - -interface VerifyArgs { - address: string; - instance?: Contract; - constructorArguments?: (string | number)[]; - libraries?: Record; -} +import { ContractName, DeployedContract } from './types'; // prettier-ignore // These contracts require a fully qualified name to be passed because @@ -15,22 +7,25 @@ interface VerifyArgs { const nameToFullyQualifiedName: Record = { NounsAuctionHouseProxy: 'contracts/proxies/NounsAuctionHouseProxy.sol:NounsAuctionHouseProxy', NounsAuctionHouseProxyAdmin: 'contracts/proxies/NounsAuctionHouseProxyAdmin.sol:NounsAuctionHouseProxyAdmin', + NounsDAOLogicV1Harness: 'contracts/test/NounsDAOLogicV1Harness.sol:NounsDAOLogicV1Harness' }; task('verify-etherscan', 'Verify the Solidity contracts on Etherscan') .addParam('contracts', 'Contract objects from the deployment', undefined, types.json) - .setAction(async ({ contracts }: { contracts: Record }, hre) => { - for (const [name, contract] of Object.entries(contracts)) { - console.log(`verifying ${name}...`); + .setAction(async ({ contracts }: { contracts: Record }, hre) => { + for (const [, contract] of Object.entries(contracts)) { + console.log(`verifying ${contract.name}...`); try { const code = await contract.instance?.provider.getCode(contract.address); if (code === '0x') { - console.log(`${name} contract deployment has not completed. waiting to verify...`); + console.log( + `${contract.name} contract deployment has not completed. waiting to verify...`, + ); await contract.instance?.deployed(); } await hre.run('verify:verify', { ...contract, - contract: nameToFullyQualifiedName[name], + contract: nameToFullyQualifiedName[contract.name], }); } catch ({ message }) { if ((message as string).includes('Reason: Already Verified')) { diff --git a/packages/nouns-contracts/test/auction.test.ts b/packages/nouns-contracts/test/auction.test.ts index 0bbad0fb14..39af599567 100644 --- a/packages/nouns-contracts/test/auction.test.ts +++ b/packages/nouns-contracts/test/auction.test.ts @@ -6,11 +6,11 @@ import { ethers, upgrades } from 'hardhat'; import { MaliciousBidder__factory as MaliciousBidderFactory, NounsAuctionHouse, - NounsDescriptor__factory as NounsDescriptorFactory, + NounsDescriptorV2__factory as NounsDescriptorV2Factory, NounsToken, WETH, } from '../typechain'; -import { deployNounsToken, deployWeth, populateDescriptor } from './utils'; +import { deployNounsToken, deployWeth, populateDescriptorV2 } from './utils'; chai.use(solidity); const { expect } = chai; @@ -51,7 +51,7 @@ describe('NounsAuctionHouse', () => { const descriptor = await nounsToken.descriptor(); - await populateDescriptor(NounsDescriptorFactory.connect(descriptor, deployer)); + await populateDescriptorV2(NounsDescriptorV2Factory.connect(descriptor, deployer)); await nounsToken.setMinter(nounsAuctionHouse.address); }); diff --git a/packages/nouns-contracts/test/descriptor.test.ts b/packages/nouns-contracts/test/descriptor.test.ts index 85d339aa67..9147dc1285 100644 --- a/packages/nouns-contracts/test/descriptor.test.ts +++ b/packages/nouns-contracts/test/descriptor.test.ts @@ -1,7 +1,7 @@ import chai from 'chai'; import { solidity } from 'ethereum-waffle'; import { NounsDescriptor } from '../typechain'; -import ImageData from '../files/image-data.json'; +import ImageData from '../files/image-data-v1.json'; import { LongestPart } from './types'; import { deployNounsDescriptor, populateDescriptor } from './utils'; import { ethers } from 'hardhat'; diff --git a/packages/nouns-contracts/test/descriptorV2.test.ts b/packages/nouns-contracts/test/descriptorV2.test.ts new file mode 100644 index 0000000000..59b9ec8b63 --- /dev/null +++ b/packages/nouns-contracts/test/descriptorV2.test.ts @@ -0,0 +1,128 @@ +import chai from 'chai'; +import { solidity } from 'ethereum-waffle'; +import { NounsDescriptorV2 } from '../typechain'; +import ImageData from '../files/image-data-v2.json'; +import { LongestPart } from './types'; +import { deployNounsDescriptorV2, populateDescriptorV2 } from './utils'; +import { ethers } from 'hardhat'; +import { appendFileSync } from 'fs'; + +chai.use(solidity); +const { expect } = chai; + +describe('NounsDescriptorV2', () => { + let nounsDescriptor: NounsDescriptorV2; + let snapshotId: number; + + const part: LongestPart = { + length: 0, + index: 0, + }; + const longest: Record = { + bodies: part, + accessories: part, + heads: part, + glasses: part, + }; + + before(async () => { + nounsDescriptor = await deployNounsDescriptorV2(); + + for (const [l, layer] of Object.entries(ImageData.images)) { + for (const [i, item] of layer.entries()) { + if (item.data.length > longest[l].length) { + longest[l] = { + length: item.data.length, + index: i, + }; + } + } + } + + await populateDescriptorV2(nounsDescriptor); + }); + + beforeEach(async () => { + snapshotId = await ethers.provider.send('evm_snapshot', []); + }); + + afterEach(async () => { + await ethers.provider.send('evm_revert', [snapshotId]); + }); + + it('should generate valid token uri metadata when data uris are disabled', async () => { + const BASE_URI = 'https://api.nouns.wtf/metadata/'; + + await nounsDescriptor.setBaseURI(BASE_URI); + await nounsDescriptor.toggleDataURIEnabled(); + + const tokenUri = await nounsDescriptor.tokenURI(0, { + background: 0, + body: longest.bodies.index, + accessory: longest.accessories.index, + head: longest.heads.index, + glasses: longest.glasses.index, + }); + expect(tokenUri).to.equal(`${BASE_URI}0`); + }); + + // Skipping until we resolve the CI memory issue + it('should generate valid token uri metadata when data uris are enabled [ @skip-on-coverage ]', async () => { + const tokenUri = await nounsDescriptor.tokenURI( + 0, + { + background: 0, + body: longest.bodies.index, + accessory: longest.accessories.index, + head: longest.heads.index, + glasses: longest.glasses.index, + }, + { gasLimit: 200_000_000 }, + ); + const { name, description, image } = JSON.parse( + Buffer.from(tokenUri.replace('data:application/json;base64,', ''), 'base64').toString( + 'ascii', + ), + ); + expect(name).to.equal('Noun 0'); + expect(description).to.equal('Noun 0 is a member of the Nouns DAO'); + expect(image).to.not.be.undefined; + }).timeout(1_000_000); + + // Unskip this test to validate the encoding of all parts. It ensures that no parts revert when building the token URI. + // This test also outputs a parts.html file, which can be visually inspected. + // Note that this test takes a long time to run. You must increase the mocha timeout to a large number. + it.skip('should generate valid token uri metadata for all supported parts when data uris are enabled', async () => { + console.log('Running... this may take a little while...'); + + const { bgcolors, images } = ImageData; + const { bodies, accessories, heads, glasses } = images; + const max = Math.max(bodies.length, accessories.length, heads.length, glasses.length); + for (let i = 0; i < max; i++) { + const tokenUri = await nounsDescriptor.tokenURI(i, { + background: Math.min(i, bgcolors.length - 1), + body: Math.min(i, bodies.length - 1), + accessory: Math.min(i, accessories.length - 1), + head: Math.min(i, heads.length - 1), + glasses: Math.min(i, glasses.length - 1), + }); + const { name, description, image } = JSON.parse( + Buffer.from(tokenUri.replace('data:application/json;base64,', ''), 'base64').toString( + 'ascii', + ), + ); + expect(name).to.equal(`Noun ${i}`); + expect(description).to.equal(`Noun ${i} is a member of the Nouns DAO`); + expect(image).to.not.be.undefined; + + appendFileSync( + 'parts.html', + Buffer.from(image.split(';base64,').pop(), 'base64').toString('ascii'), + ); + + if (i && i % Math.round(max / 10) === 0) { + console.log(`${Math.round((i / max) * 100)}% complete`); + } + } + }); +}); diff --git a/packages/nouns-contracts/test/end2end.test.ts b/packages/nouns-contracts/test/end2end.test.ts index 81f3c6bfae..7385e69a44 100644 --- a/packages/nouns-contracts/test/end2end.test.ts +++ b/packages/nouns-contracts/test/end2end.test.ts @@ -8,8 +8,8 @@ import { NounsToken, NounsAuctionHouse, NounsAuctionHouse__factory as NounsAuctionHouseFactory, - NounsDescriptor, - NounsDescriptor__factory as NounsDescriptorFactory, + NounsDescriptorV2, + NounsDescriptorV2__factory as NounsDescriptorV2Factory, NounsDAOProxy__factory as NounsDaoProxyFactory, NounsDAOLogicV1, NounsDAOLogicV1__factory as NounsDaoLogicV1Factory, @@ -20,7 +20,7 @@ import { import { deployNounsToken, deployWeth, - populateDescriptor, + populateDescriptorV2, address, encodeParameters, advanceBlocks, @@ -35,7 +35,7 @@ const { expect } = chai; let nounsToken: NounsToken; let nounsAuctionHouse: NounsAuctionHouse; -let descriptor: NounsDescriptor; +let descriptor: NounsDescriptorV2; let weth: WETH; let gov: NounsDAOLogicV1; let timelock: NounsDAOExecutor; @@ -109,9 +109,9 @@ async function deploy() { await nounsToken.setMinter(nounsAuctionHouse.address); // 4. POPULATE body parts - descriptor = NounsDescriptorFactory.connect(await nounsToken.descriptor(), deployer); + descriptor = NounsDescriptorV2Factory.connect(await nounsToken.descriptor(), deployer); - await populateDescriptor(descriptor); + await populateDescriptorV2(descriptor); // 5a. CALCULATE Gov Delegate, takes place after 2 transactions const calculatedGovDelegatorAddress = ethers.utils.getContractAddress({ diff --git a/packages/nouns-contracts/test/foundry/DescriptorUpgrade.t.sol b/packages/nouns-contracts/test/foundry/DescriptorUpgrade.t.sol new file mode 100644 index 0000000000..c0b54fbe55 --- /dev/null +++ b/packages/nouns-contracts/test/foundry/DescriptorUpgrade.t.sol @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.6; + +import 'forge-std/Test.sol'; +import { DeployUtils } from './helpers/DeployUtils.sol'; +import { NounsToken } from '../../contracts/NounsToken.sol'; +import { NounsDescriptor } from '../../contracts/NounsDescriptor.sol'; +import { NounsDescriptorV2 } from '../../contracts/NounsDescriptorV2.sol'; +import { NounsSeeder } from '../../contracts/NounsSeeder.sol'; +import { IProxyRegistry } from '../../contracts/external/opensea/IProxyRegistry.sol'; +import { INounsSeeder } from '../../contracts/interfaces/INounsSeeder.sol'; +import { Base64 } from 'base64-sol/base64.sol'; + +contract DescriptorUpgradeTest is Test, DeployUtils { + NounsToken nounsToken; + address minter = address(2); + NounsDescriptor descriptor; + NounsDescriptorV2 descriptorV2; + + function setUp() public { + IProxyRegistry proxyRegistry = IProxyRegistry(address(0)); + address noundersDAO = address(1); + + descriptor = new NounsDescriptor(); + _populateDescriptor(descriptor); + nounsToken = new NounsToken(noundersDAO, minter, descriptor, new NounsSeeder(), proxyRegistry); + + descriptorV2 = _deployAndPopulateV2(); + } + + function testUpgradeToV2MaintainsTokenURI() public { + uint256 tokensToMint = 10; + for (uint256 i = 0; i < tokensToMint; i++) { + vm.prank(minter); + nounsToken.mint(); + } + + for (uint256 i = 0; i < tokensToMint; i++) { + (, uint48 body, , uint48 head, uint48 glasses) = nounsToken.seeds(i); + if ( + body == 8 || + head == 11 || + head == 154 || + glasses == 8 || + glasses == 14 || + glasses == 18 || + glasses == 19 + ) { + // these images were fixed prior to v2 deployment so not comparing these + continue; + } + + nounsToken.setDescriptor(descriptor); + string memory tokenURIwithV1 = nounsToken.tokenURI(i); + + nounsToken.setDescriptor(descriptorV2); + string memory tokenURIwithV2 = nounsToken.tokenURI(i); + + assertEq(tokenURIwithV2, tokenURIwithV1); + } + } + + /// @dev exports and html file with svgs to inspect manually. quite slow, so ignored by default + function ignore_testSaveHtmlFileWithSvgs() public { + NounsDescriptorV2 d = _deployAndPopulateV2(); + uint256 max = d.headCount(); + for (uint256 i = 0; i < max; i++) { + string memory svg = d.generateSVGImage( + INounsSeeder.Seed({ + background: uint48(i % d.backgroundCount()), + body: uint48(i % d.bodyCount()), + accessory: uint48(i % d.accessoryCount()), + head: uint48(i % d.headCount()), + glasses: uint48(i % d.glassesCount()) + }) + ); + + string memory img = string.concat('\n'); + + string[] memory inputs = new string[](3); + inputs[0] = './test/write-to-file.sh'; + inputs[1] = 'svgs.html'; + inputs[2] = img; + vm.ffi(inputs); + } + } +} diff --git a/packages/nouns-contracts/test/foundry/DescriptorUpgradeViaProposal.t.sol b/packages/nouns-contracts/test/foundry/DescriptorUpgradeViaProposal.t.sol new file mode 100644 index 0000000000..b717bafb7e --- /dev/null +++ b/packages/nouns-contracts/test/foundry/DescriptorUpgradeViaProposal.t.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.6; + +import 'forge-std/Test.sol'; +import { DeployUtils } from './helpers/DeployUtils.sol'; +import { NounsToken } from '../../contracts/NounsToken.sol'; +import { NounsDescriptorV2 } from '../../contracts/NounsDescriptorV2.sol'; +import { NounsDAOLogicV1 } from '../../contracts/governance/NounsDAOLogicV1.sol'; + +contract DescriptorUpgradeViaProposalTest is Test, DeployUtils { + NounsToken nounsToken; + NounsDAOLogicV1 dao; + address minter = address(2); + address tokenHolder = address(1337); + + function setUp() public { + address noundersDAO = address(42); + (address tokenAddress, address daoAddress) = _deployTokenAndDAOAndPopulateDescriptor( + noundersDAO, + noundersDAO, + minter + ); + nounsToken = NounsToken(tokenAddress); + dao = NounsDAOLogicV1(daoAddress); + + vm.startPrank(minter); + nounsToken.mint(); + nounsToken.transferFrom(minter, tokenHolder, 1); + vm.stopPrank(); + } + + function testUpgradeToV2ViaProposal() public { + NounsDescriptorV2 descriptorV2 = _deployAndPopulateV2(); + + address[] memory targets = new address[](1); + targets[0] = address(nounsToken); + uint256[] memory values = new uint256[](1); + values[0] = 0; + string[] memory signatures = new string[](1); + signatures[0] = 'setDescriptor(address)'; + bytes[] memory calldatas = new bytes[](1); + calldatas[0] = abi.encode(address(descriptorV2)); + + uint256 blockNumber = block.number + 1; + vm.roll(blockNumber); + + vm.startPrank(tokenHolder); + dao.propose(targets, values, signatures, calldatas, 'upgrade descriptor'); + blockNumber += VOTING_DELAY + 1; + vm.roll(blockNumber); + dao.castVote(1, 1); + vm.stopPrank(); + + blockNumber += VOTING_PERIOD + 1; + vm.roll(blockNumber); + dao.queue(1); + + vm.warp(block.timestamp + TIMELOCK_DELAY + 1); + dao.execute(1); + + assertEq(address(nounsToken.descriptor()), address(descriptorV2)); + } +} diff --git a/packages/nouns-contracts/test/foundry/NounsArt.t.sol b/packages/nouns-contracts/test/foundry/NounsArt.t.sol new file mode 100644 index 0000000000..cb04f415ec --- /dev/null +++ b/packages/nouns-contracts/test/foundry/NounsArt.t.sol @@ -0,0 +1,685 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.6; + +import 'forge-std/Test.sol'; +import { NounsArt } from '../../contracts/NounsArt.sol'; +import { INounsArt } from '../../contracts/interfaces/INounsArt.sol'; +import { SSTORE2 } from '../../contracts/libs/SSTORE2.sol'; +import { DescriptorHelpers } from './helpers/DescriptorHelpers.sol'; +import { Inflator } from '../../contracts/Inflator.sol'; +import { IInflator } from '../../contracts/interfaces/IInflator.sol'; + +contract NounsArtTest is Test, DescriptorHelpers { + event BackgroundsAdded(uint256 count); + + event PaletteSet(uint8 paletteIndex); + + event BodiesAdded(uint16 count); + + event AccessoriesAdded(uint16 count); + + event HeadsAdded(uint16 count); + + event GlassesAdded(uint16 count); + + event DescriptorUpdated(address oldDescriptor, address newDescriptor); + + event InflatorUpdated(address oldInflator, address newInflator); + + NounsArt art; + address descriptor = address(1); + IInflator inflator; + + function setUp() public { + inflator = new Inflator(); + art = new NounsArt(descriptor, inflator); + } + + /// + /// setDescriptor + /// + + function testSetDescriptorRevertsIfSenderNotDescriptor() public { + vm.expectRevert(INounsArt.SenderIsNotDescriptor.selector); + art.setDescriptor(address(2)); + } + + function testSetDescriptorWorks() public { + address newDescriptor = address(2); + + vm.expectEmit(true, true, true, true); + emit DescriptorUpdated(descriptor, newDescriptor); + + vm.prank(descriptor); + art.setDescriptor(newDescriptor); + + assertEq(art.descriptor(), newDescriptor); + } + + /// + /// setInflator + /// + + function testSetInflatorRevertsIfSenderNotDescriptor() public { + vm.expectRevert(INounsArt.SenderIsNotDescriptor.selector); + art.setInflator(IInflator(address(2))); + } + + function testSetInflatorWorks() public { + IInflator newInflator = IInflator(address(2)); + + vm.expectEmit(true, true, true, true); + emit InflatorUpdated(address(inflator), address(newInflator)); + + vm.prank(descriptor); + art.setInflator(newInflator); + + assertEq(address(art.inflator()), address(newInflator)); + } + + /// + /// addBackground, addManyBackgrounds, backgroundsCount, backgrounds + /// + + function testBackgroundsRevertsGivenNoArt() public { + vm.expectRevert(); + art.backgrounds(0); + } + + function testAddBackgroundRevertsIfSenderNotDescriptor() public { + vm.expectRevert(INounsArt.SenderIsNotDescriptor.selector); + art.addBackground('ffffff'); + } + + function testAddBackgroundWorks() public { + vm.prank(descriptor); + vm.expectEmit(true, true, true, true); + emit BackgroundsAdded(1); + + art.addBackground('ffffff'); + + assertEq(art.backgroundsCount(), 1); + assertEq(art.backgrounds(0), 'ffffff'); + } + + function testAddManyBackgroundsRevertsIfSenderNotDescriptor() public { + string[] memory bgs = new string[](2); + bgs[0] = 'ffffff'; + bgs[1] = '000000'; + + vm.expectRevert(INounsArt.SenderIsNotDescriptor.selector); + art.addManyBackgrounds(bgs); + } + + function testAddManyBackgroundsWorks() public { + string[] memory bgs = new string[](2); + bgs[0] = 'ffffff'; + bgs[1] = '000000'; + + vm.expectEmit(true, true, true, true); + emit BackgroundsAdded(2); + + vm.prank(descriptor); + art.addManyBackgrounds(bgs); + + assertEq(art.backgroundsCount(), 2); + assertEq(art.backgrounds(0), 'ffffff'); + assertEq(art.backgrounds(1), '000000'); + } + + /// + /// setPalette, palettes, palettesPointers, setPalettePointer + /// + + function testPalettesRevertsGivenNoArt() public { + vm.expectRevert(INounsArt.PaletteNotFound.selector); + art.palettes(0); + } + + function testSetPaletteRevertsIfSenderNotDescriptor() public { + vm.expectRevert(INounsArt.SenderIsNotDescriptor.selector); + art.setPalette(0, hex'ffffff'); + } + + function testSetPalettePointerRevertsIfSenderNotDescriptor() public { + address pointer = SSTORE2.write(hex'ffffff000000'); + vm.expectRevert(INounsArt.SenderIsNotDescriptor.selector); + art.setPalettePointer(0, pointer); + } + + function testSetPaletteWorks() public { + vm.expectEmit(true, true, true, true); + emit PaletteSet(0); + vm.expectEmit(true, true, true, true); + emit PaletteSet(1); + + bytes memory palette0 = hex'ffffffc5b9a1'; + bytes memory palette1 = hex'cfc2ab63a0f9'; + vm.startPrank(descriptor); + art.setPalette(0, palette0); + art.setPalette(1, palette1); + vm.stopPrank(); + + assertEq(art.palettes(0), palette0); + assertEq(art.palettes(1), palette1); + + assertEq(SSTORE2.read(art.palettesPointers(0)), palette0); + assertEq(SSTORE2.read(art.palettesPointers(1)), palette1); + } + + function testSetPalettePointerWorks() public { + vm.expectEmit(true, true, true, true); + emit PaletteSet(0); + vm.expectEmit(true, true, true, true); + emit PaletteSet(1); + + address pointer0 = SSTORE2.write(hex'ffffffc5b9a1'); + address pointer1 = SSTORE2.write(hex'cfc2ab63a0f9'); + vm.startPrank(descriptor); + art.setPalettePointer(0, pointer0); + art.setPalettePointer(1, pointer1); + vm.stopPrank(); + + assertEq(art.palettes(0), hex'ffffffc5b9a1'); + assertEq(art.palettes(1), hex'cfc2ab63a0f9'); + + assertEq(art.palettesPointers(0), pointer0); + assertEq(art.palettesPointers(1), pointer1); + } + + function testSetPaletteUpdatesAnExistingPalette() public { + bytes memory paletteV1 = hex'ffffffc5b9a1'; + bytes memory paletteV2 = hex'cfc2ab63a0f9'; + + vm.expectEmit(true, true, true, true); + emit PaletteSet(0); + vm.prank(descriptor); + art.setPalette(0, paletteV1); + assertEq(art.palettes(0), paletteV1); + assertEq(SSTORE2.read(art.palettesPointers(0)), paletteV1); + + vm.expectEmit(true, true, true, true); + emit PaletteSet(0); + vm.prank(descriptor); + art.setPalette(0, paletteV2); + assertEq(art.palettes(0), paletteV2); + assertEq(SSTORE2.read(art.palettesPointers(0)), paletteV2); + } + + function testSetPalettePointerUpdatesAnExistingPalette() public { + address paletteV1Pointer = SSTORE2.write(hex'ffffffc5b9a1'); + address paletteV2Pointer = SSTORE2.write(hex'cfc2ab63a0f9'); + + vm.expectEmit(true, true, true, true); + emit PaletteSet(0); + vm.prank(descriptor); + art.setPalettePointer(0, paletteV1Pointer); + assertEq(art.palettes(0), hex'ffffffc5b9a1'); + assertEq(art.palettesPointers(0), paletteV1Pointer); + + vm.expectEmit(true, true, true, true); + emit PaletteSet(0); + vm.prank(descriptor); + art.setPalettePointer(0, paletteV2Pointer); + assertEq(art.palettes(0), hex'cfc2ab63a0f9'); + assertEq(art.palettesPointers(0), paletteV2Pointer); + } + + function testCannotSetEmptyPalette() public { + vm.prank(descriptor); + vm.expectRevert(INounsArt.EmptyPalette.selector); + art.setPalette(0, new bytes(0)); + } + + function testCannotSetPaletteWithLengthNotAMultipleOf3() public { + vm.startPrank(descriptor); + + vm.expectRevert(INounsArt.BadPaletteLength.selector); + art.setPalette(0, new bytes(1)); + + vm.expectRevert(INounsArt.BadPaletteLength.selector); + art.setPalette(0, new bytes(2)); + + // expected to work + art.setPalette(0, new bytes(3)); + + vm.expectRevert(INounsArt.BadPaletteLength.selector); + art.setPalette(0, new bytes(4)); + + vm.expectRevert(INounsArt.BadPaletteLength.selector); + art.setPalette(0, new bytes(5)); + + // expected to work + art.setPalette(0, new bytes(6)); + + vm.expectRevert(INounsArt.BadPaletteLength.selector); + art.setPalette(0, new bytes(7)); + + vm.stopPrank(); + } + + function testCannotSetPaletteWithMoreThan256Colors() public { + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadPaletteLength.selector); + art.setPalette(0, new bytes(769)); + } + + /// + /// addBodies, addBodiesFromPointer, bodies, getBodiesTrait + /// + + function testBodiesRevertsGivenNoArt() public { + vm.expectRevert(INounsArt.ImageNotFound.selector); + art.bodies(0); + } + + function testAddBodiesRevertsIfSenderNotDescriptor() public { + vm.expectRevert(INounsArt.SenderIsNotDescriptor.selector); + art.addBodies(hex'123456', uint80(12), uint16(1)); + } + + function testCannotAddBodiesWithNoBytes() public { + vm.prank(descriptor); + vm.expectRevert(INounsArt.EmptyBytes.selector); + art.addBodies(new bytes(0), 0, 0); + } + + function testCannotAddBodiesWithZeroDecompressedLength() public { + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadDecompressedLength.selector); + art.addBodies(FIRST_TWO_IMAGES_COMPRESSED, 0, 0); + } + + function testCannotAddBodiesWithZeroImageCount() public { + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadImageCount.selector); + art.addBodies(FIRST_TWO_IMAGES_COMPRESSED, FIRST_TWO_IMAGES_DEFLATED_LENGTH, 0); + } + + function testAddBodiesWorksWithMultiplePages() public { + assertEq(art.getBodiesTrait().storedImagesCount, 0); + vm.expectEmit(true, true, true, true); + emit BodiesAdded(2); + vm.expectEmit(true, true, true, true); + emit BodiesAdded(2); + + vm.startPrank(descriptor); + art.addBodies(FIRST_TWO_IMAGES_COMPRESSED, FIRST_TWO_IMAGES_DEFLATED_LENGTH, uint16(2)); + art.addBodies(NEXT_TWO_IMAGES_COMPRESSED, NEXT_TWO_IMAGES_DEFLATED_LENGTH, uint16(2)); + vm.stopPrank(); + + _assertBodiesStoredOK(); + } + + function testCannotAddBodiesFromPointerWithZeroDecompressedLength() public { + address pointer = SSTORE2.write(FIRST_TWO_IMAGES_COMPRESSED); + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadDecompressedLength.selector); + art.addBodiesFromPointer(pointer, 0, 0); + } + + function testCannotAddBodiesFromPointerWithZeroImageCount() public { + address pointer = SSTORE2.write(FIRST_TWO_IMAGES_COMPRESSED); + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadImageCount.selector); + art.addBodiesFromPointer(pointer, FIRST_TWO_IMAGES_DEFLATED_LENGTH, 0); + } + + function testAddBodiesFromPointerWorksWithMultiplePages() public { + assertEq(art.getBodiesTrait().storedImagesCount, 0); + vm.expectEmit(true, true, true, true); + emit BodiesAdded(2); + vm.expectEmit(true, true, true, true); + emit BodiesAdded(2); + + vm.startPrank(descriptor); + art.addBodiesFromPointer( + SSTORE2.write(FIRST_TWO_IMAGES_COMPRESSED), + FIRST_TWO_IMAGES_DEFLATED_LENGTH, + uint16(2) + ); + art.addBodiesFromPointer(SSTORE2.write(NEXT_TWO_IMAGES_COMPRESSED), NEXT_TWO_IMAGES_DEFLATED_LENGTH, uint16(2)); + vm.stopPrank(); + + _assertBodiesStoredOK(); + } + + /// + /// addAccessories, addAccessoriesFromPointer, accessories, getAccessoriesTrait + /// + + function testAccessoriesRevertsGivenNoArt() public { + vm.expectRevert(INounsArt.ImageNotFound.selector); + art.accessories(0); + } + + function testAddAccessoriesRevertsIfSenderNotDescriptor() public { + vm.expectRevert(INounsArt.SenderIsNotDescriptor.selector); + art.addAccessories(hex'123456', uint80(12), uint16(1)); + } + + function testCannotAddAccessoriesWithNoBytes() public { + vm.prank(descriptor); + vm.expectRevert(INounsArt.EmptyBytes.selector); + art.addAccessories(new bytes(0), 0, 0); + } + + function testCannotAddAccessoriesWithZeroDecompressedLength() public { + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadDecompressedLength.selector); + art.addAccessories(FIRST_TWO_IMAGES_COMPRESSED, 0, 0); + } + + function testCannotAddAccessoriesWithZeroImageCount() public { + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadImageCount.selector); + art.addAccessories(FIRST_TWO_IMAGES_COMPRESSED, FIRST_TWO_IMAGES_DEFLATED_LENGTH, 0); + } + + function testAddAccessoriesWorksWithMultiplePages() public { + assertEq(art.getAccessoriesTrait().storedImagesCount, 0); + vm.expectEmit(true, true, true, true); + emit AccessoriesAdded(2); + vm.expectEmit(true, true, true, true); + emit AccessoriesAdded(2); + + vm.startPrank(descriptor); + art.addAccessories(FIRST_TWO_IMAGES_COMPRESSED, FIRST_TWO_IMAGES_DEFLATED_LENGTH, uint16(2)); + art.addAccessories(NEXT_TWO_IMAGES_COMPRESSED, NEXT_TWO_IMAGES_DEFLATED_LENGTH, uint16(2)); + vm.stopPrank(); + + _assertAccessoriesStoredOK(); + } + + function testCannotAddAccessoriesFromPointerWithZeroDecompressedLength() public { + address pointer = SSTORE2.write(FIRST_TWO_IMAGES_COMPRESSED); + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadDecompressedLength.selector); + art.addAccessoriesFromPointer(pointer, 0, 0); + } + + function testCannotAddAccessoriesFromPointerWithZeroImageCount() public { + address pointer = SSTORE2.write(FIRST_TWO_IMAGES_COMPRESSED); + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadImageCount.selector); + art.addAccessoriesFromPointer(pointer, FIRST_TWO_IMAGES_DEFLATED_LENGTH, 0); + } + + function testAddAccessoriesFromPointerWorksWithMultiplePages() public { + assertEq(art.getAccessoriesTrait().storedImagesCount, 0); + vm.expectEmit(true, true, true, true); + emit AccessoriesAdded(2); + vm.expectEmit(true, true, true, true); + emit AccessoriesAdded(2); + + vm.startPrank(descriptor); + art.addAccessoriesFromPointer( + SSTORE2.write(FIRST_TWO_IMAGES_COMPRESSED), + FIRST_TWO_IMAGES_DEFLATED_LENGTH, + uint16(2) + ); + art.addAccessoriesFromPointer( + SSTORE2.write(NEXT_TWO_IMAGES_COMPRESSED), + NEXT_TWO_IMAGES_DEFLATED_LENGTH, + uint16(2) + ); + vm.stopPrank(); + + _assertAccessoriesStoredOK(); + } + + /// + /// addHeads, addHeadsFromPointer, heads, getHeadsTrait + /// + + function testHeadsRevertsGivenNoArt() public { + vm.expectRevert(INounsArt.ImageNotFound.selector); + art.heads(0); + } + + function testAddHeadsRevertsIfSenderNotDescriptor() public { + vm.expectRevert(INounsArt.SenderIsNotDescriptor.selector); + art.addHeads(hex'123456', uint80(12), uint16(1)); + } + + function testCannotAddHeadsWithNoBytes() public { + vm.prank(descriptor); + vm.expectRevert(INounsArt.EmptyBytes.selector); + art.addHeads(new bytes(0), 0, 0); + } + + function testCannotAddHeadsWithZeroDecompressedLength() public { + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadDecompressedLength.selector); + art.addHeads(FIRST_TWO_IMAGES_COMPRESSED, 0, 0); + } + + function testCannotAddHeadsWithZeroImageCount() public { + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadImageCount.selector); + art.addHeads(FIRST_TWO_IMAGES_COMPRESSED, FIRST_TWO_IMAGES_DEFLATED_LENGTH, 0); + } + + function testAddHeadsWorksWithMultiplePages() public { + assertEq(art.getHeadsTrait().storedImagesCount, 0); + vm.expectEmit(true, true, true, true); + emit HeadsAdded(2); + vm.expectEmit(true, true, true, true); + emit HeadsAdded(2); + + vm.startPrank(descriptor); + art.addHeads(FIRST_TWO_IMAGES_COMPRESSED, FIRST_TWO_IMAGES_DEFLATED_LENGTH, uint16(2)); + art.addHeads(NEXT_TWO_IMAGES_COMPRESSED, NEXT_TWO_IMAGES_DEFLATED_LENGTH, uint16(2)); + vm.stopPrank(); + + _assertHeadsStoredOK(); + } + + function testCannotAddHeadsFromPointerWithZeroDecompressedLength() public { + address pointer = SSTORE2.write(FIRST_TWO_IMAGES_COMPRESSED); + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadDecompressedLength.selector); + art.addHeadsFromPointer(pointer, 0, 0); + } + + function testCannotAddHeadsFromPointerWithZeroImageCount() public { + address pointer = SSTORE2.write(FIRST_TWO_IMAGES_COMPRESSED); + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadImageCount.selector); + art.addHeadsFromPointer(pointer, FIRST_TWO_IMAGES_DEFLATED_LENGTH, 0); + } + + function testAddHeadsFromPointerWorksWithMultiplePages() public { + assertEq(art.getHeadsTrait().storedImagesCount, 0); + vm.expectEmit(true, true, true, true); + emit HeadsAdded(2); + vm.expectEmit(true, true, true, true); + emit HeadsAdded(2); + + vm.startPrank(descriptor); + art.addHeadsFromPointer( + SSTORE2.write(FIRST_TWO_IMAGES_COMPRESSED), + FIRST_TWO_IMAGES_DEFLATED_LENGTH, + uint16(2) + ); + art.addHeadsFromPointer(SSTORE2.write(NEXT_TWO_IMAGES_COMPRESSED), NEXT_TWO_IMAGES_DEFLATED_LENGTH, uint16(2)); + vm.stopPrank(); + + _assertHeadsStoredOK(); + } + + /// + /// addGlasses, addGlassesFromPointer, glasses, getGlassesTrait + /// + + function testGlassesRevertsGivenNoArt() public { + vm.expectRevert(INounsArt.ImageNotFound.selector); + art.glasses(0); + } + + function testAddGlassesRevertsIfSenderNotDescriptor() public { + vm.expectRevert(INounsArt.SenderIsNotDescriptor.selector); + art.addGlasses(hex'123456', uint80(12), uint16(1)); + } + + function testCannotAddGlassesWithNoBytes() public { + vm.prank(descriptor); + vm.expectRevert(INounsArt.EmptyBytes.selector); + art.addGlasses(new bytes(0), 0, 0); + } + + function testCannotAddGlassesWithZeroDecompressedLength() public { + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadDecompressedLength.selector); + art.addGlasses(FIRST_TWO_IMAGES_COMPRESSED, 0, 0); + } + + function testCannotAddGlassesWithZeroImageCount() public { + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadImageCount.selector); + art.addGlasses(FIRST_TWO_IMAGES_COMPRESSED, FIRST_TWO_IMAGES_DEFLATED_LENGTH, 0); + } + + function testAddGlassesWorksWithMultiplePages() public { + assertEq(art.getGlassesTrait().storedImagesCount, 0); + vm.expectEmit(true, true, true, true); + emit GlassesAdded(2); + vm.expectEmit(true, true, true, true); + emit GlassesAdded(2); + + vm.startPrank(descriptor); + art.addGlasses(FIRST_TWO_IMAGES_COMPRESSED, FIRST_TWO_IMAGES_DEFLATED_LENGTH, uint16(2)); + art.addGlasses(NEXT_TWO_IMAGES_COMPRESSED, NEXT_TWO_IMAGES_DEFLATED_LENGTH, uint16(2)); + vm.stopPrank(); + + _assertGlassesStoredOK(); + } + + function testCannotAddGlassesFromPointerWithZeroDecompressedLength() public { + address pointer = SSTORE2.write(FIRST_TWO_IMAGES_COMPRESSED); + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadDecompressedLength.selector); + art.addGlassesFromPointer(pointer, 0, 0); + } + + function testCannotAddGlassesFromPointerWithZeroImageCount() public { + address pointer = SSTORE2.write(FIRST_TWO_IMAGES_COMPRESSED); + vm.prank(descriptor); + vm.expectRevert(INounsArt.BadImageCount.selector); + art.addGlassesFromPointer(pointer, FIRST_TWO_IMAGES_DEFLATED_LENGTH, 0); + } + + function testAddGlassesFromPointerWorksWithMultiplePages() public { + assertEq(art.getHeadsTrait().storedImagesCount, 0); + vm.expectEmit(true, true, true, true); + emit GlassesAdded(2); + + vm.startPrank(descriptor); + art.addGlassesFromPointer( + SSTORE2.write(FIRST_TWO_IMAGES_COMPRESSED), + FIRST_TWO_IMAGES_DEFLATED_LENGTH, + uint16(2) + ); + art.addGlassesFromPointer( + SSTORE2.write(NEXT_TWO_IMAGES_COMPRESSED), + NEXT_TWO_IMAGES_DEFLATED_LENGTH, + uint16(2) + ); + vm.stopPrank(); + + _assertGlassesStoredOK(); + } + + function testAddGlassesWorksWithSeveralPages() public { + uint256 pageCount = 5; + (bytes memory glasses, uint80 glassesLength, uint16 glassesCount) = getGlassesPage(); + vm.startPrank(descriptor); + for (uint256 i = 0; i < pageCount; i++) { + art.addGlasses(glasses, glassesLength, glassesCount); + } + vm.stopPrank(); + + assertEq(art.getGlassesTrait().storagePages.length, 5); + + for (uint256 i = 0; i < glassesCount; i++) { + bytes memory glassesPage0 = art.glasses(i); + for (uint256 j = 1; j < pageCount; j++) { + bytes memory sameGlassesDifferentPage = art.glasses(i + glassesCount * j); + assertEq(sameGlassesDifferentPage, glassesPage0); + } + } + } + + /// + /// INTERNAL + /// + + function _assertBodiesStoredOK() internal { + assertEq(art.getBodiesTrait().storedImagesCount, 4); + + // These hard-coded values are copied from image-data.json -> images -> BODIES -> the first items + assertEq(art.bodies(0), IMAGE_0); + assertEq(art.bodies(1), IMAGE_1); + + // These hard-coded values are copied from image-data.json -> images -> HEADS -> the first items + assertEq(art.bodies(2), IMAGE_2); + assertEq(art.bodies(3), IMAGE_3); + } + + function _assertAccessoriesStoredOK() internal { + assertEq(art.getAccessoriesTrait().storedImagesCount, 4); + + // These hard-coded values are copied from image-data.json -> images -> BODIES -> the first items + assertEq(art.accessories(0), IMAGE_0); + assertEq(art.accessories(1), IMAGE_1); + + // These hard-coded values are copied from image-data.json -> images -> HEADS -> the first items + assertEq(art.accessories(2), IMAGE_2); + assertEq(art.accessories(3), IMAGE_3); + } + + function _assertHeadsStoredOK() internal { + assertEq(art.getHeadsTrait().storedImagesCount, 4); + + // These hard-coded values are copied from image-data.json -> images -> BODIES -> the first items + assertEq(art.heads(0), IMAGE_0); + assertEq(art.heads(1), IMAGE_1); + + // These hard-coded values are copied from image-data.json -> images -> HEADS -> the first items + assertEq(art.heads(2), IMAGE_2); + assertEq(art.heads(3), IMAGE_3); + } + + function _assertGlassesStoredOK() internal { + assertEq(art.getGlassesTrait().storedImagesCount, 4); + + // These hard-coded values are copied from image-data.json -> images -> BODIES -> the first items + assertEq(art.glasses(0), IMAGE_0); + assertEq(art.glasses(1), IMAGE_1); + + // These hard-coded values are copied from image-data.json -> images -> HEADS -> the first items + assertEq(art.glasses(2), IMAGE_2); + assertEq(art.glasses(3), IMAGE_3); + } + + // the value below was copied from running the hardhat task `descriptor-art-to-console` with + // the parameter `count` set to 2, and taking the bodies values. + bytes constant FIRST_TWO_IMAGES_COMPRESSED = + hex'6360c00b14f04b33301190772020bf8080bc3983a8b83c271f130432313132701345123016dd7c6608646206ea258a841b0000'; + uint80 constant FIRST_TWO_IMAGES_DEFLATED_LENGTH = 320; + + // the value below was copied from running the hardhat task `descriptor-art-to-console` with + // the parameter `count` set to 2 and `start` set to 2, and taking the heads values. + bytes constant NEXT_TWO_IMAGES_COMPRESSED = + hex'858f410a02310c4593b4d38ee0548551145cb8ea21baf24e82eb8c77f23e1ec5df0e232a3a0dfcfcd7fc4253a2d93acdc72495fc5cc91f95fc42cda17786ac2ef1d6425b620a6ac12b15f01a7de4a9b386e1bf9bd25979605d0d5cc86877636db4c34c68a395953eea4ee6d81b4721353476ec9602647e1236f160483ce7ad3c4749d6bb6831e388337e955da2f31692d7acc5ad76e4b4cb9eb2b6dfe44b3a39ed21efcd351416cab3b77a02'; + uint80 constant NEXT_TWO_IMAGES_DEFLATED_LENGTH = 512; + + bytes constant IMAGE_0 = + hex'0015171f090e020e020e020e02020201000b02020201000b02020201000b02020201000b02020201000b02020201000b02020201000b02'; + bytes constant IMAGE_1 = + hex'0015171f090e030e030e030e03020301000b03020301000b03020301000b03020301000b03020301000b03020301000b03020301000b03'; + bytes constant IMAGE_2 = + hex'0005191406030004800c0002000980080001000e80040002000f80020001001080020002000f80020002000f800200020001800e810200020001800e810200020001800e810200020001800e81020003800e8102000180018101800f8101000180018103800d82018005800d81018002001180'; + bytes constant IMAGE_3 = + hex'00031c140306000e3a050006000e3a05000400023a0e00023a03000400023a0e00023a03000400023a0e00023a030002000207023a0e07023a02070100020001070126023a040706260407023a01260107010001000126010702260607042606070226010701000100012608070626080701000100013a16070100013a0100013a15070100013a0100013a15070100013a0107013a1607013a0107013a1607010018070100070703760e0701001807020016070100'; +} diff --git a/packages/nouns-contracts/test/foundry/NounsDescriptorV2.t.sol b/packages/nouns-contracts/test/foundry/NounsDescriptorV2.t.sol new file mode 100644 index 0000000000..e1de02963f --- /dev/null +++ b/packages/nouns-contracts/test/foundry/NounsDescriptorV2.t.sol @@ -0,0 +1,485 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.6; + +import 'forge-std/Test.sol'; +import { NounsDescriptorV2 } from '../../contracts/NounsDescriptorV2.sol'; +import { SVGRenderer } from '../../contracts/SVGRenderer.sol'; +import { ISVGRenderer } from '../../contracts/interfaces/ISVGRenderer.sol'; +import { INounsSeeder } from '../../contracts/interfaces/INounsSeeder.sol'; +import { NounsArt } from '../../contracts/NounsArt.sol'; +import { INounsArt } from '../../contracts/interfaces/INounsArt.sol'; +import { Base64 } from 'base64-sol/base64.sol'; +import { Inflator } from '../../contracts/Inflator.sol'; +import { IInflator } from '../../contracts/interfaces/IInflator.sol'; + +contract NounsDescriptorV2Test is Test { + NounsDescriptorV2 descriptor; + NounsArt art; + SVGRenderer renderer; + + function setUp() public { + renderer = new SVGRenderer(); + descriptor = new NounsDescriptorV2(INounsArt(address(0)), renderer); + art = new NounsArt(address(descriptor), new Inflator()); + descriptor.setArt(art); + } + + function testCannotSetArtIfNotOwner() public { + vm.prank(address(1)); + vm.expectRevert(bytes('Ownable: caller is not the owner')); + descriptor.setArt(INounsArt(address(2))); + } + + function testCannotSetArtIfPartsAreLocked() public { + descriptor.lockParts(); + vm.expectRevert(bytes('Parts are locked')); + descriptor.setArt(INounsArt(address(2))); + } + + function testSetArtWorks() public { + descriptor.setArt(INounsArt(address(2))); + assertEq(address(descriptor.art()), address(2)); + } + + function testCannotSetRendererIfNotOwner() public { + vm.prank(address(1)); + vm.expectRevert(bytes('Ownable: caller is not the owner')); + descriptor.setRenderer(ISVGRenderer(address(2))); + } + + function testSetRendererWorksIfPartsAreLocked() public { + descriptor.lockParts(); + descriptor.setRenderer(ISVGRenderer(address(2))); + assertEq(address(descriptor.renderer()), address(2)); + } + + function testSetRendererWorks() public { + descriptor.setRenderer(ISVGRenderer(address(2))); + assertEq(address(descriptor.renderer()), address(2)); + } + + function testCannotSetArtDescriptorIfNotOwner() public { + vm.prank(address(1)); + vm.expectRevert(bytes('Ownable: caller is not the owner')); + descriptor.setArtDescriptor(address(2)); + } + + function testSetArtDescriptorUsesArt() public { + vm.expectCall(address(art), abi.encodeCall(art.setDescriptor, address(42))); + descriptor.setArtDescriptor(address(42)); + } + + function testCannotSetArtInflatorIfNotOwner() public { + vm.prank(address(1)); + vm.expectRevert(bytes('Ownable: caller is not the owner')); + descriptor.setArtInflator(IInflator(address(2))); + } + + function testSetArtInflatorUsesArt() public { + vm.expectCall(address(art), abi.encodeCall(art.setInflator, IInflator(address(42)))); + descriptor.setArtInflator(IInflator(address(42))); + } + + function testDataURIEnabledByDefault() public { + assertEq(descriptor.isDataURIEnabled(), true); + } + + function testCannotToggleDataURIIfNotOwner() public { + vm.prank(address(1)); + vm.expectRevert(bytes('Ownable: caller is not the owner')); + descriptor.toggleDataURIEnabled(); + } + + function testToggleDataURIWorks() public { + descriptor.setBaseURI('https://nouns.wtf/'); + _makeArtGettersNotRevert(); + vm.mockCall( + address(renderer), + abi.encodeWithSelector(SVGRenderer.generateSVG.selector), + abi.encode('mock svg') + ); + + descriptor.toggleDataURIEnabled(); + assertEq(descriptor.tokenURI(42, INounsSeeder.Seed(0, 0, 0, 0, 0)), 'https://nouns.wtf/42'); + + descriptor.toggleDataURIEnabled(); + assertEq( + descriptor.tokenURI(42, INounsSeeder.Seed(0, 0, 0, 0, 0)), + string( + abi.encodePacked( + 'data:application/json;base64,', + Base64.encode( + bytes( + abi.encodePacked( + '{"name":"', + 'Noun 42', + '", "description":"', + 'Noun 42 is a member of the Nouns DAO', + '", "image": "', + 'data:image/svg+xml;base64,', + Base64.encode(bytes('mock svg')), + '"}' + ) + ) + ) + ) + ) + ); + + vm.clearMockedCalls(); + } + + function testBackgroundCountUsesArt() public { + vm.mockCall(address(art), abi.encodeWithSelector(NounsArt.backgroundsCount.selector), abi.encode(42)); + assertEq(descriptor.backgroundCount(), 42); + vm.clearMockedCalls(); + } + + function testBodyCountUsesArt() public { + vm.mockCall( + address(art), + abi.encodeWithSelector(NounsArt.getBodiesTrait.selector), + abi.encode(INounsArt.Trait({ storedImagesCount: 42, storagePages: new INounsArt.NounArtStoragePage[](0) })) + ); + assertEq(descriptor.bodyCount(), 42); + vm.clearMockedCalls(); + } + + function testAccessoryCountUsesArt() public { + vm.mockCall( + address(art), + abi.encodeWithSelector(NounsArt.getAccessoriesTrait.selector), + abi.encode(INounsArt.Trait({ storedImagesCount: 42, storagePages: new INounsArt.NounArtStoragePage[](0) })) + ); + assertEq(descriptor.accessoryCount(), 42); + vm.clearMockedCalls(); + } + + function testHeadCountUsesArt() public { + vm.mockCall( + address(art), + abi.encodeWithSelector(NounsArt.getHeadsTrait.selector), + abi.encode(INounsArt.Trait({ storedImagesCount: 42, storagePages: new INounsArt.NounArtStoragePage[](0) })) + ); + assertEq(descriptor.headCount(), 42); + vm.clearMockedCalls(); + } + + function testGlassesCountUsesArt() public { + vm.mockCall( + address(art), + abi.encodeWithSelector(NounsArt.getGlassesTrait.selector), + abi.encode(INounsArt.Trait({ storedImagesCount: 42, storagePages: new INounsArt.NounArtStoragePage[](0) })) + ); + assertEq(descriptor.glassesCount(), 42); + vm.clearMockedCalls(); + } + + function testAddManyBackgroundsUsesArt() public { + string[] memory params = new string[](2); + params[0] = 'ff00ff'; + params[1] = '00ff00'; + + vm.expectCall(address(art), abi.encodeCall(art.addManyBackgrounds, (params))); + descriptor.addManyBackgrounds(params); + } + + function testCannotAddManyBackgroundsWhenPartsLocked() public { + descriptor.lockParts(); + vm.expectRevert(bytes('Parts are locked')); + descriptor.addManyBackgrounds(new string[](0)); + } + + function testAddBackgroundUsesArt() public { + vm.expectCall(address(art), abi.encodeCall(art.addBackground, ('fff000'))); + descriptor.addBackground('fff000'); + } + + function testCannotAddBackgroundWhenPartsLocked() public { + descriptor.lockParts(); + vm.expectRevert(bytes('Parts are locked')); + descriptor.addBackground(''); + } + + function testSetPaletteUsesArt() public { + vm.expectCall(address(art), abi.encodeCall(art.setPalette, (0, '123456'))); + descriptor.setPalette(0, '123456'); + + vm.expectCall(address(art), abi.encodeCall(art.setPalette, (1, '654321'))); + descriptor.setPalette(1, '654321'); + } + + function testSetPalettePointerUsesArt() public { + vm.expectCall(address(art), abi.encodeCall(art.setPalettePointer, (0, address(42)))); + descriptor.setPalettePointer(0, address(42)); + + vm.expectCall(address(art), abi.encodeCall(art.setPalettePointer, (1, address(1337)))); + descriptor.setPalettePointer(1, address(1337)); + } + + function testCannotSetPaletteWhenPartsLocked() public { + descriptor.lockParts(); + vm.expectRevert(bytes('Parts are locked')); + descriptor.setPalette(0, '000000'); + } + + function testCannotSetPalettePointerWhenPartsLocked() public { + descriptor.lockParts(); + vm.expectRevert(bytes('Parts are locked')); + descriptor.setPalettePointer(0, address(42)); + } + + function testCannotSetPalettePointerIfNotOwner() public { + vm.prank(address(1)); + vm.expectRevert(bytes('Ownable: caller is not the owner')); + descriptor.setPalettePointer(0, address(42)); + } + + function testAddBodiesUsesArt() public { + bytes memory someBytes = 'some bytes'; + uint80 decompressedLen = 123; + uint16 imageCount = 456; + vm.expectCall(address(art), abi.encodeCall(art.addBodies, (someBytes, decompressedLen, imageCount))); + descriptor.addBodies(someBytes, decompressedLen, imageCount); + } + + function testCannotAddBodiesWhenPartsLocked() public { + descriptor.lockParts(); + vm.expectRevert(bytes('Parts are locked')); + descriptor.addBodies('00', 1, 1); + } + + function testCannotAddBodiesIfNotOwner() public { + vm.prank(address(1)); + vm.expectRevert(bytes('Ownable: caller is not the owner')); + descriptor.addBodies('00', 1, 1); + } + + function testAddAccessoriesUsesArt() public { + bytes memory someBytes = 'some bytes'; + uint80 decompressedLen = 123; + uint16 imageCount = 456; + vm.expectCall(address(art), abi.encodeCall(art.addAccessories, (someBytes, decompressedLen, imageCount))); + descriptor.addAccessories(someBytes, decompressedLen, imageCount); + } + + function testCannotAddAccessoriesWhenPartsLocked() public { + descriptor.lockParts(); + vm.expectRevert(bytes('Parts are locked')); + descriptor.addAccessories('00', 1, 1); + } + + function testCannotAddAccessoriesIfNotOwner() public { + vm.prank(address(1)); + vm.expectRevert(bytes('Ownable: caller is not the owner')); + descriptor.addAccessories('00', 1, 1); + } + + function testAddHeadsUsesArt() public { + bytes memory someBytes = 'some bytes'; + uint80 decompressedLen = 123; + uint16 imageCount = 456; + vm.expectCall(address(art), abi.encodeCall(art.addHeads, (someBytes, decompressedLen, imageCount))); + descriptor.addHeads(someBytes, decompressedLen, imageCount); + } + + function testCannotAddHeadsWhenPartsLocked() public { + descriptor.lockParts(); + vm.expectRevert(bytes('Parts are locked')); + descriptor.addHeads('00', 1, 1); + } + + function testCannotAddHeadsIfNotOwner() public { + vm.prank(address(1)); + vm.expectRevert(bytes('Ownable: caller is not the owner')); + descriptor.addHeads('00', 1, 1); + } + + function testAddGlassesUsesArt() public { + bytes memory someBytes = 'some bytes'; + uint80 decompressedLen = 123; + uint16 imageCount = 456; + vm.expectCall(address(art), abi.encodeCall(art.addGlasses, (someBytes, decompressedLen, imageCount))); + descriptor.addGlasses(someBytes, decompressedLen, imageCount); + } + + function testCannotAddGlassesWhenPartsLocked() public { + descriptor.lockParts(); + vm.expectRevert(bytes('Parts are locked')); + descriptor.addGlasses('00', 1, 1); + } + + function testCannotAddGlassesIfNotOwner() public { + vm.prank(address(1)); + vm.expectRevert(bytes('Ownable: caller is not the owner')); + descriptor.addGlasses('00', 1, 1); + } + + function testAddBodiesFromPointerUsesArt() public { + address somePointer = address(1337); + uint80 decompressedLen = 123; + uint16 imageCount = 456; + vm.expectCall( + address(art), + abi.encodeCall(art.addBodiesFromPointer, (somePointer, decompressedLen, imageCount)) + ); + descriptor.addBodiesFromPointer(somePointer, decompressedLen, imageCount); + } + + function testCannotAddBodiesFromPointerWhenPartsLocked() public { + descriptor.lockParts(); + vm.expectRevert(bytes('Parts are locked')); + descriptor.addBodiesFromPointer(address(1337), 1, 1); + } + + function testCannotAddBodiesFromPointerIfNotOwner() public { + vm.prank(address(1)); + vm.expectRevert(bytes('Ownable: caller is not the owner')); + descriptor.addBodiesFromPointer(address(1337), 1, 1); + } + + function testAddAccessoriesFromPointerUsesArt() public { + address somePointer = address(1337); + uint80 decompressedLen = 123; + uint16 imageCount = 456; + vm.expectCall( + address(art), + abi.encodeCall(art.addAccessoriesFromPointer, (somePointer, decompressedLen, imageCount)) + ); + descriptor.addAccessoriesFromPointer(somePointer, decompressedLen, imageCount); + } + + function testCannotAddAccessoriesFromPointerWhenPartsLocked() public { + descriptor.lockParts(); + vm.expectRevert(bytes('Parts are locked')); + descriptor.addAccessoriesFromPointer(address(1337), 1, 1); + } + + function testCannotAddAccessoriesFromPointerIfNotOwner() public { + vm.prank(address(1)); + vm.expectRevert(bytes('Ownable: caller is not the owner')); + descriptor.addAccessoriesFromPointer(address(1337), 1, 1); + } + + function testAddHeadsFromPointerUsesArt() public { + address somePointer = address(1337); + uint80 decompressedLen = 123; + uint16 imageCount = 456; + vm.expectCall( + address(art), + abi.encodeCall(art.addHeadsFromPointer, (somePointer, decompressedLen, imageCount)) + ); + descriptor.addHeadsFromPointer(somePointer, decompressedLen, imageCount); + } + + function testCannotAddHeadsFromPointerWhenPartsLocked() public { + descriptor.lockParts(); + vm.expectRevert(bytes('Parts are locked')); + descriptor.addHeadsFromPointer(address(1337), 1, 1); + } + + function testCannotAddHeadsFromPointerIfNotOwner() public { + vm.prank(address(1)); + vm.expectRevert(bytes('Ownable: caller is not the owner')); + descriptor.addHeadsFromPointer(address(1337), 1, 1); + } + + function testAddGlassesFromPointerUsesArt() public { + address somePointer = address(1337); + uint80 decompressedLen = 123; + uint16 imageCount = 456; + vm.expectCall( + address(art), + abi.encodeCall(art.addGlassesFromPointer, (somePointer, decompressedLen, imageCount)) + ); + descriptor.addGlassesFromPointer(somePointer, decompressedLen, imageCount); + } + + function testCannotAddGlassesFromPointerWhenPartsLocked() public { + descriptor.lockParts(); + vm.expectRevert(bytes('Parts are locked')); + descriptor.addGlassesFromPointer(address(1337), 1, 1); + } + + function testCannotAddGlassesFromPointerIfNotOwner() public { + vm.prank(address(1)); + vm.expectRevert(bytes('Ownable: caller is not the owner')); + descriptor.addGlassesFromPointer(address(1337), 1, 1); + } + + function testBackgroundsUsesArt() public { + vm.mockCall( + address(art), + abi.encodeWithSelector(INounsArt.backgrounds.selector, 17), + abi.encode('return value') + ); + assertEq(descriptor.backgrounds(17), 'return value'); + vm.clearMockedCalls(); + } + + function testHeadsUsesArt() public { + vm.mockCall(address(art), abi.encodeWithSelector(INounsArt.heads.selector, 17), abi.encode('return value')); + assertEq(descriptor.heads(17), 'return value'); + vm.clearMockedCalls(); + } + + function testBodiesUsesArt() public { + vm.mockCall(address(art), abi.encodeWithSelector(INounsArt.bodies.selector, 17), abi.encode('return value')); + assertEq(descriptor.bodies(17), 'return value'); + vm.clearMockedCalls(); + } + + function testAccessoriesUsesArt() public { + vm.mockCall( + address(art), + abi.encodeWithSelector(INounsArt.accessories.selector, 17), + abi.encode('return value') + ); + assertEq(descriptor.accessories(17), 'return value'); + vm.clearMockedCalls(); + } + + function testGlassesUsesArt() public { + vm.mockCall(address(art), abi.encodeWithSelector(INounsArt.glasses.selector, 17), abi.encode('return value')); + assertEq(descriptor.glasses(17), 'return value'); + vm.clearMockedCalls(); + } + + function testPalettesUsesArt() public { + vm.mockCall(address(art), abi.encodeWithSelector(INounsArt.palettes.selector, 17), abi.encode('return value')); + assertEq(descriptor.palettes(17), 'return value'); + vm.clearMockedCalls(); + } + + function testGetPartsForSeedWorks() public { + vm.mockCall(address(art), abi.encodeWithSelector(INounsArt.bodies.selector), abi.encode('the body')); + vm.mockCall(address(art), abi.encodeWithSelector(INounsArt.accessories.selector), abi.encode('the accessory')); + vm.mockCall(address(art), abi.encodeWithSelector(INounsArt.heads.selector), abi.encode('the head')); + vm.mockCall(address(art), abi.encodeWithSelector(INounsArt.glasses.selector), abi.encode('the glasses')); + vm.mockCall(address(art), abi.encodeWithSelector(INounsArt.palettes.selector), abi.encode('the palette')); + + ISVGRenderer.Part[] memory parts = descriptor.getPartsForSeed(INounsSeeder.Seed(0, 0, 0, 0, 0)); + + assertEq(parts[0].image, 'the body'); + assertEq(parts[0].palette, 'the palette'); + + assertEq(parts[1].image, 'the accessory'); + assertEq(parts[1].palette, 'the palette'); + + assertEq(parts[2].image, 'the head'); + assertEq(parts[2].palette, 'the palette'); + + assertEq(parts[3].image, 'the glasses'); + assertEq(parts[3].palette, 'the palette'); + } + + function _makeArtGettersNotRevert() internal { + vm.mockCall(address(art), abi.encodeWithSelector(NounsArt.backgroundsCount.selector), abi.encode(123)); + vm.mockCall(address(art), abi.encodeWithSelector(INounsArt.backgrounds.selector), abi.encode('return value')); + vm.mockCall(address(art), abi.encodeWithSelector(INounsArt.bodies.selector), abi.encode('return value')); + vm.mockCall(address(art), abi.encodeWithSelector(INounsArt.accessories.selector), abi.encode('return value')); + vm.mockCall(address(art), abi.encodeWithSelector(INounsArt.heads.selector), abi.encode('return value')); + vm.mockCall(address(art), abi.encodeWithSelector(INounsArt.glasses.selector), abi.encode('return value')); + vm.mockCall(address(art), abi.encodeWithSelector(INounsArt.palettes.selector), abi.encode('return value')); + } +} diff --git a/packages/nouns-contracts/test/foundry/NounsToken.t.sol b/packages/nouns-contracts/test/foundry/NounsToken.t.sol index 71c01ba71c..6e423cb2f9 100644 --- a/packages/nouns-contracts/test/foundry/NounsToken.t.sol +++ b/packages/nouns-contracts/test/foundry/NounsToken.t.sol @@ -3,31 +3,23 @@ pragma solidity ^0.8.6; import 'forge-std/Test.sol'; import { NounsToken } from '../../contracts/NounsToken.sol'; -import { NounsDescriptor } from '../../contracts/NounsDescriptor.sol'; +import { NounsDescriptorV2 } from '../../contracts/NounsDescriptorV2.sol'; import { NounsSeeder } from '../../contracts/NounsSeeder.sol'; import { IProxyRegistry } from '../../contracts/external/opensea/IProxyRegistry.sol'; +import { SVGRenderer } from '../../contracts/SVGRenderer.sol'; +import { NounsArt } from '../../contracts/NounsArt.sol'; +import { DeployUtils } from './helpers/DeployUtils.sol'; -contract NounsTokenTest is Test { +contract NounsTokenTest is Test, DeployUtils { NounsToken nounsToken; - NounsDescriptor descriptor; - NounsSeeder seeder; - IProxyRegistry proxyRegistry = IProxyRegistry(address(0)); address noundersDAO = address(1); address minter = address(2); function setUp() public { - descriptor = new NounsDescriptor(); - _populateDescriptor(); - seeder = new NounsSeeder(); - nounsToken = new NounsToken(noundersDAO, minter, descriptor, seeder, proxyRegistry); - } + NounsDescriptorV2 descriptor = _deployAndPopulateV2(); + _populateDescriptorV2(descriptor); - function _populateDescriptor() internal { - descriptor.addBackground('#000000'); - descriptor.addAccessory('aaa'); - descriptor.addBody('bbb'); - descriptor.addGlasses('ggg'); - descriptor.addHead('hhh'); + nounsToken = new NounsToken(noundersDAO, minter, descriptor, new NounsSeeder(), IProxyRegistry(address(0))); } function testSymbol() public { diff --git a/packages/nouns-contracts/test/foundry/files/descriptor_v1/image-data.abi b/packages/nouns-contracts/test/foundry/files/descriptor_v1/image-data.abi new file mode 100644 index 0000000000..8ee4c4c451 --- /dev/null +++ b/packages/nouns-contracts/test/foundry/files/descriptor_v1/image-data.abi @@ -0,0 +1 @@ +0x00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000005ba00000000000000000000000000000000000000000000000000000000000006ac0000000000000000000000000000000000000000000000000000000000000b860000000000000000000000000000000000000000000000000000000000001ba80000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000664356437653100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006653164376435000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e200000000000000000000000000000000000000000000000000000000000001e600000000000000000000000000000000000000000000000000000000000001ea00000000000000000000000000000000000000000000000000000000000001ee00000000000000000000000000000000000000000000000000000000000001f200000000000000000000000000000000000000000000000000000000000001f600000000000000000000000000000000000000000000000000000000000001fa00000000000000000000000000000000000000000000000000000000000001fe00000000000000000000000000000000000000000000000000000000000002020000000000000000000000000000000000000000000000000000000000000206000000000000000000000000000000000000000000000000000000000000020a000000000000000000000000000000000000000000000000000000000000020e00000000000000000000000000000000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000216000000000000000000000000000000000000000000000000000000000000021a000000000000000000000000000000000000000000000000000000000000021e00000000000000000000000000000000000000000000000000000000000002220000000000000000000000000000000000000000000000000000000000000226000000000000000000000000000000000000000000000000000000000000022a000000000000000000000000000000000000000000000000000000000000022e00000000000000000000000000000000000000000000000000000000000002320000000000000000000000000000000000000000000000000000000000000236000000000000000000000000000000000000000000000000000000000000023a000000000000000000000000000000000000000000000000000000000000023e00000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024e00000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025e00000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026e00000000000000000000000000000000000000000000000000000000000002720000000000000000000000000000000000000000000000000000000000000276000000000000000000000000000000000000000000000000000000000000027a000000000000000000000000000000000000000000000000000000000000027e00000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028e00000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029e00000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002ba00000000000000000000000000000000000000000000000000000000000002be00000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f600000000000000000000000000000000000000000000000000000000000002fa00000000000000000000000000000000000000000000000000000000000002fe00000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030e00000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031e00000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032e00000000000000000000000000000000000000000000000000000000000003320000000000000000000000000000000000000000000000000000000000000336000000000000000000000000000000000000000000000000000000000000033a000000000000000000000000000000000000000000000000000000000000033e00000000000000000000000000000000000000000000000000000000000003420000000000000000000000000000000000000000000000000000000000000346000000000000000000000000000000000000000000000000000000000000034a000000000000000000000000000000000000000000000000000000000000034e00000000000000000000000000000000000000000000000000000000000003520000000000000000000000000000000000000000000000000000000000000356000000000000000000000000000000000000000000000000000000000000035a000000000000000000000000000000000000000000000000000000000000035e00000000000000000000000000000000000000000000000000000000000003620000000000000000000000000000000000000000000000000000000000000366000000000000000000000000000000000000000000000000000000000000036a000000000000000000000000000000000000000000000000000000000000036e00000000000000000000000000000000000000000000000000000000000003720000000000000000000000000000000000000000000000000000000000000376000000000000000000000000000000000000000000000000000000000000037a000000000000000000000000000000000000000000000000000000000000037e00000000000000000000000000000000000000000000000000000000000003820000000000000000000000000000000000000000000000000000000000000386000000000000000000000000000000000000000000000000000000000000038a000000000000000000000000000000000000000000000000000000000000038e00000000000000000000000000000000000000000000000000000000000003920000000000000000000000000000000000000000000000000000000000000396000000000000000000000000000000000000000000000000000000000000039a000000000000000000000000000000000000000000000000000000000000039e00000000000000000000000000000000000000000000000000000000000003a200000000000000000000000000000000000000000000000000000000000003a600000000000000000000000000000000000000000000000000000000000003aa00000000000000000000000000000000000000000000000000000000000003ae00000000000000000000000000000000000000000000000000000000000003b200000000000000000000000000000000000000000000000000000000000003b600000000000000000000000000000000000000000000000000000000000003ba00000000000000000000000000000000000000000000000000000000000003be00000000000000000000000000000000000000000000000000000000000003c200000000000000000000000000000000000000000000000000000000000003c600000000000000000000000000000000000000000000000000000000000003ca00000000000000000000000000000000000000000000000000000000000003ce00000000000000000000000000000000000000000000000000000000000003d200000000000000000000000000000000000000000000000000000000000003d600000000000000000000000000000000000000000000000000000000000003da00000000000000000000000000000000000000000000000000000000000003de00000000000000000000000000000000000000000000000000000000000003e200000000000000000000000000000000000000000000000000000000000003e600000000000000000000000000000000000000000000000000000000000003ea00000000000000000000000000000000000000000000000000000000000003ee00000000000000000000000000000000000000000000000000000000000003f200000000000000000000000000000000000000000000000000000000000003f600000000000000000000000000000000000000000000000000000000000003fa00000000000000000000000000000000000000000000000000000000000003fe00000000000000000000000000000000000000000000000000000000000004020000000000000000000000000000000000000000000000000000000000000406000000000000000000000000000000000000000000000000000000000000040a000000000000000000000000000000000000000000000000000000000000040e00000000000000000000000000000000000000000000000000000000000004120000000000000000000000000000000000000000000000000000000000000416000000000000000000000000000000000000000000000000000000000000041a000000000000000000000000000000000000000000000000000000000000041e00000000000000000000000000000000000000000000000000000000000004220000000000000000000000000000000000000000000000000000000000000426000000000000000000000000000000000000000000000000000000000000042a000000000000000000000000000000000000000000000000000000000000042e00000000000000000000000000000000000000000000000000000000000004320000000000000000000000000000000000000000000000000000000000000436000000000000000000000000000000000000000000000000000000000000043a000000000000000000000000000000000000000000000000000000000000043e00000000000000000000000000000000000000000000000000000000000004420000000000000000000000000000000000000000000000000000000000000446000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000044e00000000000000000000000000000000000000000000000000000000000004520000000000000000000000000000000000000000000000000000000000000456000000000000000000000000000000000000000000000000000000000000045a000000000000000000000000000000000000000000000000000000000000045e00000000000000000000000000000000000000000000000000000000000004620000000000000000000000000000000000000000000000000000000000000466000000000000000000000000000000000000000000000000000000000000046a000000000000000000000000000000000000000000000000000000000000046e00000000000000000000000000000000000000000000000000000000000004720000000000000000000000000000000000000000000000000000000000000476000000000000000000000000000000000000000000000000000000000000047a000000000000000000000000000000000000000000000000000000000000047e00000000000000000000000000000000000000000000000000000000000004820000000000000000000000000000000000000000000000000000000000000486000000000000000000000000000000000000000000000000000000000000048a000000000000000000000000000000000000000000000000000000000000048e00000000000000000000000000000000000000000000000000000000000004920000000000000000000000000000000000000000000000000000000000000496000000000000000000000000000000000000000000000000000000000000049a000000000000000000000000000000000000000000000000000000000000049e00000000000000000000000000000000000000000000000000000000000004a200000000000000000000000000000000000000000000000000000000000004a600000000000000000000000000000000000000000000000000000000000004aa00000000000000000000000000000000000000000000000000000000000004ae00000000000000000000000000000000000000000000000000000000000004b200000000000000000000000000000000000000000000000000000000000004b600000000000000000000000000000000000000000000000000000000000004ba00000000000000000000000000000000000000000000000000000000000004be00000000000000000000000000000000000000000000000000000000000004c200000000000000000000000000000000000000000000000000000000000004c600000000000000000000000000000000000000000000000000000000000004ca00000000000000000000000000000000000000000000000000000000000004ce00000000000000000000000000000000000000000000000000000000000004d200000000000000000000000000000000000000000000000000000000000004d600000000000000000000000000000000000000000000000000000000000004da00000000000000000000000000000000000000000000000000000000000004de00000000000000000000000000000000000000000000000000000000000004e200000000000000000000000000000000000000000000000000000000000004e600000000000000000000000000000000000000000000000000000000000004ea00000000000000000000000000000000000000000000000000000000000004ee00000000000000000000000000000000000000000000000000000000000004f200000000000000000000000000000000000000000000000000000000000004f600000000000000000000000000000000000000000000000000000000000004fa00000000000000000000000000000000000000000000000000000000000004fe00000000000000000000000000000000000000000000000000000000000005020000000000000000000000000000000000000000000000000000000000000506000000000000000000000000000000000000000000000000000000000000050a000000000000000000000000000000000000000000000000000000000000050e00000000000000000000000000000000000000000000000000000000000005120000000000000000000000000000000000000000000000000000000000000516000000000000000000000000000000000000000000000000000000000000051a000000000000000000000000000000000000000000000000000000000000051e00000000000000000000000000000000000000000000000000000000000005220000000000000000000000000000000000000000000000000000000000000526000000000000000000000000000000000000000000000000000000000000052a000000000000000000000000000000000000000000000000000000000000052e00000000000000000000000000000000000000000000000000000000000005320000000000000000000000000000000000000000000000000000000000000536000000000000000000000000000000000000000000000000000000000000053a000000000000000000000000000000000000000000000000000000000000053e00000000000000000000000000000000000000000000000000000000000005420000000000000000000000000000000000000000000000000000000000000546000000000000000000000000000000000000000000000000000000000000054a000000000000000000000000000000000000000000000000000000000000054e00000000000000000000000000000000000000000000000000000000000005520000000000000000000000000000000000000000000000000000000000000556000000000000000000000000000000000000000000000000000000000000055a000000000000000000000000000000000000000000000000000000000000055e00000000000000000000000000000000000000000000000000000000000005620000000000000000000000000000000000000000000000000000000000000566000000000000000000000000000000000000000000000000000000000000056a000000000000000000000000000000000000000000000000000000000000056e00000000000000000000000000000000000000000000000000000000000005720000000000000000000000000000000000000000000000000000000000000576000000000000000000000000000000000000000000000000000000000000057a000000000000000000000000000000000000000000000000000000000000057e00000000000000000000000000000000000000000000000000000000000005820000000000000000000000000000000000000000000000000000000000000586000000000000000000000000000000000000000000000000000000000000058a000000000000000000000000000000000000000000000000000000000000058e00000000000000000000000000000000000000000000000000000000000005920000000000000000000000000000000000000000000000000000000000000596000000000000000000000000000000000000000000000000000000000000059a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666666666666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066335623961310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000663666332616200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006363361306639000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063830376637650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000663616566663900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006353634386564000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063561343233660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000662393138356300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006623837623131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066666666466320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000634623439343900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006333433323335000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063166316432390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000630363839343000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006383637633164000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066165333230380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000639663231613000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006663938663330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066665353030630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000664323634353100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666438623562000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063561363566610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000664323232303900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006653932363563000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066335346533380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638306137326400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006346265613639000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063334616338300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000665656438313100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006363236313664000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066666363338640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638626330633500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006633464613533000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063030303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666333332326300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666661653161000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066666633131300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000635303561356300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666665663136000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066666663637310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666666634343900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006646238333233000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066466326333390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666393338643800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006356332356662000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063261383666640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000634356661666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006333864643536000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066666336130650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000664333261303900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006393033373037000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063665333230360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000635353265303500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006653837303562000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066633386237630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000665346134393900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006363637616639000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063634386466390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000637636334663200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006393766326662000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066133656664300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638376534643900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006373162646534000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066666316130620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666373861313800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006326238336636000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066436323134390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638333433393800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666663393235000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066439333931660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000662643264323400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666637323136000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063235346566620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000665356535646500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006303061353536000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066335303330650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000661626631333100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666234363934000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066537613332630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666666630656500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006303039633539000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063033383565620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000630303439396300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006653131383333000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063236623166330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666666630626500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006643864616466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066437643363640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000631393239663400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006656162313138000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063062353032370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666396635636200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006636663396238000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066665623964350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666386436383900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006356436303631000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063736383538620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000637353735373600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666630653065000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063061646334640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666646638666600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006373065383930000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066637393133640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666663161643200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666638326164000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063533356131350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666613666653200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666665393339000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066162333662650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000661646338636300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006363034363636000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066632303432320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000661626161613800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006346236356637000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066131396339610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000635383536356300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006646134326362000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063032376339320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000663656331383900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006393039623065000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063734353830640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000630323765653600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006623239353864000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066566616438310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000637643633356500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006656666326661000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063666353937610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000664346237623200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006643138363837000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066364393136640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000636623366333900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006346432373162000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063835363334660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666396634653600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006663864646230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066239326233630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000664303862313100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006323537636564000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066133626165640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000635666434666200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006633136373130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066132386566340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000633613038356200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006363762316533000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063165333434350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666666430363700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006393632323336000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063736396361390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000635613662376200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006376535323433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066138366636300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638663738356500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006636330353935000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063432666662300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000664353633333300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006623863656432000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066239316234330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666333937313300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006653865386532000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066563356234330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000632333534373600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006623261386135000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066436633362650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000634396233386200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666363663235000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066635396233340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000633373564666300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006393965366465000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063237613436330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000635353435343300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006623139653030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066434613031350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000639663462323700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006663965386464000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063662373231320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000639643865366500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006343234336638000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066661356532300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666383239303500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006353535333533000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063837366636390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000634313064363600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006353532643164000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066637313234380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666656533663300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006633136393233000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063262323833340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000630303739666300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006643331653134000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066638333030310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000638646431323200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666666646634000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066666613231650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000665346166613300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666263333131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066161393430630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000665656463303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666666303036000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063963623462380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000661333836353400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006616536633061000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063262623236620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000665326338633000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006663839383635000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066638363130300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000664636438643300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006303439643433000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066430616561390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666333964343400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006656562373863000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066639663565390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000635643335303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006633361313939000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066161613661340000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000663616132366100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006666465376635000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066664663030380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666646365663200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006663638316536000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063031383134360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000664313961353400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006396562356531000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066635666366660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000633663933323300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006303066636666000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063461353335380000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666626338303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006643539366136000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066666623931330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000665396261313200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006373637633065000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066639663664310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000664323936303700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006663863653437000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063339356564310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000666666335663000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006636263316263000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066434636663300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000009c00000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000a800000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000de00000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000000370015171f090e020e020e020e02020201000b02020201000b02020201000b02020201000b02020201000b02020201000b02020201000b0200000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e030e030e030e03020301000b03020301000b03020301000b03020301000b03020301000b03020301000b03020301000b0300000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e040e040e040e04020401000b04020401000b04020401000b04020401000b04020401000b04020401000b04020401000b0400000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e050e050e050e05020501000b05020501000b05020501000b05020501000b05020501000b05020501000b05020501000b0500000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e060e060e060e06020601000b06020601000b06020601000b06020601000b06020601000b06020601000b06020601000b0600000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e070e070e070e07020701000b07020701000b07020701000b07020701000b07020701000b07020701000b07020701000b0700000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e080e080e080e08020801000b08020801000b08020801000b08020801000b08020801000b08020801000b08020801000b0800000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e090e090e090e09020901000b09020901000b09020901000b09020901000b09020901000b09020901000b09020901000b0900000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e030e030e030e03020301000b03020301000b03020301000b03020301000b03020301000b03020301000b03020301000b0300000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e0a0e0a0e0a0e0a020a01000b0a020a01000b0a020a01000b0a020a01000b0a020a01000b0a020a01000b0a020a01000b0a00000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e0b0e0b0e0b0e0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b00000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e0c0e0c0e0c0e0c020c01000b0c020c01000b0c020c01000b0c020c01000b0c020c01000b0c020c01000b0c020c01000b0c00000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e0d0e0d0e0d0e0d020d01000b0d020d01000b0d020d01000b0d020d01000b0d020d01000b0d020d01000b0d020d01000b0d00000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e0e0e0e0e0e0e0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e00000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e0f0e0f0e0f0e0f020f01000b0f020f01000b0f020f01000b0f020f01000b0f020f01000b0f020f01000b0f020f01000b0f00000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e100e100e100e10021001000b10021001000b10021001000b10021001000b10021001000b10021001000b10021001000b1000000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e110e110e110e11021101000b11021101000b11021101000b11021101000b11021101000b11021101000b11021101000b1100000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e120e120e120e12021201000b12021201000b12021201000b12021201000b12021201000b12021201000b12021201000b1200000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e130e130e130e13021301000b13021301000b13021301000b13021301000b13021301000b13021301000b13021301000b1300000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e140e140e140e14021401000b14021401000b14021401000b14021401000b14021401000b14021401000b14021401000b1400000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e150e150e150e15021501000b15021501000b15021501000b15021501000b15021501000b15021501000b15021501000b1500000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e160e160e160e16021601000b16021601000b16021601000b16021601000b16021601000b16021601000b16021601000b1600000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e170e170e170e17021701000b17021701000b17021701000b17021701000b17021701000b17021701000b17021701000b1700000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e180e180e180e18021801000b18021801000b18021801000b18021801000b18021801000b18021801000b18021801000b1800000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e190e190e190e19021901000b19021901000b19021901000b19021901000b19021901000b19021901000b19021901000b1900000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e1a0e1a0e1a0e1a021a01000b1a021a01000b1a021a01000b1a021a01000b1a021a01000b1a021a01000b1a021a01000b1a00000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e1b0e1b0e1b0e1b021b01000b1b021b01000b1b021b01000b1b021b01000b1b021b01000b1b021b01000b1b021b01000b1b00000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e1c0e1c0e1c0e1c021c01000b1c021c01000b1c021c01000b1c021c01000b1c021c01000b1c021c01000b1c021c01000b1c00000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e1d0e1d0e1d0e1d021d01000b1d021d01000b1d021d01000b1d021d01000b1d021d01000b1d021d01000b1d021d01000b1d00000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e1e0e1e0e1e0e1e021e01000b1e021e01000b1e021e01000b1e021e01000b1e021e01000b1e021e01000b1e021e01000b1e0000000000000000000000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000112000000000000000000000000000000000000000000000000000000000000011a00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000126000000000000000000000000000000000000000000000000000000000000012c00000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000136000000000000000000000000000000000000000000000000000000000000013e0000000000000000000000000000000000000000000000000000000000000146000000000000000000000000000000000000000000000000000000000000014c0000000000000000000000000000000000000000000000000000000000000154000000000000000000000000000000000000000000000000000000000000015a0000000000000000000000000000000000000000000000000000000000000162000000000000000000000000000000000000000000000000000000000000016a00000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000176000000000000000000000000000000000000000000000000000000000000017c000000000000000000000000000000000000000000000000000000000000018a0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019600000000000000000000000000000000000000000000000000000000000001a200000000000000000000000000000000000000000000000000000000000001a800000000000000000000000000000000000000000000000000000000000001ae00000000000000000000000000000000000000000000000000000000000001b400000000000000000000000000000000000000000000000000000000000001ba00000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001c800000000000000000000000000000000000000000000000000000000000001d600000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001ea00000000000000000000000000000000000000000000000000000000000001f600000000000000000000000000000000000000000000000000000000000001fe00000000000000000000000000000000000000000000000000000000000002060000000000000000000000000000000000000000000000000000000000000214000000000000000000000000000000000000000000000000000000000000021e000000000000000000000000000000000000000000000000000000000000022800000000000000000000000000000000000000000000000000000000000002340000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024c00000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000026200000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000272000000000000000000000000000000000000000000000000000000000000027c0000000000000000000000000000000000000000000000000000000000000282000000000000000000000000000000000000000000000000000000000000028a00000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000294000000000000000000000000000000000000000000000000000000000000029a00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002fc000000000000000000000000000000000000000000000000000000000000030c00000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031c00000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032e0000000000000000000000000000000000000000000000000000000000000336000000000000000000000000000000000000000000000000000000000000033a00000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000346000000000000000000000000000000000000000000000000000000000000034c0000000000000000000000000000000000000000000000000000000000000352000000000000000000000000000000000000000000000000000000000000035a00000000000000000000000000000000000000000000000000000000000003620000000000000000000000000000000000000000000000000000000000000366000000000000000000000000000000000000000000000000000000000000036e00000000000000000000000000000000000000000000000000000000000003720000000000000000000000000000000000000000000000000000000000000378000000000000000000000000000000000000000000000000000000000000037c00000000000000000000000000000000000000000000000000000000000003820000000000000000000000000000000000000000000000000000000000000388000000000000000000000000000000000000000000000000000000000000038e0000000000000000000000000000000000000000000000000000000000000396000000000000000000000000000000000000000000000000000000000000039c00000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003a600000000000000000000000000000000000000000000000000000000000003ac00000000000000000000000000000000000000000000000000000000000003b200000000000000000000000000000000000000000000000000000000000003b800000000000000000000000000000000000000000000000000000000000003be00000000000000000000000000000000000000000000000000000000000003c600000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003d600000000000000000000000000000000000000000000000000000000000003da00000000000000000000000000000000000000000000000000000000000003e200000000000000000000000000000000000000000000000000000000000003ee00000000000000000000000000000000000000000000000000000000000003f600000000000000000000000000000000000000000000000000000000000003fa00000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000408000000000000000000000000000000000000000000000000000000000000040e0000000000000000000000000000000000000000000000000000000000000414000000000000000000000000000000000000000000000000000000000000041a00000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000426000000000000000000000000000000000000000000000000000000000000042a00000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000436000000000000000000000000000000000000000000000000000000000000043c00000000000000000000000000000000000000000000000000000000000004420000000000000000000000000000000000000000000000000000000000000448000000000000000000000000000000000000000000000000000000000000044e0000000000000000000000000000000000000000000000000000000000000456000000000000000000000000000000000000000000000000000000000000045e0000000000000000000000000000000000000000000000000000000000000466000000000000000000000000000000000000000000000000000000000000046e0000000000000000000000000000000000000000000000000000000000000474000000000000000000000000000000000000000000000000000000000000047a00000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000488000000000000000000000000000000000000000000000000000000000000048e0000000000000000000000000000000000000000000000000000000000000496000000000000000000000000000000000000000000000000000000000000049c00000000000000000000000000000000000000000000000000000000000004a400000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000004bc00000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004c600000000000000000000000000000000000000000000000000000000000004cc00000000000000000000000000000000000000000000000000000000000004d2000000000000000000000000000000000000000000000000000000000000000450017141e0d0100011f0500021f05000100011f0300011f01000100011f0200011f02000300011f03000200011f0200021f0100011f0200011f0100011f0400011f0100011f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000230018151a0d020003200100012001000100052002000120010001200100012001000220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000330017141d0e0101052101010421010001010321020001010121010001210200010102000121020003000121020003000121020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f0017121e0d0100012201000122010005000222010002220500022201000222050002220100012201000100012203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f0018151a0d01000223020002230100012302000223020001230300022303000000000000000000000000000000000000000000000000000000000000000000290017131c0d0400012401000300022401000424012301250100042401000200032401000100012404000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b0015141d0d0126050001260100012603000126010002000126010001260200030001260300030001260300020003260200030001260300010001260100012601000126010002000326020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000530015161e0b0127090001270100012707000127010002000127050001270200030001270300012703000400032704000500010d05000200020d052702000300020d032703000400030d04000300020d0327030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0018141e0d040003260500022604000126010001260300012603000100022604000326040001000126050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000590015141e0c01260600012601000126040001260100020001260200012602000300022603000200012602000126020001000626010002000126012801260128012601000300042601000400012601280126010005000226010000000000000000000000000000000000000000000000000000000000000000000000000000003b0015141b0c0126060001260100012604000126010002000126020001260200030002260300010006290100010004260229010001000426022901000000000000000000000000000000000000000000000000000000000000000000000000004b0015141d0c01260600012601000126040001260100020001260200012602000300022603000200012602000126020001000126012804260100010006260100020004260200030002260300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d0015141e0c01260600012601000126040001260100020001260200012602000300022603000100062601000100012601000226010001260100010006260100020004260200010001260100022601000126010001000126040001260100000000000000000000000000000000000000000000000000000000000000000000003f0017141d0d0300032a01000200012a0300012a0100032a0200012a012a0100012a0100012a0100012a012a0200032a0100012a0300012a02000100032a03000000000000000000000000000000000000000000000000000000000000000000370016131c0e012b0300012b012b0300012b0100012b0100012b01000100012b0100012b01000200012b0200022b0100022b022b0100022b000000000000000000000000000000000000000000000000000000000000000000000000000000003b0016141d0c010001260600032601000126020001260100012602000126030003000326020001000726030003260200040001260300040001260300000000000000000000000000000000000000000000000000000000000000000000000000ad0015171f09022c0223022c0223022c0223022c022c0223022c0223022c0223022c0223022d0223022d0223022d02230223022d0223022d0223022d0223022e01000123022e0223022e0223022e022e01000123022e0223022e0223022e02230100012f0223022f0223022f022302230100012f0223022f0223022f02230230010001230230022302300223023002300100012302300223023002230230022301000131022302310223023102230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e320e320e330e33021101000b11021101000b11023401000b34023401000b34023501000b35023501000b35023601000b3600000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e320e320e240e24023701000b37023701000b37023701000b37023701000b37023801000b38023801000b38023901000b3900000000000000000000000000000000000000000000000000000000000000000000000000000000970015171f090e3a013a013b013a013b013a013b013a013b013a013b013a013b013a013b0e3b013b0104013b0104013b0104013b0104013b0104013b0104013b0104020401000b04020401000b04020401000b040104013c0100013c0104013c0104013c0104013c0104013c0104013c023c01000b3c013c013d0100013d013c013d013c013d013c013d013c013d013c013d023d01000b3d00000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e3e0e3e0e3f0e3f023f01000b3f023f01000b3f023c01000b3c023c01000b3c023c01000b3c023c01000b3c024001000b4000000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e410e410e420e42022a01000b2a022a01000b2a020f01000b0f020f01000b0f024301000b43024301000b43021201000b1200000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e440e440e440e09020901000b09020901000b09020901000b09020901000b09020901000b09024501000b45024501000b4500000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e460e460e460e25024201000b42021401000b14024701000b47024701000b47024801000b48024801000b48024801000b4800000000000000000000000000000000000000000000000000000000000000000000000000000000290018131d0e0200011d0100011d0300011d010002000249010001000249020001000149030001490400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000530018171c090126010003260100032601000326010001000126030001260300012603000126022602000326010003260100022601000126030001260300012603000126012602000226010003260100032601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad0015171f090224021c024a0224021c024a02240224021c024a0224021c024a0224024a0224021c024a0224021c024a024a0224021c024a0224021c024a021c0100014a0224021c024a0224021c021c0100014a0224021c024a0224021c02240100011c024a0224021c024a022402240100011c024a0224021c024a0224024a01000124021c024a0224021c024a024a01000124021c024a0224021c024a021c0100014a0224021c024a0224021c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d0015171f09040003070100030701000207030701000307010003070300030701000307070003070700030701000600030701000307010003000207010003070100030701000107020002070100030705000107020002070700020701070700030701000207040003070100030701000207020702000307010003070300000000000000000000000000000000000000000000000000000000000000000000007d0015171f090400034b0100034b0100024b034b0100034b0100034b0300034b0100034b0700034b0700034b01000600034b0100034b01000300024b0100034b0100034b0100014b0200024b0100034b0500014b0200024b0700024b014b0700034b0100024b0400034b0100034b0100024b024b0200034b0100034b0300000000000000000000000000000000000000000000000000000000000000000000008b0015171f090400034c010003460100021403120100034c01000346030003120100034c0400031203120400034d01000312030003140100034d010003120246010003140100034d040002460100031404000346010002460400034c010003460100030002120100034c010003460100014d020002120100034c04000112014d020002120400034d01000112000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b0015171f0903000223040002230300030002230400022303000e0002230400022304000223022304000223040002230e0003000223040002230300030002230400022303000e0002230400022304000223022304000223040002230000000000000000000000000000000000000000000000000000000000000000000000005b0015171f0903000201040002010300030002010400020103000e0002010400020104000201020104000201040002010e0003000201040002010300030002010400020103000e000201040002010400020102010400020104000201000000000000000000000000000000000000000000000000000000000000000000000000ad0015171f09024e0243024f024e0243024f024e024e0243024f024e0243024f024e024f024e0243024f024e0243024f024f024e0243024f024e0243024f02430100014f024e0243024f024e024302430100014f024e0243024f024e0243024e01000143024f024e0243024f024e024e01000143024f024e0243024f024e024f0100014e0243024f024e0243024f024f0100014e0243024f024e0243024f02430100014f024e0243024f024e02430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730015171f09030f0300030f0300020f030f0300030f0300020f030f0300030f0300020f0300030f0300030f02000300030f0300030f02000300030f0300030f0200020f0400030f0300020f020f0400030f0300020f020f0400030f0300020f0300030f0300030f02000300030f0300030f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000730015171f09031903000319030002190319030003190300021903190300031903000219030003190300031902000300031903000319020003000319030003190200021904000319030002190219040003190300021902190400031903000219030003190300031902000300031903000319020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f0015171f090200022302000223020002230200020002230200022302000223020002230200022302000223020002230223020002230200022302000223030001230200022302000223020003000123020002230200022302000223020002230200022302000223022302000223020002230200022303000123020002230200022302000300012302000223020002230200022302000223020002230200022300000000000000000000000000000000000000000000000000000000000000009f0015171f09024a0200024a0200024a0200024a024a0200024a0200024a0200024a0200024a0200024a0200024a02000200024a0200024a0200024a0200024a0200024a0200024a0200024a024a0200024a0200024a0200024a0300014a0200024a0200024a02000300014a0200024a0200024a0200024a0200024a0200024a0200024a024a0200024a0200024a0200024a0300014a0200024a0200024a020000000000000000000000000000000000000000000000000000000000000000009f0015171f090200022002000220020002200200020002200200022002000220020002200200022002000220020002200220020002200200022002000220030001200200022002000220020003000120020002200200022002000220020002200200022002000220022002000220020002200200022003000120020002200200022002000300012002000220020002200200022002000220020002200200022000000000000000000000000000000000000000000000000000000000000000002b0018131d0d030002470100020102000101015001000401010002000201020002000101030002000150030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110018131a0d02000301010001000501060100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000470017151e0d0200021d04000200031d03000100011d0100011d0100021d0100031d0100031d0100021d0100011d0100011d02000200031d03000200021d0100011d02000600021d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b00151717090e190e260e4200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000370018141c0d050001510100010003510123015101380151010001510123025101000151010001510238015101000200015102000151010000000000000000000000000000000000000000000000000000000000000000000000000000000000610015171f090e27020006270300032702000b270100010009270100022701000227010001270100032702000427022701000827030001270200012702000327050003000827030003000127040002270100022701000100012701000b2703000b270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000690015171f090e27024106270341032702420b27014201420927014202270142022701000127012a0327022a0427022701000827032a0127010f01000127020f0327050f020f01000827030f024301000127044302270143022701430143012701000b27021201000b270000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f0017131d0d020003520100020001520100015201000200045202000352010001520100035201000652030001520200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000450015141e0c01260600012601260600012601000126040001260100020004260200030002260300020004260200020002260400040002260200020004260200030002260300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f0017141e0d020f0100030f01000100030f0100020f020f0300010f01000300030f01000100020f0400010f0300020f01000100030f0200010f0200010f04000000000000000000000000000000000000000000000000000000000000000000190018131a0e01280100022801000100032801140100032801000000000000000000000000000000000000000000000000000000000000000000000000000000290018131d0e020001530200020001530200010001530154015301000554010003530100020001530200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000330018151c0d0200045402000100015401000254010001540100015402000254020001540100015404000154010002000454020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0017151d0d0100010106000200020104000300030102000801020003010300040002010200060001010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f0017131d0e0126010a0126010a01260126010a0126010a012605550155032601550155022602550155012603550555000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000190018161a0d07230200032301000523032301000323010001230000000000000000000000000000000000000000000000000000000000000000000000000000210018161a0d0756020001560100015601000156010003560356010003560100015600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f0017141d0d07560156010002560100025602000256010002560700071d011d0100021d0100021d0200021d0100021d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000910016171e09015701000157010001570100015701000157010001570100015701000e00010001570100015701000157010001570100015701000157010001570e000157030001570100015701000157010001570100015701000e00010001570100015701000157010001570100015701000157010001570e0001570300015701000157010001570100015701000157010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000250018141d0d010002580100025801000758075801000558010002000358020003000158030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000250016121b0f010101000101010101000101010101000101010101000159010102000159020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110017151a1002000101020005260501050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000350017141e0d0100020b0400010b0200010b0300010b06000100030b03000300030b01000600010b0300010b0200010b0400020b0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000390016131d0e0200015b02000100015b012b015b01000200015b02000100035b0100015b032b015b025b022b015b015b032b015b0100035b010000000000000000000000000000000000000000000000000000000000000000000000000000001f0018141d0d0300045c0200055c0200055c0200055c0200045c0100025c050000000000000000000000000000000000000000000000000000000000000000001d0017121c0e045d045d045d0100025d01000100025e01000100025e010000000000000000000000000000000000000000000000000000000000000000000000d10015171f090200010f0200010f0200010f0200010f0200015c0200015c0200015c0200015c0200015c01000100010f0200010f0200010f0200010f0200010f0200015c0200015c0200015c0200015c0200010f0200010f0200010f0200010f0200010f01000100015c0200015c0200015c0200015c0200015c0500010f0200010f0200010f0200015c0200015c0200015c0200015c0200015c01000100010f0200010f0200010f0200010f0200010f0500015c0200015c0200015c0200010f0200010f0200010f0200010f0200010f010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d10015171f090200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f01000100015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f01000100015f0200015f0200015f0200015f0200015f0500015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f01000100015f0200015f0200015f0200015f0200015f0500015f0200015f0200015f0200015f0200015f0200015f0200015f0200015f0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f0016161e0d0300032303000100072301000100072301000323030103230323010101000101032303230301032301000723010001000723010003000323030000000000000000000000000000000000000000000000000000000000000000001d0018131d0e04000123022301000223030002230200032303000223052300000000000000000000000000000000000000000000000000000000000000000000270018131c0e010b0100010b0100010b0500010b0100010b0100010b0500010b0100010b0100010b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b0017131d0e056001600100016001000160010001600100016001000160010001600100016001000160010001600100036001000160016001000360000000000000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b0015171f090e610e610461075803610e6102620100026103580261015803610261010001610158036102580461026201000361015807610261010001610258016104580361026201000b6102610100016107580361026201000b61000000000000000000000000000000000000000000000000000000000000000000000000430015141d0c012606000126010001260400012601000200012602000126020003000226030003000226030002000426020002000426020001000626010001000626010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013001715191001000137030001000101030005630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000290018131d0e0400014301000143020001430100014303000300014301000143020001430100014304000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d0017171c090b000312070004180312030004140418031202460100041404180300024601000414070002460c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000330018151e0d030002640300020004640200020004640200010002650264025a01000465045a0465045a010002650200025a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000210019171b0901230200012302000123020001230200012301000e00022301000b230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000550015171f0b0413030005130413030005130413030005130413030005130100036603000566010003660300056601000366030005660100036603000566010003130300051301000313030005130100031303000513000000000000000000000000000000000000000000000000000000000000000000000000000000000000470015151f0c031c0300031c031c0300031c031c0300031c032303000323032303000323032303000323031c0300031c031c0300031c031c0300031c03230300032303230300032300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d0018121b0e016702000167010002670100010002670100016702000167000000000000000000000000000000000000000000000000000000000000000000004f0015151f0c09230523010003230223010002230200022301230200012301680300012303000223040003000223040003000223040003000223040003000123016804000300022304000300022304000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f0018121c0e0100025f0100035f0100025f02000100015f02200200012001000000000000000000000000000000000000000000000000000000000000000000370017121d0d0200014e0100014e014e0100024e01000100034e01000100024e0100014e014e0100014e02000300014e01000100014e0300000000000000000000000000000000000000000000000000000000000000000000000000000000001b001514170d012605000126010001260300012601000200032602000000000000000000000000000000000000000000000000000000000000000000000000003f0017141d0d010001010300010101000201010001010100020102000301020001000501010002000301020002010100010101000201010001010300010101000000000000000000000000000000000000000000000000000000000000000000330016151d0d050002190100020001190100041904000419050002190100011901000219040002000219040008000100011906000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000330017151e0d0100010f060008000200020f0400010f0100020f04000500020f01000400040f0200010f0100040f0500020f010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f0015171f090e690e430e280e1c02010100012302010223020102230201020101000123020102230201022302010223010001010223020102230201022302230100010102230201022302010223026901000b69024301000b43022801000b280000000000000000000000000000000000000000000000000000000000000000230015171d090e240e240e240e000e000e00022401000b24022401000b24022401000b240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b0015171b090e5a0e5a0e5a0e00026a01000b6a0e00022a01000b2a0000000000000000000000000000000000000000000000000000000000000000000000002b0015171f090e430e000e430e00024301000b430e00024301000b430e00024301000b430e00024301000b43000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0015171f090e350e000e350e00023501000b350e00023501000b350e00023501000b350e00023501000b35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0015171f090e6b0e000e6b0e00026b01000b6b0e00026b01000b6b0e00026b01000b6b0e00026b01000b6b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0015171f090e190e000e190e00021901000b190e00021901000b190e00021901000b190e00021901000b1900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000250017141a0d030001260300010001260300012601000200032602000126010003260100012600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410017171a090266020d0266020d0266020d02660266020d0266020d0266020d0266020d01000166020d0266020d0266020d020d01000166020d0266020d0266020d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000770015171f0902280200012804000128030001280228030004280400012803280900022803280900022802280200012801000128030001280100022802280300012801000228010001280100022802280300012801000228030002280228080001280100022802280a00022802280a00022802280a00022800000000000000000000000000000000000000000000000000000000000000000000000000000000390017131d0d014e0100014e010002570100014e020002570100014e02000257060001570200024e010001570200024e010002570100024e01000000000000000000000000000000000000000000000000000000000000000000000000000000190018131c0e03010200030102000500020001010200040001010000000000000000000000000000000000000000000000000000000000000000000000000000430015121f0e0423014b0223014b014b0223014b014b0223014b014b0223014b014b0223014b014b0223014b014b0223014b014b0223014b014b0223014b014b0223014b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000930016151f0b0200023b0100016c0200016c0100013b0100033b0200016c02000100013b0300013b0200026c0300026d0100013b0100026c0200016d0100011c016d013b0100016c01000100016d0100011c016c013b0100016c0100011c0100016d0100011c0100026c03000100016d0200011c0300011c01000200016d0200031c0100011c0100016d0200016d0100021c02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000430015121f0e046e014b026e014b014b026e014b014b026e014b014b026e014b014b026e014b014b026e014b014b026e014b014b026e014b014b026e014b014b026e014b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000170016111e0f02410241020002410241024102410241024100000000000000000000000000000000000000000000000000000000000000000000000000000000350017151d0d0200016f0500026f0600026f0100016f04000200036f03000300016f0100016f0100016f0500026f01000500026f0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000470017151d0c0100077001000170070001700170010002700100027001000170017001000170020001700200017001700100027001000270010001700170070001700100077001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000310017141c0d037101000371017103000171020001710300017102000171030001710200017103000171020003710100037100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000390017131d0d027201000272010001720200027201000272010002720100060002720100017201000172027201000272010001720200017202000000000000000000000000000000000000000000000000000000000000000000000000000000390018151b0c0223020001230200012301000123010002230100022301000123012301000523010001230223010001230100012301000123010000000000000000000000000000000000000000000000000000000000000000000000000000003f0016161d0b0200012308000323080001230100032306000100022301000323040003000223010003230200050002230100032308000123010001230a0001230000000000000000000000000000000000000000000000000000000000000000390017131d0d0100017302000173010002730100017301000173027302000173010006000273010001730200027301000273010001730200037300000000000000000000000000000000000000000000000000000000000000000000000000001f0019151b0d05230100022302230100022301000223012302000223010002230000000000000000000000000000000000000000000000000000000000000000230019171d09027401000b74027401000b74027401000b74027401000b74027401000b740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d0018131c0d015603000156010001560200015602000156010001560100025601000156020002560156030002560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000390017131d0d013e0300023e013e0200023e0100023e0100013e020006000100013e0200023e013e0100013e0100023e013e0100013e0100023e000000000000000000000000000000000000000000000000000000000000000000000000000027001715190d010102000201010001010100010102000201010001010100020101000201010002010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000370016141c0d0600011407000214010001140200011401140100011401000114010001140700021402000314011401000114020001140100000000000000000000000000000000000000000000000000000000000000000000000000000000002f0018151a0d037501000175010001750100017501000175010001750100017501000175010001750100017501000275000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410017131e0d0100026901000169010001000169010002690100060002690100016901000169026901000369060001000269010001690100010001690100026901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410017131e0d0100023e0100013e01000100013e0100023e01000600023e0100013e0100013e023e0100033e06000100023e0100013e01000100013e0100023e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410017131e0d010002170100011701000100011701000217010006000276010001140100011402760100031406000100020f0100010f01000100010f0100020f01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410016131d0d0100026c0100016c01000100016c0100026c01000600026c0100016c0100016c026c0100036c06000100026c0100016c01000100016c0100026c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000270018131b0d0100051f011f0100011f0100011f01000200011f0100011f01000200011f0200011f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000290017131d0d022804000228040001280100022802000200022802000400022804000228040001280100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000330017131d0d0201020002770201020002770101010001010100027706000337010001260100023702000126010001370300022600000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d0018151d0c0700011c0100040001560100011c0100011c02000156010001560100031c015601000156010001560100011c0200015601000156010001560200011c0100010001560100015605000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000370018151a0c0143010001430100011c0100014301000143010001430100031c010001430100010001430100011c0100011c010001430100000000000000000000000000000000000000000000000000000000000000000000000000000000004b0015171f090a00016203000a0001620300026201000b62040001620900040001620900026201000462010006620a00016203000a0001620300026201000b62040001620900040001620900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b0017151b0d010003560400025602000156030002000156020001560200020001560300025601000156060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000430018141e0d017802790178037902790178017a0178027902790178017a0178027903790178027901780100010401000104010001040100010001040500050001040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000850015171f09037b010003140100037b0100027b0e00017b010003140100037b010003140100010001140300017b030001140300017b01140200027b010003140100037b01000e00027b020003140100037b01000214030001140300017b030001140200017b01140200037b010003140100027b0e00017b0200027b010003140100037b010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830015171f09037c0100037c0100037c0100027c0e00017c0100037c0100037c0100037c01000100017c0300017c0300017c0300017c017c0200027c0100037c0100037c01000e00027c0200037c0100037c0100027c0300017c0300017c0300017c0200027c0200037c0100037c0100027c0e00017c0200027c0100037c0100037c0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110018121b0e040d020d024b020d024b044b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e020e020e020e02020201000b02020201000b02020201000b02020201000b02020201000b02020201000b02020201000b0200000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e0b0e0b0e0b0e0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b00000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e0e0e0e0e0e0e0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e00000000000000000000000000000000000000000000000000000000000000000000000000000000370015171f090e060e060e060e06020601000b06020601000b06020601000b06020601000b06020601000b06020601000b06020601000b0600000000000000000000000000000000000000000000000000000000000000000000000000000000ea0000000000000000000000000000000000000000000000000000000000001d400000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001fa000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000234000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000268000000000000000000000000000000000000000000000000000000000000027a000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000029800000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000003060000000000000000000000000000000000000000000000000000000000000314000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000344000000000000000000000000000000000000000000000000000000000000034e000000000000000000000000000000000000000000000000000000000000035a0000000000000000000000000000000000000000000000000000000000000366000000000000000000000000000000000000000000000000000000000000037c00000000000000000000000000000000000000000000000000000000000003840000000000000000000000000000000000000000000000000000000000000392000000000000000000000000000000000000000000000000000000000000039c00000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003c200000000000000000000000000000000000000000000000000000000000003d800000000000000000000000000000000000000000000000000000000000003e200000000000000000000000000000000000000000000000000000000000003ea00000000000000000000000000000000000000000000000000000000000003f600000000000000000000000000000000000000000000000000000000000004040000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000041e0000000000000000000000000000000000000000000000000000000000000432000000000000000000000000000000000000000000000000000000000000044a000000000000000000000000000000000000000000000000000000000000045e000000000000000000000000000000000000000000000000000000000000047400000000000000000000000000000000000000000000000000000000000004820000000000000000000000000000000000000000000000000000000000000492000000000000000000000000000000000000000000000000000000000000049e00000000000000000000000000000000000000000000000000000000000004ac00000000000000000000000000000000000000000000000000000000000004b600000000000000000000000000000000000000000000000000000000000004c200000000000000000000000000000000000000000000000000000000000004d600000000000000000000000000000000000000000000000000000000000004e600000000000000000000000000000000000000000000000000000000000004f400000000000000000000000000000000000000000000000000000000000004fc000000000000000000000000000000000000000000000000000000000000050e000000000000000000000000000000000000000000000000000000000000051a000000000000000000000000000000000000000000000000000000000000052a0000000000000000000000000000000000000000000000000000000000000534000000000000000000000000000000000000000000000000000000000000054400000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000564000000000000000000000000000000000000000000000000000000000000057a00000000000000000000000000000000000000000000000000000000000005860000000000000000000000000000000000000000000000000000000000000592000000000000000000000000000000000000000000000000000000000000059c00000000000000000000000000000000000000000000000000000000000005a800000000000000000000000000000000000000000000000000000000000005b600000000000000000000000000000000000000000000000000000000000005c200000000000000000000000000000000000000000000000000000000000005d200000000000000000000000000000000000000000000000000000000000005e400000000000000000000000000000000000000000000000000000000000005f60000000000000000000000000000000000000000000000000000000000000604000000000000000000000000000000000000000000000000000000000000060c000000000000000000000000000000000000000000000000000000000000062c0000000000000000000000000000000000000000000000000000000000000638000000000000000000000000000000000000000000000000000000000000064c00000000000000000000000000000000000000000000000000000000000006580000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000066c000000000000000000000000000000000000000000000000000000000000067c000000000000000000000000000000000000000000000000000000000000068e000000000000000000000000000000000000000000000000000000000000069e00000000000000000000000000000000000000000000000000000000000006aa00000000000000000000000000000000000000000000000000000000000006ca00000000000000000000000000000000000000000000000000000000000006e600000000000000000000000000000000000000000000000000000000000006f20000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000070e000000000000000000000000000000000000000000000000000000000000071e000000000000000000000000000000000000000000000000000000000000072a00000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000075a000000000000000000000000000000000000000000000000000000000000076e000000000000000000000000000000000000000000000000000000000000077a0000000000000000000000000000000000000000000000000000000000000786000000000000000000000000000000000000000000000000000000000000079200000000000000000000000000000000000000000000000000000000000007a000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007c200000000000000000000000000000000000000000000000000000000000007ce00000000000000000000000000000000000000000000000000000000000007de0000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000080e000000000000000000000000000000000000000000000000000000000000081a000000000000000000000000000000000000000000000000000000000000082a000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000008420000000000000000000000000000000000000000000000000000000000000850000000000000000000000000000000000000000000000000000000000000086400000000000000000000000000000000000000000000000000000000000008780000000000000000000000000000000000000000000000000000000000000888000000000000000000000000000000000000000000000000000000000000089c00000000000000000000000000000000000000000000000000000000000008ae00000000000000000000000000000000000000000000000000000000000008c200000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000008dc00000000000000000000000000000000000000000000000000000000000008e600000000000000000000000000000000000000000000000000000000000008f40000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000091e000000000000000000000000000000000000000000000000000000000000092a00000000000000000000000000000000000000000000000000000000000009360000000000000000000000000000000000000000000000000000000000000940000000000000000000000000000000000000000000000000000000000000094c0000000000000000000000000000000000000000000000000000000000000956000000000000000000000000000000000000000000000000000000000000096800000000000000000000000000000000000000000000000000000000000009780000000000000000000000000000000000000000000000000000000000000984000000000000000000000000000000000000000000000000000000000000099600000000000000000000000000000000000000000000000000000000000009ac00000000000000000000000000000000000000000000000000000000000009ba00000000000000000000000000000000000000000000000000000000000009c800000000000000000000000000000000000000000000000000000000000009d600000000000000000000000000000000000000000000000000000000000009e600000000000000000000000000000000000000000000000000000000000009f20000000000000000000000000000000000000000000000000000000000000a060000000000000000000000000000000000000000000000000000000000000a160000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000a2e0000000000000000000000000000000000000000000000000000000000000a3e0000000000000000000000000000000000000000000000000000000000000a540000000000000000000000000000000000000000000000000000000000000a620000000000000000000000000000000000000000000000000000000000000a6e0000000000000000000000000000000000000000000000000000000000000a760000000000000000000000000000000000000000000000000000000000000a840000000000000000000000000000000000000000000000000000000000000a960000000000000000000000000000000000000000000000000000000000000aa80000000000000000000000000000000000000000000000000000000000000ab40000000000000000000000000000000000000000000000000000000000000abe0000000000000000000000000000000000000000000000000000000000000ac60000000000000000000000000000000000000000000000000000000000000ada0000000000000000000000000000000000000000000000000000000000000ae40000000000000000000000000000000000000000000000000000000000000af80000000000000000000000000000000000000000000000000000000000000b040000000000000000000000000000000000000000000000000000000000000b120000000000000000000000000000000000000000000000000000000000000b2a0000000000000000000000000000000000000000000000000000000000000b3a0000000000000000000000000000000000000000000000000000000000000b460000000000000000000000000000000000000000000000000000000000000b540000000000000000000000000000000000000000000000000000000000000b660000000000000000000000000000000000000000000000000000000000000b700000000000000000000000000000000000000000000000000000000000000b860000000000000000000000000000000000000000000000000000000000000b960000000000000000000000000000000000000000000000000000000000000ba20000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000bba0000000000000000000000000000000000000000000000000000000000000bc60000000000000000000000000000000000000000000000000000000000000bd60000000000000000000000000000000000000000000000000000000000000be60000000000000000000000000000000000000000000000000000000000000bf40000000000000000000000000000000000000000000000000000000000000c0c0000000000000000000000000000000000000000000000000000000000000c140000000000000000000000000000000000000000000000000000000000000c220000000000000000000000000000000000000000000000000000000000000c2e0000000000000000000000000000000000000000000000000000000000000c360000000000000000000000000000000000000000000000000000000000000c460000000000000000000000000000000000000000000000000000000000000c560000000000000000000000000000000000000000000000000000000000000c660000000000000000000000000000000000000000000000000000000000000c6e0000000000000000000000000000000000000000000000000000000000000c7e0000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000ca20000000000000000000000000000000000000000000000000000000000000cae0000000000000000000000000000000000000000000000000000000000000cc40000000000000000000000000000000000000000000000000000000000000cd20000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000cf20000000000000000000000000000000000000000000000000000000000000cfe0000000000000000000000000000000000000000000000000000000000000d0c0000000000000000000000000000000000000000000000000000000000000d1c0000000000000000000000000000000000000000000000000000000000000d2c0000000000000000000000000000000000000000000000000000000000000d3e0000000000000000000000000000000000000000000000000000000000000d4a0000000000000000000000000000000000000000000000000000000000000d5a0000000000000000000000000000000000000000000000000000000000000d660000000000000000000000000000000000000000000000000000000000000d740000000000000000000000000000000000000000000000000000000000000d820000000000000000000000000000000000000000000000000000000000000d980000000000000000000000000000000000000000000000000000000000000da40000000000000000000000000000000000000000000000000000000000000dbc0000000000000000000000000000000000000000000000000000000000000dc40000000000000000000000000000000000000000000000000000000000000dd80000000000000000000000000000000000000000000000000000000000000de60000000000000000000000000000000000000000000000000000000000000dfe0000000000000000000000000000000000000000000000000000000000000e120000000000000000000000000000000000000000000000000000000000000e220000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000e4c0000000000000000000000000000000000000000000000000000000000000e5c0000000000000000000000000000000000000000000000000000000000000e6c0000000000000000000000000000000000000000000000000000000000000e7c0000000000000000000000000000000000000000000000000000000000000e900000000000000000000000000000000000000000000000000000000000000eb60000000000000000000000000000000000000000000000000000000000000ec40000000000000000000000000000000000000000000000000000000000000ed80000000000000000000000000000000000000000000000000000000000000ee80000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000f0a0000000000000000000000000000000000000000000000000000000000000f1c0000000000000000000000000000000000000000000000000000000000000f320000000000000000000000000000000000000000000000000000000000000f3e0000000000000000000000000000000000000000000000000000000000000f4c0000000000000000000000000000000000000000000000000000000000000f5a0000000000000000000000000000000000000000000000000000000000000f700000000000000000000000000000000000000000000000000000000000000f7e0000000000000000000000000000000000000000000000000000000000000f8c0000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000fb20000000000000000000000000000000000000000000000000000000000000fc40000000000000000000000000000000000000000000000000000000000000fd20000000000000000000000000000000000000000000000000000000000000fe20000000000000000000000000000000000000000000000000000000000000ff8000000000000000000000000000000000000000000000000000000000000100200000000000000000000000000000000000000000000000000000000000010100000000000000000000000000000000000000000000000000000000000000009100021e140605000137020001370f0004000237020002370e0003000337020003370d0002000437020004370c0003000337020003370d0004000237020002370e0005000137020001370f000d370b000d370b000d370b000d370b000d370b000d370b000d370600057d0d370600017d017e017d017e017d0b37097d017e017d017e017d0b370d7d0a370523097d0b370d7d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017900041a1405045c01000447010004470100017f01000114010001140100045c01230447012304470123017f01230114012301140123045c01230447012304470123017f01230114012301140123045c01230447012304470123017f01230114012301140123045c01230447012304470123017f012301140123011401230100142301230158012301580123017f012304460123047f0123044601230158012301580123017f012304460123047f0123044601230158012301580123017f012304460123047f0123044601230158012301580123017f012304460123047f0123044601230158012301580123017f012304460123047f0123044601001323010001230154012301540123015401230407012304550123045501230154012301540123015401230407012304550123045501230154012301540123015401230107035401230455012304550123015401230154012301540123040701230455012304550123015401230154012301540123040701230455012304550000000000000000000000000000000000000000000000000000000000000000000000000000730005191406030004800c0002000980080001000e80040002000f80020001001080020002000f80020002000f800200020001800e810200020001800e810200020001800e810200020001800e81020003800e8102000180018101800f8101000180018103800d82018005800d810180020011800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b500031c140306000e3a050006000e3a05000400023a0e00023a03000400023a0e00023a03000400023a0e00023a030002000207023a0e07023a02070100020001070126023a040706260407023a01260107010001000126010702260607042606070226010701000100012608070626080701000100013a16070100013a0100013a15070100013a0100013a15070100013a0107013a1607013a0107013a1607010018070100070703760e0701001807020016070100000000000000000000000000000000000000000000000000000000000000000000000000000000000001e300011d19050a0001830d000a00030f0b000a0001830200010f0100018308000a00020f0300010f017a07000a000108010f017a020f0108017a010f06000a00020f017a020f0183017a020f050001000183080001830100017a010f010001080100020f018304000200010807000108040001080200010f017a010f030003000108060001080300010803000183017a010f0300040001080500010803000108020001080100017a010f0200010f0200017a030f017a030f010803000108020001080200020f017a01000100010f017a030f017a030f017a03000108010001080400010f017a010f0100010f017a030f017a030f017a010f01000108020001080400010f02000100010f017a030f017a030f017a020f01080100010808000100010f017a030f017a030f017a030f017a020f07000100010f017a030f017a030f017a030f017a030f017a050001000108017a030f017a030f017a030f017a030f017a010f0400010001080200020f017a030f0211020f017a030f017a010f0400010001080400017a030f017a030f017a030f017a010f0400010001080400017a030f017a030f017a030f017a0500010001080500030f017a030f017a030f017a0500010001080700010f017a030f017a020f070001000108160001000183160003831500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d100041d140304000523047903260a0005000323047905260900060001230479072608000700037909260700070002790226012b07260700070001790326012b0326022b0226070007000226012b0526022b02260700012606000826022b022606000126022605000826022b022605000226032604000c26040003260126012b022602000e26020004260226012b022601000e26010005260326012b1226012b032601001426012b0326010002000a26032b0926020003000626015706260157062603000400042603570526025704260400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b00031c15040b00021f0b000900061f09000700031f0472031f07000500021f020c011f0472011f020c021f05000300021f020c031f0472031f020c021f03000100161f01000100167201000200031f0272041f0272041f0272031f02000200011f010c011f0272041f0272041f0272011f010c011f02000200031f0272041f0272041f0272031f02000200031f0272041f0272041f0272031f02000200031f0272041f0272041f0272031f02000200031f0272041f0272041f0272031f02000200031f0272041f0272041f0272031f02000200031f0272041f0272041f0272031f02000200031f0272041f0272041f0272031f02000200011f1272011f02000100161f0100021f1472021f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db00041a17060800040b08000600080b0600040001240b0b04000300020b01240a0b0124010b02000200030b01240a0b0124010b02000200030b01240a0b0124010b02000100040b01240a0b0124020b01000100030b01240c0b0124010b0100040b01240c0b0124020b030b01240e0b0124010b030b01240e0b0124010b030b01240e0b0124010b0100030b01240c0b0124010b01000100030b01240c0b0124010b01000200030b01240a0b0124010b02000200040b0224060b0224020b02000300050b0624030b030004000c0b04000600080b06000800040b0800000000000000000000000000000000000000000000000000000000000000000000000000f100031a160607000542011a070005000442011a0242011a0242050003000242021a0542011a0442030002000542011a0442011a0442011a020002000142011a0442011a0342011a0342011a0142020001000842011a0242011a0242011a0342010001000142011a0742051a044201000c42011a07420c42011a07420c42011a0742141a0c42011a07420c42011a074201000b42011a0642010001000942051a04420100020004420166010e0166010e0166010e011a0242011a0242020002000642011a0342011a0342011a0142020003000442011a0442011a044203000500021a0542011a0242050007000542011a0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011900031e14020900018408000184090009000184080001840900080003840600038408000400018402000284018501840600018401850284020001840400040005840185028404000284018505840400030001840185038401850a84018503840185018403000300058401850a84018505840300020001840185148401850184020002000184018514840185018402000100018401851684018501840100010001840185168401850184010001000184018516840185018401000100018401851684018501840100018401851884018501840184018518840185018407840185048402230162012301620223018401850784028403000284018503840323010101230101012302840185028403000284018405001084050001840000000000000000000000000000000000000000000000000000000000000000000000000000730005181508058606000586018602370286060002860237018610861086108610861086108610861086108610860208028602080223018701230187022301080286020802860208072301080286020802860208028602080286020802860208028602080286020802860208028601000e08010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012500021914060500028702000387070004000b87040003000f87010003000f870100020011870200018701420c87016d02870300024201680287016802470587016d018701000388024201680247016802470168014702870168016d0187010003880342024701680247016802470268016d0200028801000342024701680247016802470268016d0200028801000342024701680247016802470268016d0200028801000342024701680247016802470268016d0200028801000342024701420247016802470268016d0200028801000342024701420247016802470268016d020003880342024701420247016802470268016d0200010002880342024701420247014202470268016d020003000c420168016d02000300058807850288020003000e88020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a300021a14060400031d0200028009000400011d0119021d0280010c018008000400021d0119011d0180010c028008000500021d0119010c028009000600011d0119010c01800a00070002850b000200108902000100091901890119018901190189011903890100148903191089011914891489128902191489148902190f89031901000a8902200689010002000419018901190789011901890119020003000e8903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008900011c14040b0002260b000b0002260b0008000826080007000226010107260700060002260101092606000500022601010b26050005000e26050005000e2605000400102604000400102604000400102604000400102604000400102604000400108a04000400108a0400020014260200020001260101122602000c26033709261826010016260100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c500021d14020d00047f0a000d00067f08000c00037f0156017f0156017f08000c00027f0156015a0156015a017f08000c00027f028b0156018b017f08000900057f018b0156015a0156017f080008000b7f080007000b7f090006000d7f080005000e7f018c07000400047f01000a7f038c05000300047f02000a7f058c03000200047f02000b7f078c0100047f03000c7f0300058c037f04000c7f0400018c0100018c010007000b7f09000700087f028d027f08000800028c0a7f07000700068c087f060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c500021d14020d0004340a000d00063408000c000334012b0134012b013408000c000234012b0136012b0136013408000c000234028e012b018e0134080009000534018e012b0136012b0134080008000b34080007000b34090006000d34080005000e34013607000400043401000a34033605000300043402000a34053603000200043402000b3407360100043403000c3403000536033404000c340400013601000136010007000b34090007000834021602340800080002360a340700070006360834060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bb00011d17030e00018f0b000d00018f0c000400018f15000300018f0600015f0600015f0400018f03000300018f0500015f0600015f0600018f02000800015f0300045f0300015f06000800015f01190120015f0320031908000400015f0200015f01190220045f0220025f07000400015f0100015f01190120025f0490025f01200119015f06000400015f0100015f0120015f029004230290015f01200119015f0100015f03000200015f0200025f0120015f019006230190015f022001190300018f010005000119025f019008230190025f01190400018f018f0500025f019008230190015f0120015f01190300018f018f0400015f0120015f019008230190015f0120015f05000100018f0300015f0120015f019008230190015f0120015f05000500015f01190120015f019006230190015f02200119015f04000300015f0200035f029004230290025f02190100015f03000400025f02190120025f0490025f0220015f01190100015f03000700015f01190220045f0120015f01200119015f060006000219055f0320015f02190200015f04000200018f0700015f01000319015f0a000300018f0900015f0900018f02001600018f0300000000000000000000000000000000000000000000000000000000000000000000000000bf00041a1706070006430700050005430691040003000143019101560591035403910300020002430691015403770154039102000200014306910254047701540291020001000243079101540477015403910100010001430156089104540491010002431291034311910343119102431291024312910243129101000143039106770891010001000143049102920991014301910100020002430e910200020004430c910200040002430991014304000400054306910143040007000643070000000000000000000000000000000000000000000000000000000000000000008f00041c16070f00010d05000600060d0200030d028302000400040d0172090d0100018301000300020d02720a0d030001830200030d0272090d040001830100100d030001830100100d03000193120d02000141120d0300120d0300120d0300120d0300120d03000100100d04000100100d04000200060d0572030d050003000c0d060004000a0d07000600060d0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf00021e15030c00070f08000a00030f031c040f07000800050f031c010f021c020f06000600040f011c020f031c010f021c020f06000500100f060006000e0f0200030f02000a00080f0300020f011c020f01000100070f0600027c0300080f020f021c060f0400037c060f021c020f020f021c010f011c050f0400017c070f021c020f0b0f0400037c080f01000b0f0300097c04000100080f087c0a000200030f047c0300047c0b000a00067c0b000900087c0a00040012940500040005940d0e050004001294050006000e9407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010f00041b1f06040002580f00060002580d00080002580b00020008950258079502000200019509000258040001950200020001950b0002580200019502000296136f0296016f011c016f0195016f090e016f0195016f0124016f0296136f0296036f030e026f0195016f0195026f030e036f0296026f050e056f050e026f0296016f070e016f0195016f070e016f0296016f070e036f070e016f0296016f070e016f0195016f070e016f0296026f050e056f050e026f0296036f030e026f0195016f0195026f030e036f0296136f1200020e01001300010e01001300010e01001300010e01001300010e01001300010e01001300010e01001300010e01001300010e01001300010e01001300010e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006500061c140701000697030002970900010006970208010001970198090001000797020801970198090001000897010801970198090001000b97090001000b97090001000b9709000d9708000e9707001497010015971597049703260e971597010013830100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009900061c1403040003970f9901080200030004970f99010802000200049701080f99020801000200049701080f99020801000100049702080f9902080100059702080f990308040003080f990308040003080f990300040003080f9903000400029901080f9903000400029901080f99030004000299010805990a0203000400030805990a0203000400030805990a020300040003080f990300000000000000000000000000000000000000000000000000000000000000000000000000000085000418140504000d55020002000a55043802550100010012551355135513550255018901550607095502550189015506070955025501890155060709550255018901550607095502550189015506070955030001550607095503000f550100040003550b26010004000355012605010123010103260100040003550b26010004000e550100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012500051a14060600086a06000300036a0320016a0420036a03000200016a0320036a0120046a0320016a02000100016a0120026a0120016a0120016a0120016a0120026a0120026a0120016a01000100016a0120016a0120026a0120026a0120026a0120056a0100066a0120036a0120026a0120026a0120016a0120016a016a0120046a0120066a0120046a0120016a016a0120026a0120026a0120036a0120066a0120016a046a0120026a0120046a0120016a0220026a0120016a016a0120026a0120036a0120096a0120016a016a0120036a0120056a0120066a0120016a066a0120056a0220046a0120016a0100126a01000100016a0120036a0220026a0120056a0220016a01000200016a0120016a0120026a0220046a0220026a020003000e6a0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b00041b160504000e010400020012010200010014010100010014010100160116011601160116011601160101001401010001001401010002001201020004000f0103000f00030104000f00020105000e00020106000e0001010700000000000000000000000000000000000000000000000000000000000000000000000000b900021b170508000669080006000369029a0569060004000269029a046902010469040003000269019a056904010469030002000269019a066904010569020002000a690201026902010269020001000f690201036901000100026901011169010016691669166916691669166901001469010001001469010002000a69019a0769020002000b69019a0669020003000169019a0769019a0469019a0169030004000169039a0669039a0169040006000a9a06000800069a080000000000000000000000000000000000000000000000000000000000000000000000000000007d00071a14060600080a06000400060a0125050a04000300040a0125050a0125030a03000200020a01250d0a020002000e0a0125010a02000100120a01000100120a0100010012260100082601970626029701260197012601970226019704260c97029701260c97012604970100129701000200100a02000200100a0200000000000000000000000000000000000000000000000000000000000000000000010300021a140605000137040001370300013705000400013701290137020001370129013701000137012901370400040001370129012602000137012901260100013701290126040005000126040001260300012605000400033c0200033c0100033c040004000156023c02000156023c01000156023c0400020010200200010005200601072001000100042008010620010001000420080105200101010001000101032009010320020101000100020102200e0101000100020102200e0101000100020101200f01010001001201010001001201010001000120010102200201052002010220020101200100012001010120020102200501022002010220010101201420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed00051a16060200120302001203020001030488010303880103070701030200060303880103070701030200010304880d03020006030388010303880103038801030200010304880d03020006030388010303880103038801030200010304180d0302000103041801030388010303880103038801030200120302000103105c010302080103015c019b035c019b035c019b015c019b015c029b015c010302080103015c039b015c029b025c019b015c019b015c029b015c010302080103015c019b015c019b015c039b015c019b015c019b015c029b015c010302080103105c010302000103109c01030200120300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013300041a14050100029d0200029d0200029d0200029d0200029d02000201019d0301019d0301019d0301019d0301019d02011501010101230101012301010123010101230101012301010123010101230101059f01010f01029f0101029f010101010da00101019f0101019f0101019f0101020101a0010101a0010101a0010101a0010101a0010101a00201059f010101010da00101059f0101020101a0010101a0010101a0010101a0010101a0010101a00201059f010101010da00101059f0101020101a0010101a0010101a0010101a0010101a0010101a00201059f010101010da00101059f0101020101a0010101a0010101a0010101a0010101a0010101a00201059f010101010da00101059f0101020101a0010101a0010101a0062301a00101059f010101010da00101059f0101150100000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f00091c14050400047e0500047e060001230100117c030001230123017e017c01240f7c020002230123017e117c027e022301230100117c027e02230200117c027e02230200117c027e022302001123027e022302001123027e022302000e23027e0123027e0223020001230b7c0223027e012302000223020011230300012300000000000000000000000000000000000000000000000000000000000000005900041a14060f00017a04000c000383017a04000e00027a04000b00047a05000700067a030002390200097a0500053901001483148c148c148c148c14a2140714070507010e0151010e0151010e0151010e015107071407148300000000000000000000000000000000000000000000000000000000000000000000000000009500091c140605000855090004000155080401550800030003550804015507000200055508040155060001000755060401a30104015505000e5502a304550200145501570100145501570155035501230227095502270123045502a30155012702a30127015502230455012702a30127025502a302a30100012702a3012707a3012702a30127010002a3010004000227090002270500000000000000000000000000000000000000000000000000000000000000000000000000000000000000b700021a1408010004580d0001000158026201580d000100045802000a2701000161015801620258026101270843012701610161045802610127014306540143012701610161016f0262016f026101270843012701610161046f0261012701430354044301270161016104270261012708430127016112611261126112611261126112610f61022a0161016102870161028701610287016102870161042a0161016102870161028701610287016102870161042a01611261000000000000000000000000000000000000000000000000000000000000000000000000000000009d00071b14050100140e0100020e1201020e020e0101010e1001020e010e0101010e0101010e1001010e010e05a4010103a4020103a4010105a4010e010e04a4030103a4010102a4030104a4010e010e04a4030103a4010102a4030104a4010e010e05a4010103a4020103a4010105a4010e010e14a4010e010e1426010e010e1426010e060c0a1f060c050c021f0100061f0100021f050c040c0e1f040c00000000000000000000000000000000000000000000000000000000000000000000b500031a14060100020e0d00020e02000100040e0900040e02000100010e0106040e0500040e0106010e02000100010e0306020e0500020e0306010e02000100010e0406070e0406010e02000100010e0306090e0306010e02000100010e01060d0e0106010e02000100110e02000200100e02000200100e02000200100e02000200100e02000200100e02000200100e0200053c0506026c0406043c02000806019607060200053c030604960406043c0200100602000000000000000000000000000000000000000000000000000000000000000000000000000000000000011f00031b1805080006a40800060002a4066702a40600040002a40a6702a40400030001a40e6701a40300020001a401220f6701a40200020001a402220e6701a40200010001a405220b67024301a40100010001a40622016704080367044301a4010001a404200322010804a40108074301a401a40620010806a40108064301a401a40620010802a4020002a40108064301a401a40620010802a4020002a40108069a01a401a40626010806a40108069a01a401a40726010804a40108026e059a01a4010001a40426036704080167046e029a01a40100010001a402260b67056e01a40100020001a40d67036e01a40200020001a40f67016e01a40200030001a40e6701a40300040002a40a6702a40400060002a4066702a40600080006a4080000000000000000000000000000000000000000000000000000000000000000014b00051e160203000484010006840100068401000384030003000493018406930184069301840393030003000484010a0684010a0684010a0384030004000184010a0184010a018402000184010a0184010a018402000184010a0184010a018405000200038401930684019306840193068402000200039301840101059301840101059301840101059302000200038401000684010006840100068402001c001c001c001c000300068401000684010006840100048402000184010105930184010105930184010105930184010103930100018401930684010a0684010a06840193048401000184010a0184010a018402000184010a0184010a018402000184010a0184010a018402000184010a0184010a01840100048401930684019306840193068401930184010004930184069301840693018406930184020004840100068401000684010006840300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011300051d1604030003631300020001630300016312000200016303000163120008630200010d0200010d0200010d0200010d05000863010d0100020d0100020d0100020d0100020d04000863020d0263010d0263010d0263010d0263020d02000100010d06630e0d0163020d08630e0d0163010d01000100010d06630f0d020008630e0d0163020d0100010d06630e0d0163010d010008630f0d020008630e0d0163020d03630101010d0101010d01630e0d0163010d010001000263010d0101010d010101630f0d020002000863010d0263010d0263010d0263010d0263010d020003000563020d0100020d0100020d0100020d0100020d0300040004630100010d0200010d0200010d0200010d0200010d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012100021c16040b00021d0b000b00021d0b000a00041d0a000900061d090005000184031d0184041d0184031d018405000300030f0184031d0484031d0184030f03000200010f0222020f0184011d0184041d0184011d0184050f02000100010f0423010f0184021d0484021d0184060f01000100010f012202230122020f0184061d0184050f022201000100020f0222030f0184061d0184040f032301000100070f0184061d0184040f0122022301000100070f0184061d0184050f022201000200040f0284081d0284040f0200030003840c1d038403000200141d02000100161d01000100041d048406230484041d0100021d03840e220384021d011d01840522010f0122060f0122010f05220184011d010016220100020003220e00032202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a500041a1406100004730800041c040004730800041c040004730800041c0469047304000428041c0469047304000428041c0469047304000428041c0469047304190428041c0469047304190428041c0469047304190428041c0469047304190428041c0469047304190428041c0469047304190428041c0469047304190428041c0469047304190428011c06230169047304190428041c0469047304190428041c0469047300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf00031a140605000226012b0226022908000500052602290800050005260329070004000226012902260229012b01290700040001260129022b01260129012b03290600040001260129022b01260129012603290600030005260329022602290500030005260729050003000526082904000200052609290400020005260a290300020005260a290300010005260c290200010005260c29020001000126012903260d29010001260129012b02260429012b012903230529010001260129012b02260229022607290126032905260f290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009500051c1404050006010d0003000b010a000200090103a4080102000100060104a40c0101000100030103a41001010018010d0101a4060101a4030101000b0101a4050102a4030101000200030101a4060101a4030102a4040102000300030101a4050101a4020101a40501030005000e7c050005000ea4050005000ea40500050001010c550101050005000e01050005000e010500000000000000000000000000000000000000000000000000000000000000000000000000000000000000b900011b15050900030f0a000400010f0200070f080005000b0f06000500010f0100070f08000600010f0200030f0a000600010f0300010f0b000700010f0300010f0a000700010f0400010f090004000318010f01180400010f044104000200091809410200010009180b41010001000918094101010141010009180d4109180d4109180d4109180d4109180d4101000918064103180241010001000918054101180201034101000200091809410200040005180400054104000000000000000000000000000000000000000000000000000000000000000000000000000000610003181408050001550100035506000400075505000300085505000200028707550387020001000687045504870100010009870155048701001087108710871087108710871087108708870413048708870613028708870455048708870455048700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008300041c16050600081c090004000a1c09000200081c0d0001000a1c0c000100071c0224011c0c00041c07240c00011c0a240c0001000a240c0001000a240c0001000b240b0001000b240b0002000b240900012402000c240700022403000d2404000324040005240523092405001124010006000f24020007000c2404000a00072406000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010500061c140513a5040001a501a603a502a701a508a801a501a601a5040005a502a706a501a906a5030001a503aa01a502a701a50aab02a5030001a501aa01ab01aa02a501a906a501a907a501ac01a601a503aa01a501a904a501a903a501a905a501a902a605a501a903a501a905a501a903a501a901a501ac01a605a501a903a501a905a501a902a501a902a502a602a510a903a501ac01a601a501a903a501a90fa5020001a501a902a510a901a501ac01a601a501a901a501a910a501a902a603a501a901a502ab01a502ab01a502ab01a502ab01a502ab02a501ac01a601a501a601a501a901a502ab01a502ab01a502ab01a502ab01a502ab02a502a615a501ac01a600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000db00021c19040d0001230a000c000107022309000b000307022308000a000207010102070223070009000287050702230600080004870507022305000700028701010387050703420300060002870101058705070242030005000a87050701420123020004000c8705070223010003000e8705070223020001070f8705070123010003070f870407010005070f870207020006070f870300010006070d870200014201000200060703870214068702000242010003000607098702000342010004000607078707001800180015000342150002420100150001420200000000000000000000000000000000000000000000000000000000000000000000000000a3000319140701000185010e039701850397080001000185010e028501970385019708000100020e0985060001000185010e03970185039701850197060001000185010e028501970385019703850197018503000100020e0c85030001000185010e03970185039701850397018502970100038c0f06128c128c128c128c128c010002890e190100010010190100010010190100010003190c89011901000100101901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b00041c14040b000501080009000901060008000b01050007000d01040006000f0103000400110103000200140102000100150102000100150102001601020017010100180118010100170101001701020015010100040012010200000000000000000000000000000000000000000000000000000000000000000000000000f100041d16070400031d0500031c07000300051d0300051c06000300051d0300051c06000100031c051d0100061c021d0400041c061d041c051d0300051c051d031c061d0300061c010f021d031c010f061d03000100061c010f011d021c010f061d04000300051c010f011c010f051d06000400021d031c010f031c021d07000300051d010f011c010f051c06000100061d010f021c011d010f061c0400061d010f031c021d010f061c0300061d031c051d051c0300051d041c011d055c041c0100020f0100021d061c010f051d031c040f0300051c030f051d050f01000300051c0300051d06000400031c0500031d0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f00071b14030b0004120900020009760412097602000876015b0412015b087602000876065b087602000812015b04ad015b0812010001120876015b0412015b087601000112097604120976015b0100097604120976015b0100097604120976020009760412097602000976041209760200097601010123010101230101087602000976041209760200097604120976000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df0005191608040004ae010004ae0400020005ae01340135013405ae0200010002ae013403ae01340123013406ae010002ae013404ae01340123013407ae01ae013405ae01340123013407ae01ae013405ae01340123013407ae01ae013405ae01340123013407ae07ae01340123013407ae07ae01340123013407ae07ae01340123013407ae07ae01340123013407ae07ae01340123013407ae07ae01340123013407ae04ae032301340123013407ae07ae01340123013407ae010006ae01340123013406ae0100020005ae01340135013405ae0200040004ae010004ae040000000000000000000000000000000000000000000000000000000000000000006d0003191407080002240800080002240800070004240700070004240700070004240700060006240600060006af0600060006af0600050008af050005000824050005000824050004000a24040004000aaf040004000aaf040003000caf030003000c24030004240c48022412240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf00031914071203010310100103010301100f79010301030110077901b0077901030103011005790510017901b0011001b00179010301030110067903b00279011001b0011001790103010301100179021001790110017901b0017901b0027901b0011001b001790103010301100f790103010301100f790103010301100f790103010301100f790103010301100f790103010301100f7901031203020301b10f03010303b1020301b1010301b1010303b2010303240103020301b1020301b1010301b1020303b201030324010312030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009100031a160607000698070005000a98050003000e9803000200079801850898020002000d98018502980200010012980100010012980100149814981498149814980f980285039801000e98028502980100010003980285029801850a980100020002980285029805850598020002000698018509980200030004980185049801850498030005000a980500070006980700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d000a1d1402020009030db10303020005030389010301b1028801b1028801b1028802b1018901b103030200020301b102030389010301b1028801b1028801b1028802b1018901b1030302000503038901030db1010301230103020005030389010301b1028801b1028801b1028804b10103012301030200010301b1010301b101030389010301b1028801b1028801b1028804b1010301230103020005030389010301b1028801b1028801b1028804b101030123010302230503038901030db10103012301030223020301b102030389010301b1028801b1028801b1028802b1018801b1010301230103020005030389010301b1028801b1028801b1028802b1018801b10303020009030db1030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013900021c16040a0001010d0009000301014b02010200010106000400010102000201014b0701070005000501014b0401014b030102000101020004000101014b0401014b0501014b0401030004000201014b0a01014b0201040003000301014b0601014b0301014b0301030003000101014b0201014b0601014b0401014b0101030001000201014b0301014b0601014b0701020002000501014b0d01014b020002000401014b0f01020002001101014b02010100010101001201014b03010100010101000301014b0d01014b0201020003000101014b0d01014b0201030003000401014b0201014b0201014b0301014b0301030004000301014b0301024b070101000101020003000301014b0301014b0201014b0401014b010104000500014b0d01050007000801014b0101070009000101014b0301014b090000000000000000000000000000000000000000000000000000000000000000000000000000008d00061914060300017f0323057f052302000300017f0323057f052302000100037f0323057f0523017f01000c7f0523027f137f047f02230d7f030003230b7f020003000323047f0323047f02000300077f0323047f02000300077f0323047f02000300027f0e5f03000123017f045f0208035f0208035f030002230e5f03000223035f0908025f030002230e5f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009700021b1405040004130600041304000200071304000713020001000913020009130100031302b30c0002b303130a1302000a130913040009130213010005130600051301000213021307000123020001230700021302130100101301000213021301001013010002131613161316130300101303000300101303000300101303000300061304b306130300030010130300030010130300000000000000000000000000000000000000000000000000000000000000000000000000000000007900061f1405060005b40f0004000ab40c0003000cb40b00020003b4050106230a00010002b406010823090001b40801092308000901072304b606000a01052308b60300060109230bb6050107230e00040108230e00010002010a230d00020002010323040105230a00030002010d230800040002010c23080000000000000000000000000000000000000000000000000000000000000000000000000000008300061e150801000e23070001000e2307001023060001000e1d070001000e1d070001000e1d070001000e1d070001000e1d070001000e1d070001000e1d07000100151d0100151d0100031d0323021d0423021d0423031d0100051d0123021d0123021d0123021d0123021d0123031d0100051d0423021d0423021d0323011d0100151d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd00041a14060100015b0700025b0700015b01000100015b0700025b0700015b01000100025b0500045b0500025b0100028b012b015b0300015b041d015b0300015b012b0241018b0154012b025b0100025b011d029b010f025b0100025b012b011801410254012b055b021d020f055b012b02180100125b01000100125b01000100125b01000100125b01000100125b01000100125b01000100125b01000100125b010002000135052b0435052b013502000100125b01000100125b0100000000000000000000000000000000000000000000000000000000000000000000008b00051a15040400120204001202020004020166025a01660a5a02020602025a01660b5a020206020166025a01660a5a020206020e5a020206020e5a020206020e5a020206020e5a020202b104020e5a020206020e5a020202b104020e5a020206020e5a020202b104020e5a02020d02012301020123060202000a020123010201230102012305020400120200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c300021a14060700062d07000500022d06b7022d05000400012d0ab7012d04000300012d07b7012d04b7012d03000200012d03b7012d0ab7012d02000100012d03b7012d01b7012d05b7012d04b7012d01000100012d04b7012d05b7032d03b7012d0100012d0cb7012d05b7012d012d07b7012d0ab7012d012d12b7012d012d12b7012d012d12b7012d012d12b7012d0100012d10b7012d01000100012d10b7012d01000200012d0eb7012d0200020010b80200020005b8072304b80200020010b80200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f500051a18060500024a0104044a0104024a05000400034a0104044a0104034a04000300034a0104064a0104034a03000200044a0104064a0104044a02000100044a0101084a0104044a01000204010101040301010401010b04054a0101084a0104054a054a0104084a0104054a054a0104084a0104054a054a0104084a0104054a14040100054a0104064a0104054a01000200044a0104064a0104044a02000300044a0104044a0104044a03000400034a0104044a0104034a04000500024a0104044a0104024a05000600024a0104024a0104024a06000700014a0104024a0104014a070008000104024a010408000900024a0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000f500051a1806050002b9014204b9014202b90500040003b9014204b9014203b90400030003b9014206b9014203b90300020004b9014206b9014204b90200010004b9010108b9014204b901000242010101420301014201010b4205b9010108b9014205b905b9014208b9014205b905b9014208b9014205b905b9014208b9014205b91442010005b9014206b9014205b90100020004b9014206b9014204b90200030004b9014204b9014204b90300040003b9014204b9014203b90400050002b9014204b9014202b90500060002b9014202b9014202b90600070001b9014202b9014201b907000800014202b901420800090002b90900000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf00051b150501000801040008010100014a01010372010103720101020001010372010103720101014a014a1401014a014a010103720101037204010372010103720101014a014a1401014a014a010103720101037204010372010103720101014a014a1401014a014a010103720d0102720101014a014a1401014a014a010103720d0102720101014a014a1401014a014a010103720d0102720101014a014a070106410701014a014a1401014a014a1401014a0a4a02010a4a0900044a090000000000000000000000000000000000000000000000000000000000000000004f00071d15080300061d0c000300061d0c00151d151d151d151d151d151d151d151d151d0100051d0301011d0301011d0301011d03010100051d0301011d0301011d0301011d03010100141d0100141d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001d300091d160304431200045501000126010004430c00045501000151010001000126010001550100044308000355014301000126010001510100010001260100015501000143010001510243060002550143010001430100012601000151010001000126010001550100014301000151010002430400025501000143010001430100012601000151010001000126010001550100014301000151010003430200025501430100014301000143010001260100015101000100012601000155010001430100015101000143010002430255010001430100014301000143010001260100015101000100014301000151010001260100015501000143020002550200014301000143010001550100014301000155010001000143010001510100012601000155010001430100025502430100014301000143010001550100014301000155010001000143010001510100012601000155010001430255020003430100014301000155010001430100015501000100014301000151010001260100015501000255040002430100014301000155010001430100015501000100014301000151010001260100035506000343010001550100014301000155010001000143010005550a00054301000155010005551000054300000000000000000000000000000000000000000000000000000000000000000000000000000000000000008d00061a140603000e970300010004850d970185010005850d97028504850e97028504850e97028504850e97028504850e97028504850e9702850485049706380497028504850497063804970285048503970838039702850485019708380223020d013802850200039708380423013802000200039704380223010103230101012301380200020003970d38020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011900031a160607000156056c07000500026c0156046c01ba026c050003000a6c01ba036c03000200086c016d056c021902000200026c02ba016c0119036c016d066c02000100076c0119016c0138056c0156026c01000100076c0538026c0156036c0100046c016d026c013804000138066c011c016c021c016c016d016c013806000138026d036c011c066c013806000138066c066c013806000138066c026c0156036c013806000138036c02ba016c026c0156036c023804000138026c0156046c0100076c0538036c0156026c01000100046c01ba066c0219056c01000200026c01ba046c0156086c02000200076c0156040e016d036c02000300026c0119096c016d016c030005000119096c05000700016c021c036c070000000000000000000000000000000000000000000000000000000000000000000000000000008d00071c140502000e1401a4060001000f1401a4017e050001000f1401a4017e017c017e017c017e017c101401a4027e017c017e017c017e101401a4017e050001000f1401a4060001000f1401a4060002000e1401a406000500057e01a40c000500057e02a40b000500057e03a40a000500077e0b0004000114012301260123012601230814050004000e14050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005900041d1407070006010900050005010c001001060011010500110105001101050011010500110105001101050011010500110105001101050011010500050110460100050104460142014601420a460501114601000501104600000000000000000000000000000000000000000000000000000000000000000000000000008700031c14040c00082604000a000526045102260300090005260251022302510126030009000526025102230251012601140200090006260451022603140100022607000a26031401000100052605000a260300162602001726010018261826182601001726010017260200162602000b26018a0926010003000726038a092602000500102603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c100031a160607000643070005000a43050003000343011c0543011c0243021c030002000243031c0543061c020002000243021c0543071c02000100011c0243031c0343091c01000100021c0243011c0443091c0100031c0843091c031c0d43041c041c0743091c051c0543091c0143061c0443081c0243061c0443071c03430100031c0643071c024301000100021c0843041c044301000200011c0943041c024302000200011c0443081c0343020003000e43030005000a4305000700064307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e700011915070700040107000500020102af040105000400010101af010102af020102af0101040003000c0103000200010101af020101af020101af060102000200010101af060102af020101af010102000100010101af020101af040102af030101af010101000100010101af0c0101af010101000100010101af0b0101af02010100100101af0101050101af0a0101af0101020101af0a0101af020101af0101020101af0a0101af020101af0101120112010e0102af02010100100101000100030101af080101af0301010002000501021e0701020003000c0103000500050101af020105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9000119140608000326080005000126020701260107012602070126050005000207012603070126020705000400010f0407010f0407010f040003000d07030003000107012604070126040701260107030002000107012601890126020701260189012602070126018901260107020002000207012604070126040701260207020001001107010001001126010013260100118a010001001107010001001107010002000f07020002000f07020002000f07020003000d070300030006260323032604000500098a05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009300031a14080300057c0a000100010e0300087c05000100020e0b00047c010002240f000100020e0400010e0300010e0300010e02000100020e0300020e0200020e0200020e0200040e0100030e0100030e0100030e0200100e0200100e0200100e0200100e0200100e0200100e0200100e0200100e0200020e0172010e026d010e026d010e0172050e0200100e0200100e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c900031a160607000651070005000351010001510200035105000300035102000151020001510200035103000200035102000151027e0151027e01510200025102000200025102000151027e0151027e0151027e015101000151020001000251020001510100017e0151027e0151027e0151017e010002510100010001510200015102000151027e0151027e0151017e01000151010001510100025101000151020001510100017e0262017e0151017e0100015102000251015101000151027e0151020004620200015102000151010001510251027e0151027e06620151027e01510200015101510100017e0151027e01510662027e0151017e01000251015101000151027e0151027e0462027e0151027e01510100015102510100017e0151027e0151017e0262027e0151027e0151017e02510100015101000151027e0151027e01510100017e0151027e0151027e01510100010002510100017e0151027e01510100017e0151027e0151027e025101000200015101000151027e015102000151027e0151017e010002510200020002510200015102000151027e015102000351020003000351020001510200015102000351030005000351020001510100035105000700065107000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019500041d1403020001bb060001bb060001bb060001340200010003bb0400013402bb040003bb040001bb013401bb010005bb020001bb013403bb020005bb020002bb013402bb05bb020001bb013403bb020003bb013401bb020002bb013402bb03bb013401bb020001bb013403bb020003bb013401bb020005bb03bb013401bb023401bb013403bb023403bb013401bb023402bb013402bb03bb013401bb023401bb013403bb023405bb023405bb03bb013401bb023401bb013403bb023405bb023405bb03bb013401bb020005bb020005bb020005bb013404bb020005bb020001bb013403bb020003bb013401bb013404bb020005bb020001bb013403bb020003bb013401bb013402bb013401bb023405bb023401bb013403bb023403bb013401bb013404bb023405bb023401bb013403bb023401bb013401bb013401bb013404bb023405bb023401bb013403bb023403bb013401bb013404bb020005bb02000585020003bb013401bb05bb020003bb013401bb02000585020003bb013401bb05bb020003bb013401bb020001bb013403bb020005bb0000000000000000000000000000000000000000000000000000000000000000000000000000000000009500031814050800062305000800062305000300102303420726078702260100014201000726078702260342072607870226034207260787022603420726078702260342072607870226034207260787022603420726078702260342072607870226034207260787022603420726078702260342072607870226010001420100022603ae022607870226034207260787022603001023000000000000000000000000000000000000000000000000000000000000000000000000000000000000af00051b140516bc010002bc010002bc010002bc010002bc010002bc010002bc010002bc010016bc02bd01bc10bd01bc02bd02bd01bc10bd01bc02bd02bd01bc10bd01bc02bd02bd01bc10bd01bc02bd01bd017b01bc10bd01bc02bd02bd01bc10bd01bc02bd02bd01bc10bd01bc02bd02bd01bc10bd01bc02bd02bd01bc10bd01bc02bd02bd01bc10bd01bc02bd16bc010002bc010002bc010002bc010002bc010002bc010002bc010002bc010016bc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b500011f18010e00020f0e000d00040f0d000c00060f0c000b00030f015c040f0b000a00030f015c060f0a000900030f015c040f015c030f090008000a0f015c030f080007000c0f015c030f07000600120f06000500140f05000400160f04000300180f030002001a0f020001001c0f01001e0f0600120f06000500140f05000400160f04000300060f065c0c0f030002001a0f02001e000700010f0e00010f07000600020f0e00020f06000500030f0e00030f0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000db00021c14040b0002be0b00090006be0900080002bf01be02bf01be02bf0800070003bf01be02bf01be03bf0700060003bf01be04bf01be03bf0600060003bf01be04bf01be03bf0600050003bf01be06bf01be03bf0500050003bf01be06bf01be03bf0500030012be0300030012be030005000ebf050005000ebf0500010002bf012310be012302bf0100010002bf012310be012302bf010001be02bf012310be012302bf01be01be02bf012310be012302bf01be010002bf012303be0b2302be012302bf0100010002bf012310be012302bf010005000ebf05000000000000000000000000000000000000000000000000000000000000000000000000008700031b14050c00042003ba03000a00062001ba012301ba012002000900072003ba022001000800042005000320025f070004200800035f070004200800025f010e070005200800020e080006200600020e090008200300010e01000a00092003000b00092002000d00082001000f00062001000100156a166a0b2006090520162001001420010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012300031b18050a00024f0a000900044f0900040002ba0200019a044f019a020002ba0400030005ba019a044f019a05ba0300020007ba019a024f019a07ba0200020007ba041307ba0200030004ba0213046d021304ba0300030003ba0113086d011303ba03000200029a02ba0113086d011302ba029a02000100034f019a01130a6d0113019a034f0100054f01130a6d0113054f054f01130a6d0113054f0100034f019a01130a6d0113019a034f01000200029a02ba0113086d011302ba029a0200030003ba0113086d011303ba0300030004ba0213016d0385021304ba0300020007ba041307ba0200020007ba019a024f019a07ba0200030005ba019a044f019a05ba0300040002ba0200019a044f019a020002ba04000900044f09000a00024f0a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d700031c1904050003011000040005010f000300014205010800022301000223020002000242050108000242010002420200010004420301090006420100074204000223064201110142011102420542070006010642044209000b01054209000a010100054209000901020004420a00080104000f4205010400104204010400114203010400124202010400054207010742010104000542062302010642010004000542090104420200040001420e0002420300010004420e00014204000100014211000242030001000123120002420223010001231600000000000000000000000000000000000000000000000000000000000000000000000000000000006d00061914070300051c0300041c03000200071c0100061c02000100041c020f0a1c01000100041c020f0a1c010001000d1c020f011c010001000d1c020f011c01000100101c01000100101c01000100020f0e1c0100011c020f0f1c121c121c126702670e5c026701001067010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010f00051914070700010b0100010b0100010b06000800030b07000800030b070007000157030b0157060003000157030b0157030b0157030b03000200010b0157030b0157030b0157030b015702000100020b0157030b0157030b0157030b0157010b0100030b0157030b0157030b0157030b0157020b030b0157030b0157030b0157030b0157020b030b0157030b0157030b0157030b0157020b030b0157030b0157030b0157030b0157020b030b0157030b0157030b0157030b0157020b030b0157010b01c0010b0157030b0157030b0157020b030b0157020b04c0010b0157030b0157020b0100020b0157030b0157030b0157030b0157010b01000200010b0157030b0157030b0157030b0157020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081000419140108000f34010008000f34010009000d23020009000d26020009000126015d0b26020009000126015d0b260200013401000234010004340d26020002000134020004340d26020001000234010005340d26020009000d26020009000d26020009000d26020008000f34010008000f2301000700118e0700118e0700112300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008900051b16030c00028c0a000b00048c09000200028c0700058c0600028c0200048c0400028c0104018c0104018c0400048c0200068c0200068c0200068c0300148c01000300148c01000300148c01000300148c01000400128c02000400128c02000400118c03000400118c030005000f8c040003000f8c0600118c07000400028c12000200048c12000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008f00091c120204000a8002000a80040001800501048002000180050104800400018005010480020001800501048005800501078005010480058005010780050104800180030001800501048002000180050104800180030001800501048002000180050104800180030001800501048002000180050104800400018005010480020001800501048004000a8002000a80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b100011a140609000241090009000241090008000441080007000641070007000641070006000841060006000841060005000a41050003000ec1030001c2010001c10ec201c1010001c202c201c10ec201c102c202c201c10ec201c102c202c201c10ec201c102c20200104c02000200104c02000200104c02000200104c0200020003c20123010101230101012301010123010101230101012302c20200020003c20b4102c202000300088a018e078a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df00051d1805030001b10c00040d0400020002b10e0004b10200010002b10e0002b1017e022301b10100010002b10e0002b1017e04b101000fb1017e02b1017e02b1029802000eb1017e02b1017e01b1017e02b103000eb1027e02b1010002b1030010b1030001b10100030010b10500030010b10500030011b10400030011b10400020005b1017e0cb10400020005b1017e01230101012301010123010107b10300020004b1017e0ab1010003b10300020003b101000ab1040001b10300010002b1110001b1030003b1100002b1030001b1120001b1040001b1120001b104000000000000000000000000000000000000000000000000000000000000000000f100031a160607000626070005000326042b0326050003000326022b0426022b0326030002000226022b0826022b0226020002000126012b0c26012b0126020001000226012b0c26012b0226010001000126012b092603290226012b012601000226012b032603290826012b02260126012b1026012b01260126012b1026012b01260126012b1026012b01260126012b1026012b01260226012b112601000126012b1026010001000226012b0f26010002000126012b02260129012604290426012b0126020002000226022b0826022b0226020003000326022b0426022b0326030005000326042b03260500070006260700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008700051b1405020012210200030010950300010014210100162113210151022101211207015101070121012114070121012112070151010701210121140701210121140701210121140701210221080703250707022101000121070701140125012302250607012101000100022107070325060702210100020003210c070321020004000e2104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d500061d16020900010801000108010001080100010801000108090007000c08080006000f08060001000208020004080e7a040004080200137a020001000408157a01000508157a010001000408117a0108047a02000308107a02c5047a010004080e7a02c5047a0282020003080d7a01c5047a02820200010004080c7a01c5047a018204000508057a0208047a010801c5037a018205c501000408047a0108057a020801c5027a018201c5047a010004080200077a040801c5077a0200010002080600027a0508027a01c5047a04000c0003080c00000000000000000000000000000000000000000000000000000000000000000000000000000000000001e300031e15020800068e0100058e08000700018e0626018e0526018e07000600018e0126068e0126058e0126018e06000300018e0100018e0126018e0626018e0526018e0126018e0100018e03000400018e0126018e0126068e0126058e0126018e0126018e04000400018e0126018e0126018e0500018e0400018e0126018e0126018e04000400018e0126018e0126018e0a00018e0126018e0126018e04000400018e0126018e0126018e0a00018e0126018e0126018e04000200018e0100018e0126018e0126018e0a00018e0126018e0126018e0100018e02000300018e0126018e0126018e0c00018e0126018e0126018e03000300018e0126018e0126018e0c00018e0126018e0126018e03000300018e0126018e0126018e0c00018e0126018e0126018e03000300018e0126018e0126018e0c00018e0126018e0126018e03000100018e0100018e0126018e0126018e0c00018e0126018e0126018e0100018e01000200018e0126018e0126018e0e00018e0126018e0126018e02000200018e0126018e0126018e0e00018e0126018e0126018e02000200018e0126018e0126018e0e00018e0126018e0126018e02000200018e0126018e0126018e0e00018e0126018e0126018e0200028e0100018e0100018e1000018e0100018e0100028e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b100041d1405050005c605c70900040006c701c605c70800030006c602c701c605c70700020007c701c602c701c605c70600020008c701c601c701c605c70600010009c701c602c705c601c70500010009c701c608c70500010009c701c608c70500010009c701c608c70500010009c701c608c70500010009c701c608c70500010009c701c608c70500010009c701c608c70500010003c70fc6050004c701c60d2301c605c704c701c60dc701c605c718c7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009700041c1704050005240400052405000300092401000824030002000624020106240201042402000100092401010524020101240101032401000100132401010224010014240101032418241824182401001624010001001624010002001424020002001424020003001224030004000724020101230624040005000e24050006000c24060007000a2407000900062409000b0002240b0000000000000000000000000000000000000000000000000000000000000000000000000000000000d100031d14020d0002230c000400016104620261062302610462016103000d0002230c000d0002230c000a000720075603000100022006000220019a0120019a0120019a0120085602000100032004000320019a0120019a0120019a012009560100010002620e200556030102560162022301620d200556030102560162022301620d200556030102560100026202000c200a5606000b2008560101015607000a2008560101015608000920065602010156010009000820085602000a000e2003000c000123020001230b0007000e230600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006700061b1405020003181100010005181000010006180f0008180e0008180e0008180e0008180e0009180d000b180b0001000c18090002000418020008180600030002180400091804000300021805000a1802000300021806000318042304180300025b07000a5b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a900051b150507000805070004000305081f03050400020002050e1f0205020001000105121f010501000105141f01050105141f01050105141f0105010d0105121f0105011f020d02050e1f0205010c011f040d0305081f0305020c021f070d0805060c011f040d030c020d010c010d090c021f070d0e0c011f0100030d030c020d0b0c011f01000200050d030c0105010d0205010d050c02000400030c020d090c04000700080c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf00061b15050900018e0100028e0900040003ad0100068e010003ad04000200028e03ad068e020003ad04000200028e07ad018e06ad04000100038e06ad036d05ad04000200028e07ad016d06ad04000200028e07ad016d06ad04000100038e07ad016d06ad04000200028e07ad016d06ad04000200028e07ad016d06ad04000100038e128a0200028e0e8a0123018a0123018a0100038e028a016d0123016d0123016d0123016d098a048e128a0100038e128a0100018e0100018e0e8a0400000000000000000000000000000000000000000000000000000000000000000117000317140905000489050002000183013906890139018302000100028301390689013902830100028301390289016d0219038901390283028301390389026d0119028901390283028301390589016d0119018901390283028301390389026d0119028901390283028301390289016d0219038901390283028301390389026d0119028901390283028301390589016d0119018901390283028301390389026d0119028901390283028301390289016d0219038901390283028301390389026d0119028901390283028301390589016d0119018901390283028301390389026d0119028901390283028301390289016d0219038901390283028301390389026d0119028901390283028301390589016d0119018901390283000000000000000000000000000000000000000000000000000000000000000000000000000000011100031c1505080001830e000100027c04000183015101830d000100021103000183035101830c00010002110200018302510183025101830b0001000211010001830251018301c8018302510183071103000100021101830351038303510183071102000100011101830b51018307110100010001830d510183071101830f51078317510351051103510b8301510351051103510183031103c80311018301510351051103510183021105c80211018301510351051103510183011107c801110183015103510311012601110351018306c8017c02c801830151035105110351018305c8027c02c80183015103510111032301110351018304c8037c02c8018301510351051103510b8301510251077c0e5100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf00071c19020500061c0893051902000400021c059b08010316031901000400011c019b051c08930319020102190400011c019b051c08930319020102190400071c089305190116011904c9071c089305190116011904c9071c0893071904c9071c089305190116011904c9071c0893071904c9071c089307190400071c089307190400011c029b041c089307190400011c029b041c01930201019301010393061901000500061c0893051902000800021c0c00021902000800011c0d00011903001600011903001a001600011903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011b00051e1405080006010b0005000401013c0201023c0301080004000101033c0301013c0301023c0101070003000101013c0601013c0501013c0101060002000101033c0101043c0101013c0101053c0101050002000601013c0601013c0401050001000101013c1001013c0101040001000501053c0101063c030104000100140104001201013c0101013c020102000101023c0901063c0101013c040101000301013c0401013c0501013c0201013c0101013c0201013c010101000301013c0401013c0501013c0301013c0201023a013c01010101023c0101053c0101033c0201043c0201023a013c01010101013c0301013c0501013c0401013c0101013c0201033c010101000401013c0501013c0401013c0101013c05010100000000000000000000000000000000000000000000000000000000000000000000000000e700021b14060400040f0d000300060f0100061c05000700020f091c03000500080f031c01ca031c01000400040f01ca030f031c01ca0200031c0400020f020002ca0100010f021c02ca0300021c0400010f040002ca0100021c01ca0400021c090002ca0200011c01ca0500011c0400060f01ca020002ca06000300080f01ca010002ca06000300080f01ca010002ca06000300080f01ca010002ca06000300080f01ca010002ca060003000e26040002001026030001000d260146042602000226014601260229022602290226014603260146032601000626022906260146052601001426010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011b00031c1b050700055f016a035f07000400016a0e5f04000200065f016a0c5f02000200135f02000100085f0576055f016a025f01000100015f016a045f0976065f0100055f0d76055f015f016a025f0f76025f016a015f045f0f76045f035f1176035f035f1176035f0100015f1376015f01000100015f1376015f01000100015f1376015f01000100015f036e0176036e0176036e0176036e0176036e015f01000100156e01000100016a086e0690066e01000100016a0200016a0e6e016a0100016a01000100016a0200016a0e00016a0100016a01000100016a0200016a0e00016a0100016a0100016a0200016a0f00016a0200016a016a0200016a1000016a0100016a016a1300016a0100016a016a1500016a016a1500016a000000000000000000000000000000000000000000000000000000000000000000000000b500011d1a0309000882090007000c82070007000982037d07000400107d023704000300057d0f37030003000b3709380300010005370a3809370100010006380a37087d0100010009370f7d01000637147d0437167d1a7d1a7d1a7d187d0237167d0437147d0637010001370b7d0c37010001000e37042503370382010003000b370225022302250382030003000482083704250482030003001482030004001282040007000c8207000900088209000900088209000000000000000000000000000000000000000000000000000000000000000000000000000000000000009900051a1406037e0a00037e0400017e0238017e0800017e0238017e0400017e0338017e0600017e0338017e04000100017e0338017e0400017e0338017e05000200017e0238027e0200027e0238017e060003000a7e07000300087e09000300087e09000300087e09000300087e09000300067e088103230300067e088103230300067e0b810300067e022309810300067e0b810300067e0b81000000000000000000000000000000000000000000000000000000000000000000000000000063000218140807000224070007000224070006000424060006000424060005000689050005000623050001000224028902240289022402890224010001000e23010010241024102410241024102410241024022403890224038906240424048908241024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a700061b1605161f011f010b013c120b011f011f1456011f011f1456011f011f1456011f011f1456011f011f1456011f011f1456011f011f1456011f011f1456011f011f1456011f011f1456011f031f010e011f010e011f010e011f010e011f010e011f010e011f010e011f010e011f010e021f021f130e011f021f010e011f010e011f010e011f010e011f010e011f010e011f010e011f010e011f010e031f011f130e021f161f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009100021e19050800031e0e000700081e0a0007000c1e060006000c1e070006000b1e080005000b1e090005000a1e0a0004000a1e0b000400091e0c000300091e0d000300081e0e000200171e0200161e01000100151e03000100131e0500121e070005000b1e090004000a1e0b000400081e0d000300071e0f000300051e11000200041e13000200021e15000100011e170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ab00021b16050a00018c0b000900018c0c00030001910600018c040001400600020001910300018c0200038c0140010002400600030002910200028c0191028c034004000291010005000340028c0191018c014001910240018c0200019102000100018c0200014001910340018c0191018c024001910240028c0300038c034001910340038c024001910140018c04000100018c0100018c024001910340018c0191028c014001910140028c03000300018c0191024001910240028c0191028c02400191028c010001910100028c0191018c024001910240028c0191028c0240038c010001910200018c0140028c014001910240058c0240028c0191018c01910100058c0740038c01400191038c010001910100038c01910840028c01400191028c020001910200018c01910a40018c0191028c03000200038c0140018c01910640018c0191038c01910200030001910140028c0191014004230140048c0100029101000200048c01910740028c0191028c03000200018c010002910740028c0191018c01910400050001910100014001000340018c0191018c0100018c0500090001400191010001910900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008300051d1503070004240400042407000500072402000724050004000d2402010324040003000e2403010324030002001324010102240200010018240100010006240c01062401000524100105240424120104240324140103241a240100182401000100182401000200162402000300082404010824030005001024050008000a2408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009d000118140806000324070004000724050003000137092403000200012401370a240200020002240137062401370224020002000324043702010324020002000724023703240200020007240237032402000b2a0101042a0b2a0101042a0b2a0101042a0b0d0105040d0b0d0105040d0b0d0105040d0b0d0105040d0b0d0105040d0b0d0105040d060d0223030d0105040d0b0d0105040d0b0501010405000000000000000000000000000000000000000000000000000000000000000000006d00031814080400081f040003000a1f03000200031f0600031f02000200021f0800021f02000200011f010d0800011f010d02000200020d0800020d0200107a108a108a108a108a108a108a108a018a026d0a8a026d018a018a026d048a0223048a026d018a078a0223078a108a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008700081d1403010008290800082901000229060a022906000229060a022901260829012606000126082901260a2606000a26012601280826060008260128012601260128092604000826022801261726012802260100182601000100152601280226010002001626020003000626020a0126020a0126020a0626030004001226040006000e26060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007900071c1405070005890b00070005890b000a0002890b000a050289030508000a050289030508000a050289030508000a050289030508000a0502890305060102000a05028903050401013a010102000a0502890305060102000a0502890305060102000a050289030501010423010102000f050601020017050000000000000000000000000000000000000000000000000000000000000000000000000000fb00061b14050acb01000bcb01cb0b0001cb040001cb030001cb01cb01000bcb010001cb010004cb010001cb01cb010001cb030001cb070001cb040001cb010001cb01cb030001cb030007cb010004cb010001cb06cb010002cb030001cb080001cb01cb010001cb050001cb010001cb010001cb010006cb010001cb01cb010005cb010001cb010003cb080001cb01cb050001cb050001cb010008cb01cb010003cb010003cb010001cb080001cb010001cb01cb030001cb010001cb010001cb010008cb010001cb010001cb03cb010001cb100001cb01cb010001cb010004cb010007cb010005cb01cb030001cb080001cb070001cb14cb010001cb000000000000000000000000000000000000000000000000000000000000000000000000d900071a1f05010002950f06012102060100029501060e9201210143010e0100029501060e920121010e01430100029501060e92012102c80100029501060e92012102060100029501060e92012102c80100029501060e92012102060100029501060e92012102c80100029501060e92012102060100029501060e92012102c80100010e019501060e9201210206020e019501060e92012102c8020e01950f06012102c8010e02950f0601210206010e1400010e1400010e1400010e1400010e1400010e1400010e1400010e1400010e1400010e1400010e140000000000000000000000000000000000000000000000000000000000000000000000000000008d00031b14080100014a0d7f04000100014a067f0524027f0400034a057f09240289034a097f05240289034a0d430300034a0143017f0143027f0143047f0143017f01430300034a0d430300034a0d430300034a0d430300034a0d430300034a0d430300034a0d430300034a0d430300034a0d430300034a0d43030003c80d7f0300034a0d430300034a0d4303000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e500041a14061497019702060101010603010a0601010197019701060101010603010b060101019701970101010603010c06010101970197010603010d0601010197019703010106063c0106063c01010197019702010206013c0406013c0106013c0406013c0101019701970101043c0406033c0406013c0101019701970106013c0206013c0406013c0106013c0406013c0101019701970106013c0206013c0406013c0106013c0406013c0101019701970406063c0106063c0101019701971106010101970197110601010197019711060101019701971106010101970197120101971497000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013b00021a1406030002230300022403000224050002000172030001230172030001240172030001240300140c010c030f020c030f020c030f020c0123010c0123010c010c010f015c010f020c010f015c010f020c010f015c010f020c0124010c0123010c100c014e010c01b0010c020c0123040c0123030c0301020c014e010c014e010c020c0123040c0123030c0372020c014e010c014e010c020c0123040c0123040c0123070c020c0123040c0123040c0123070c020c0123040c0123040c0123050c011f010c020c0123040c0123040c0123070c020c0123040c0123040c0123050c011f010c020c0123040c0123040c0123070c020c0123040c0123040c0123050c011f010c010c0301030c0123040c0123070c010c0372020c0301030c0123040c021f010c020c0123030c0372030c0123040c021f010c140c000000000000000000000000000000000000000000000000000000000000000000000000a500031a160607000687070005000387035e0487050003000487035e0787030002000487025e0687015e0387020002000e87015e0187020001001287010001000587015e0887015e038701000287015e11870187025e11870187015e128714871487148701001287010001000f87015e028701000200058702230687025e0187020002000b87035e0287020003000687015e0387015e0387030005000a87050007000687070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a100051c15040383010002830c000283010003830383010002830c850283010003830383010002830c850283010003830383010002830c8502830100038307830b85068307830b85068307830b85068304000e85060004000f85050004000f85050004000f850500040005850d980200040005850d98020004000585069802840298028401980200040005850d9802000400058501980b840198020009000d9802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a300011f14030c0002350e000a000235030002350b0009000135030002350d0008000135030001350f00080001350200013510000800013502000135100008000135020001351000040009110f0003000211014909110d000200021101490b110c000100021101490d110b00010011110a001311090002110149101109001411080001001b1102001511050003000a11078508000400021107850711080005000f110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d300031c15040a0004010a0009000101028d0301090008000101018d0601080008000101018d0601080007000a01070007000101018d0601018d0101070006000c01060006000c01060005000e01050005000e0105000400021d0201021d0401021d0301011d04000400021d0101041d0201041d0101021d04000300021d0201051d0101041d0201021d03000300021d02010a1d0201021d03000200031d0201051d0101041d0201031d02000100021d01010f1d0101031d01000b1d0301071d0101021d0100161d01000300061d0600061d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009500031e1407070e0400070e0500070e0400070e0500070e0400070e0500070e0400070e0500070e0400070e0500070e0400070e0500070e0400070e050002000e05070002000e05070002000e05070002000e05070002000e050400030e02000e050400030e02000e050400030e02001205030002000e05011f0105011f0105030002000805024b0105024b050503000200120503000000000000000000000000000000000000000000000000000000000000000000000000000000000000010100031b14020900067f0200017f07000700037f0400017f0300027f0100017f03000600017f0200037f0300037f07000700027f0100017f0e0019000300160103000101016f014b1101014b010101000101014b0101016f014b1101014b0101020101000101016f024b1001014b0101010102000101016f024b1001014b0101010102000101016f024b1001014b0101020101000101016f024b1001014b010101000101014b0101016f024b120102000101014b0101016f014b1101010004000101016f014b1101010005000101016f014b040104370401014b0201020006000101016f014b040102370401014b0201030007000101016f024b0601024b020104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c500021c150408000855080005000855025104550500030003550151045502510455025102550300020008550451055501510255020001000a5502510a5501000100035502510c5503510255010003550451065502510255055102550155015102550251035501510355025102550551025501550151105503510355185501001655010003001255030005000eaf050005000eaf050005000eaf050005000eaf050005000eaf0500050002af045508af0500050002af01550223015508af0500070004550d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006300021814080700022607000700022607000600042606000600042606000500068a050005000623050001000226028a0226028a0226028a0226010001000e230100104610461046104610461046104610460246038a0246038a06460446048a08461046000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb00051c1404040002ce01cd03ce01cd03ce01cd03ce01cd01ce0400020001cd03ce01cd03ce01cd03ce01cd03ce01cd03ce020002ce01cd04ce01cd03ce01cd03ce01cd03ce01cd04ce03ce01cd03ce01cd03ce01cd03ce01cd03ce01cd04ce03ce01cd03ce01cd03ce01cd03ce01cd03ce01cd04ce03ce120103ce01001601010001001601010002001401020001001601010001001601010002001401020001001601010001000a0103cf09010100020014010200030012010300000000000000000000000000000000000000000000000000000000000000000000000000dd00021e1402100001360b00100001360500013605000f000136040002360600050001d0010001d0010001d005000136020002360800040001d0015c01d0015c01d0015c01d002000298038803160700030001d0015c01d0025c03160398068802160600020001d0015c01d0025c02160419038803c20288011602980400020001d0015c01d0015c02160619018801c2034601c201880116039803001c0b01001a0b010001001a8901000200188902000200180b02000300168903000300160b03000400140b04000500070b0789040b05000600100b060008000c0b0800000000000000000000000000000000000000000000000000000000000000000000012b00041a14060a00019c09000800019c0100019c0100019c07000900039c080008000137039c013707000200029c0137039c0137039c0137039c0137019c02000100039c0137039c0137039c0137039c0137029c0100049c0137039c0137039c0137039c0137039c049c0137039c0137039c0137039c0137039c049c0137039c0137039c0137039c0137039c049c0137039c0137039c0137039c0137039c049c0137039c0137039c0137039c0137039c049c0137039c0137039c0137039c0137039c049c0137039c0137039c0137039c0137039c049c01c8019c0123019c0137039c0137029c01c80137039c0100039c0137029c0423019c0137039c0137029c01000200029c0137039c0137039c0137039c0137019c02000300019c0137039c0137039c0137039c0137030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b30002181406070001240a0004000b24030003000b24040003000c24030001000e2403000624070e0424010002000424070e04240100020002240c0e01240100020002240c0e01240100020002240c0e01240100020002240c0e01240100020002240c0e012401000200100e0200040e0a08020e0200030e0c08010e0200030e010801240208010e0108010e030801240108010e0200030e01240a080124010e0200030e01240a230124010e0200030e0c24010e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000008b00021b14010d00010d0c000d00020d0b000d00030d0a000d00040d09000d00050d08000d00060d07000b000b0d040009000e0d03000800100d02000100030d0300110d02000200030d0100130d01000200170d01000300160d01000200180d0200030d0100140d0100030d0200130d0100030d0400080d090b02000800060d090b03000900040d090b04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057000918140704000b86020002000e86010002000f8602000f8602000f86010010861186118602000286047f0623037f020001d10486017f0623017f0286020002d1037f04d1012303d1027f020008d1012301d1012304d100000000000000000000000000000000000000000000000000000000000000000000000000000000a3000418160810511051045108a40451035102a4012304a4012302a40351035102a4012304a4012302a40351035101a4037c02a4037c01a40351035104a4022304a40351035104a4022304a40351045108a404511051045108a40451035102a4012304a4012302a40351035102a4012304a4012302a40351035101a4037c02a4037c01a40351035104a4022304a40351035104a4022304a40351045108a4045110511051000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f5000218140507000ad20200060001d20ad301d20100050001d201d304d402d304d401d301d2050001d201d30ad401d301d2050001d201d301d402d501d302d401d302d501d401d301d2050001d201d303d401d302d401d303d401d301d2050001d201d304d402d304d401d301d2050002d201d308d402d301d20400042b01d308d401d301d20300062b08d401d301d20300062b01d207d401d301d20200072b01d207d401d301d20200072b01d207d401d301d20200072b01d207d401d301d20200062b02d207d401d201000200052b03d206d401d202000200032b04d206d401d20300010001d2012b07d206d403000bd207d40100000000000000000000000000000000000000000000000000000000000000000000000000000000000000f300021d14040a0005810a000700048103820481070007000181098201810700050003810982038105000500018105820398058201810500020004810282099802820481020002000181058209980582018102000200018102820f980282018102000381018211980182038101810382119803820181018102821398028201810181048206980351079803820181010002810382049805510498038202810100030002810182039807510398018202810300050001810198025507510255019801810500040001810f550181040003000481035505810355048103000300018102d6058103d6058102d601810300040011d6040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009700091c18020700036d0572097502240600046d027201b10272097502240600046d0572087503240100096d0572087503240a6d0572087503240a6d0572087503240a6d0572077504240a6d0572077504240100096d0572077504240600046d0572077504240600036d0224017201b10272067505240700036d057206750524160001240100022418000224180001240100180001240100000000000000000000000000000000000000000000000000000000000000000000000000000000007900051914060100042309000423010006230700062306230901042305230b01032304230d010223010002230e010123010002001001010002001001010002001001010002001001010002001001010002001001010002000a0104230201010002000a010423020101000200070106230301010002001001010000000000000000000000000000000000000000000000000000000000000000000000000000005900091d14031ad701d7180001d701d7180001d701d7180001d701d7030010d7050001d701d7030001d7140001d701d7030001d7140001d701d7030001d7140001d701d7030001d7140001d701d7030016d701d7190014d7060000000000000000000000000000000000000000000000000000000000000000000000000000010100041b1605040005d80d00020002d8036004d80b00010002d8016003c9036002d80a00010002d8016001c902d8016002c9016001d80a0002d8026003d8016002d8016002d8090001d8016002c9036001d8046002d8080001d8016002d8016003d8016001d802c9016005d8040001d801600bd8016006d8020002d8016012d80100010001d8016010d8016001d80100010002d8016012d8020002d801600dd8026002d803000fd802c9016001d8040005d8036005d8016002d8016001d8050002d8016002d802c9056001d8026002d8060002d8026002d8016004c9016002c901d80100080002d8036004d8016003d801000a0003d8046003d802000d0005d8040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007300031714090600022306000600022306000500042305000500042305000400062304000400022301570323040003000223035703230300030007570123030002000a57020002000a57020001000c57010001000c5701000e570e57025704260557032601570626035704260326083703260e2600000000000000000000000000000000000000000000000000000000000000000000000000000000000000010f00021e14030a0001d9020001da020001d90a000a0001d901db010001da010001db01d90a00080001d9020001db01dc01da01dc01db020001d90800090002db05dc02db0900050001d9010002aa01dd02aa03dd02aa01dd02aa010001d90500040002d902aa01dd04aa01dd04aa01dd02aa02d90400050002aa01dd02aa02d901aa01dd01aa02d902aa01dd02aa0500040002aa01dd02aa02d902aa01dd02aa02d902aa01dd02aa0400030002aa01dd0faa01dd02aa0300020017aa020001d9010017aa010001d9010001d917aa01d9010002d917aa02d9010001d917aa01d9010001d9010017aa010001d9020002aa01da11aa01da02aa0200030001aa13da01aa0300030015aa0300050011aa05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008500041b15080400050e0a000200020e010501590105040e08000100020e0105080e070001000b0e07000d0e06000d0e06000e0e05000e0e05000f0e0400110e0200130e130e130e130e010e0159070e0159050e0159030e010e0159010e0159010e0159010e0159010e0159010e0159010e0159010e0159010e0159010e010e1159010e130e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b700031b15050400040f0e000200080f0c000100030f01c0060f0b000100030f015c030f01c0020f0b00020f01c0060f015c020f0a00020f015c030f01c0070f0800060f015c040f01c0015c050f0400010f01c0120f0200010f015c130f0100150f0100160f0100150f0100130f01c0010f0100020f01c0100f015c010f0200010f015c120f02000b0f012302c0015c040f01000300030f01c0015c010f01c0040f025c050f01000500050f015c090f020007000b0f0400000000000000000000000000000000000000000000000000000000000000000000000000000000014100011c14040b0002cc0b00050002cc030002cc050002cc0500060002cc030002cc030002cc0600050002cc030002cc050002cc0500060002cc080002cc0600050002cc04000209040002cc0500060002cc0200020901190109020002cc0600090001de040901de0900050002de010903de020903de010902de0500030012de0300020001de010910de010901de0200010016de0100010001de04bb01de04bb01de04bb01de04bb01de01bb010018bb18bb03bb029503bb0196019503bb0195019603bb029504bb01bb01950196029501960295019202950196029501960295019602950196029501bb010001950196029501960295099201960295019602950100020001960295019602950192029501960295019602950196029501960195020002000196029501960295019602950196029501960295019602950196019502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf00041d14020c0003420c000b000142039301420500027604000800036c012503930125026c02000176016c0176040006000276026c017605120176026c0176026c0176040005000176106c01760400020001760100036c01010f6c01760300010001760259146c01760200010001760159136c0112016c03760100017601590176166c0176015901000276166c017603000176146c037603000276156c0176030001590176146c0176010004000376106c02760200050013760300060006760112020101120676050008000c7607000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008500061d140305000924071d050003000c24081d03000200062401010724081d02000100032402010a24091d01000100032402010b24081d01001124091d1124091d1124091d1124091d1124091d01001024061d010f011d010001000f24071d010f011d010002000a2403230124061d010f011d020003000c24081d030005000924071d050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5000319160702df0e0002e00ddf05e0010002df0ee00100010003df0de00100010003df08e003df02e00100010003df0de00100010003df02e002df09e00100010003df0de00100010003df0de00100010003df0de00100010003df0de00100010003df0de00100010003df0de00100010003df0de00100010003df0de00100010003df05e004df04e00100010003df0de00100010002df0ee001000ddf05e002df0e0002e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff00031914070600010f010002e10100010f0600040001e10100020f02e1020f010001e10400040003e1010f02e1010f03e10400060006e1060004000228022602280226022804000200022802260228022602280226022802000200022802260228022602280226022802000100012802260228022602280226022802260128010001000128022602280226022802260228022601280100010001260228022602280226022802260228012601000100012602280226022802260228022602280126010001001126010010260100010010260100122601000226034201260442012603420226010001000226034201260442012603420226010002000e26020000000000000000000000000000000000000000000000000000000000000000007500061c150509160e0009980e0009980e000100030804980f000100030804980f000100030804980f000100030804980f000100030804980c0003160100030804980c1603980100030813980100030813980100040812980100060801230101012301010123080803980200150803001408140003080000000000000000000000000000000000000000000000000000000000000000000000000000000000012f00011f14030c0002230e000d0001980e0005000198030008230b00040002230400082302000223060005000198050001230151012302510123015101230200019806000300025501980500032302510323010003550500030003550500042301510323020003550400030004550300022301510423015101230100035505000200065501000923030001980600050001980700019807000198060005000198070001980700019806000d2601980700019806000c97012601980700019806000197022309970126089701980100052601970223099701260198010001970100019701000197010001980126049701000c970a2603970300020004970123109705000300029703230197012301970123019701230197012301970123049706000400029701230e97070005000f970800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5000319140708000237080008000237080007000137022801370700070001370228013707000600013704280137060006000137012802370128013706000500013702280237022801370500050001370628013705000400013708280137040004000137082801370400030001370a2801370300030001370a2801370300020001370c2801370200020001370c280137020001000137032803370828013701000100013701280137012803370528023701280137010001370828032305280137013710280137000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008300041e14030d0002010c000c0005010a0009000901090007000b01090005000c010a001b001b0006000bc80a0006000bc80a0006000bc80a0006000cc8090006000cc8090002c8040012c80200010102c8040005c8060107c8020001010ac8090105c8010001c801010924020106230201052402000101010007c80b0105c802000101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a3000318140802000ca302000100061405280314010005140128031404280314022802140128011401280314042802140214012802140128041405280114021401280814042801140228051401280314042801140a14052801140a1404280214091405280214091404280314081404280414071404280514051405280614031404280914021403280314012801230201012301280214010002280c14010002000ca302000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007900051914070500025701000257010002570500050002570183025701830257050004000257018302570183025701830157040004000157018302570183025701830257040002000e57020002000e57020001001057010001001057010001001057010012571257125712570957037d0657125701001057010000000000000000000000000000000000000000000000000000000000000000000000000000008300061d15040f0001c909000d00077a05000b00037a01c9077a030008000b7a02c9027a020005000f7a01c9027a02000200167a01000100177a0100187a0100187a0100187a01c9187a0100107a02c9057a02000100097a01230101012301010123017a02c9057a02000200057a02c90d7a03000300047a02c90b7a050006000a7a0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c100041c160509000168020001680a000600016801000668010001680700034903000568014904680700054902680349076806000449036803490368024903680500034904680349036802490468040003491068040002001268030002001268030002001268030005490d6805490149046801930b680193046801490549029309680293054901490a68044907680149054902930468014902350149026801930549030006930268044901680393040004000e93050005000c9306000700089308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d500051b1406080003b001c501b00800080003b001c501b00800080003b001c501b008000300072401b0072403000300072401480724030002240148072401480724014802240224014807240148072401480224022401480724014807240148022402240148072401480724014802240224014807240148072401480224022401480724014807240148022402240148072401480724014802240224014807240148072401480224022401480585016d0385016d05850148022402240148072401480724014802240224014807240148072401480224000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab00031e14030800018601b111000800028601b110000700038602b10f000700038603b10e000600058603b10d000600058604b10c00050002860284028601b1028602b10b000500078605b10a000400088606b109000400088607b1080003000a8607b1070003000a8608b1060002000b8609b1050002000c8606b1028601b1040001000d860ab1030001000186038401860184078607b1038601b102000986032303860bb101000f860cb1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015300021b14050a00025b0a000900015b01180141015b09000900015b01410118015b09000500035b0200025b0200035b05000400015b0300015b0100025b0100015b0300015b04000100035b0500045b0500035b0100015b0200015b03000241015b018b0154015b02410300015b0200015b015b0200015b01000441015b0254015b04410100015b0200015b015b01000141015b0541015b0154018b015b0541015b01410100015b0100015b0141015b0541045b0541015b0141015b01000100015b0141015b0641025b0641015b0141015b01000100015b0241015b0441045b0441015b0241015b01000200015b0241015b0341015b028a015b0341015b0241015b02000200015b0241015b0341015b028a015b0341015b0241015b02000100025b0141035b0241015b028a015b0241035b0141025b01000200125b02000300103503000200055b0841055b02000200125b020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004900041715090372080003720372080003720372080003720372080003720372080003720e720e720e720e720e720e720e720e050e0502050b230105030502010405020103050e050e05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af00041a140608000c1807000d18060003180b14050004180b140400021803140b460300031803140b4602000118031403460b0f01000218031403460b0f031803140346030f0854031803140346030f0854031803140346030f03540512031803140346030f03540512031803140346030f035403120200031803140346030f035403120200031803140346030f032303120200031803140346030f035403120200031803140346030f0354031202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009300061b1405020002050100020501000d72010501050b7203050172020e0101010e017201050105027201050372020c037203050172040e0172010501050172020511720105010e010c0205110c010e010e140c010e010e140c010e010e140c010e010e140c010e010e140c010e010e140c010e010e120c0205010e010e080c0505050c0205010e010e140c010e01051472010500000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f00041e14080100080e0d000400070e0b0001000c0e090002000c0e080001000e0e070001000e0e070001000f0e0600100e0600100e0600100e0600100e0600090e070d0600080e0c0d0200070e0f0d070e0f0d070e0d0d0200080e090d05000000000000000000000000000000000000000000000000000000000000000000c500091d150504000320110004000120011906200c0004000320011906200a0003000520011902200119042008000300092001190620050003000220011903200119062001190320040002000220021903200119032002190120031901200400020002200f19022003000100022011190120030001000120031904a4011904a4011904a40119022002a402200219012001a40120011901a4011901a4021901a4011901a40119012001a40320010001a4052001a4022003a4022003a4022006a4030003a4120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d900011c160409000664090007000a64070006000c64060005000e64050005000e640500040010640400040001640628026406690164040003000165072802010769015a030002000265062804010669025a020001000365052806010569035a010001000365052806010569035a01000565032808010369055a0565032808010369055a0665022808010269065a0765012808010169075a086501e2060101e2085a086508e2085a0100086506e2085a01000100086506e2085a01000200086504e2085a02000300086502e2085a0300050006650200065a05000000000000000000000000000000000000000000000000000000000000000000000000000000d100021a15060600084f06000600024f0101024f016c024f06000700034f016c024f07000500032a044f032a05000300022a021e022a024f022a021e022a03000200012a021e0a2a021e012a02000100052a011e0700052a01000100032a011e0b00032a0100032a021e0c00032a012a0101012a011e0d00032a032a011e0d00032a032a011e0d00032a032a011e0d00012a0101012a032a011e0d00012a0101012a032a011e0d00032a0100032a021e0a00032a01000100052a081e052a01000200102a020003000e2a030005000a2a0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b00061c1403020017e3020017e3020017d4020017e3020017e3010017e30100010017e30100010017e30100010017e30100010017e3010018e3010017e4020017e3020001e303e403e303e403e303e403e303e401e3020017e30200000000000000000000000000000000000000000000000000000000000000000000000000d900031c140405000e1f050005000e1f050003001205030003000105011f0205011f0205011f0205011f0205011f0205011f0105030003001205030003001205030003000105101f01050300010001050100120503000100010501001205010001050100031f1205010001050100010e021f1205031f031f1205021f010e010e021f1205031f031f1205021f010e03000105010e0259010e0259010e0259010e0259010e0259010e0105031f03000105010e020b010e020b010e020b010e020b010e020b010e0105030003000105100e010503000300120503000000000000000000000000000000000000000000000000000000000000000000000000000000e700031b14050b00030c08000a00010c031f020c06000900010c011f010c041f020c04000800020c021f010c051f020c02000300050c051f010c061f010c01000200010c121f010c0100010c051f040c0a1f010c0100010c091f010c091f010c0100010c021f010c101f010c0100010c071f020c011f070c021f010c0100010c051f020c0c1f010c010c141f010c010c041f010c0e1f020c010c041f010c081f020c011f030c02000100010c041f010c041f030c021f010c021f010c02000200010c051f030c041f010c021f010c03000300050c041f030c031f010c03000400010c0c1f010c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e300021c14040c0001940b000a000119010002940a000900021904940900070004190694070006000419089406000500051909940500040006190a940400040005190b940400030006190394011d08940300030006190394011d08940300011d020006190294021d08940200011d0100011d010007190194021d08940100011d01000100041d05190194021d0694041d01000200051d03190194021d0494051d02000300051d0219041d0294051d03000400041d0119011d0123021d0123011d0194041d04000500031d0119021d0223021d0194031d050006000c1d060006000c1d06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009900021c1508019a1300019a014f1200029a014f1100019a034f1000019a044f0f00029a044f0e00019a064f0d00019a074f0c00029a074f0b00019a094f0a00019a034f0100064f0900029a024f0200064f0800019a034f0300064f0700019a034f0400064f0600029a024f0500064f0500019a034f0600064f0400019a104f0300029a094f049a034f0200019a0a4f049a044f0100019a134f00000000000000000000000000000000000000000000000000000000000000000000000000012500031c14040c00047908000c00057907000300047905000579070003000479020002790100057907000300047902000279010005790700027901000479020002790100057907000279010004790200017902b0057902000279010002790100017901b004790500057902000279010002790300047905000579010003790100027904000379050004790200037901b001790100027902000479020001790100047902000379030002790200047902000179010004790200027904000279020004790200017901b00479020002790400037901000479030001b004790100037904000100027901b0047904b004790100037904000200017901b0077902b00379010002790500040002790323037901b0037901b0027905000500077901b0037901b00279050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf00011c14040d0001010a000c0002010100010108000b0003010100010108000a0004010100020107000900020102df01010100020107000800030102df010101000301060007000701010003010600060008010100040105000500090101000401050004000a0101000501040003000b0101000501040002000c0101000601030001000d010100060103000e0101000701020018001883010001831498018301000200018301981083019801830200030001831098018303000400108304000000000000000000000000000000000000000000000000000000000000000000b300041d14030d0001880c000c0003e10b000c0002e1011a0b000c0003e10b000500088301880783050003000783017d028301880483017d0483030002000283017d088301880183017d0883020001000883017d0a83017d04830100010018830100010018e501000100185501000100016d0655016d0855016d07550100011c186d011c031c066d081c056d041c0100041c0298051c0398051c0298011c0100011c0100030006980823069803000400129804000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e700051c16030b0004e60a00090008e6080007000ce60200023a0200010005510ee60100023a0200015105000ee605000151040002140de6011404000151040003140ce601140400010001510200025503140be6021403000200015101000255041409e603140300030001510355061405e6041403000400015102550f1403000500015104550b140151020001e60500015502510555061402550100015102000600025502510a55030001510100030002e60100045503510755040001510200013a02e60200065503510355050001510200023a050007550351050001510b00045504000551010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009700091e15020c9710a301000b9710a3020003970100069710a3020002970300059710a3020002970300059710a3020002970300059710a3020002970300059710a302000297030005970ea3010001a302000297030005970ca3010001a302000200039701000297012602970ba3010001a304000100099703a3025105a3010001a30600099702a3025105a3010001a30800080008a30c0000000000000000000000000000000000000000000000000000000000000000000000000000000000ad00031e1403060008e70d00060008e70d00060008e70d00030004e7050003e70c00030004e7020003e803e70c00030004e7020001e8010002e802e70c00010003e7070003e80d00010003e71700010003e7170003e7180003e7180003e7180003e703000de8080003e7020010e80300039f05e710e803e7019f0200010004e702e802e902e802e902e802e901e807e70200010004e704e802e902e802e904e806e7020006000ee8010003e7039f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd00031c14030a0004ec0b000b0005ec09000c0005ec08000c0005ec080001ec0b0006ec0700010001ec08000b430400010002ec05000e430300010003ec020011430200020003ec010012430100020004ec1343030003ec1343030003ec104301ec01430100030003ec104301ec01430100020003ec010011430200020002ec020011430200020001ec0300034301ec014301ec0243023c0101013c0101013c0101013c0300010001ec0400024301ec014301ec0243023c0101013c0101013c0101023c030006000643093c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cb00011c19040b00020d0b000b00020d0b000800080d080006000c0d060005000e0d05000400101f04000400081f010b011f030b031f04000400101f040005000e43050005000e430500040010430400040010430400040010430400030012430300030012430300030012430300020014430200020014430200020014430200010016430100010001430100014310000143010001430100010004430e0004430100014301000143010001430e0001430100014301000143180001000143010001431000014301000143010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f900091e1402030016c00300010003c0016a0369016a0ac0016a0369016a03c00100010001c0011b01c0016a0369016a0ac0016a0369016a01c0011b01c0010002c0011b01c0016a0369016a0ac0016a0369016a01c0011b02c002c0011b03c0017c0ec0017c03c0011b02c002c0011b03c0017c0ec0017c03c0011b02c002c0011b03c0017c0ec0017c03c0011b02c002c0011b03c0017c0ec0017c03c0011b02c002c0011b01c0016a0369016a0ac0016a0369016a01c0011b02c0010001c0011b01c0016a0369016a05c0030e02c0016a0369016a01c0011b01c00100010003c0016a0369016a0ac0016a0369016a03c00100030016c00300000000000000000000000000000000000000000000000000000000000000000000000000000091000519150704000a43040001001043010001001043010012431243010010af0100010010af0100010010af0100010010af0100010010af0100010010af0100010010af0100010007af01b101af01b106af010003000caf0300030002af01b101af016d01af01b101af01b101af01b101af0300030003af01b101af01b101af01b101af01b101af01b1030004000baf030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c900011e1403010001230100142301000123010001230800012301000123100001230200152301000123010006000123140006000123140006000223130006000423110007000b230900030014880400020001880a770188097701880300020001880a77018807770166017701880300020001880a77018807770166017701880300020001880a77018807770166017701880300020001880a7701880977018803000200163303000200168803000200163303000200063306230a3303000200163303000400123305000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009100051d14030600042406000424060004000824020008240400012402001424020001240724020108240201072401240101162401010124012404011024040101240224160102240324140103240100032412010324010001000424100104240100020004240e0104240200020006240a010624020003001424030004000a2402010624040005001024050007000c24070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b700051914080600048c07000300038c0151038c0151038c03000100018c0151058c0151068c015101000100048c0151018c0351028c0151038c0100038c0151018c0197025101970251038c0151028c0151048c025103970251058c048c025105970251038c0151038c0251039701260197012601970251038c048c0997048c048c04970126019701260297048c048c09970151038c038c015109970251028c11510100045104110751010001000f08010001000f08010000000000000000000000000000000000000000000000000000000000000000000000000000000000a100071e15050c0001040c000c0001040c0008000305010002040b000b00010502040b000b00010502040b000b000123010402260a000a0003230426080003230600032302260155052605000c23012603550104052603000b23022602550804020002230901022602550804020005010123110102000601032301010b05030001040a010a050300010401000100012301050123010501230105012301000e04020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012300041a1c060c000384050005000384030001840385018404000400038401850484028501d00284030003000184028501d001840485028404850200030004850184048501840585020003000f8502000300015503850255028501d002550385015502000200105502000200105502000100037d0c55027d02000100127d0100147d147d017d0201017d0101017d0701017d0301017d0101017d017d0401017d0701017d0301017d0101017d017d0c01017d0501017d017d010010010100017d017d0100017d0e00017d0100017d017d0100017d0e00017d0100017d017d0100017d0e00017d0100017d017d0100017d0e00017d0100017d017d0100017d0e00017d0100017d0200017d0e00017d02000200017d0e00017d02000200017d0e00017d0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000870004191408010003290200022902000429030001290222032901220929010001290222092903220229010007290222022903220229010003290222022902220229032202290100032902220a2901001029010010290100112911291129112910290100012902220d29010001290222032905230429020001000d2901220129010001000e29020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014100011c1a020d00026a0b000c00046a0a000b00036a01ed026a09000a00056a01ed026a08000900076a01ed026a070008000c6a060007000e6a05000600014f0e6a014f04000500024f0e6a024f03000400024f106a024f02000300034f106a034f01000200044f106a014f01ed024f0200044f106a024f01ed014f0200044f106a044f0200044f106a044f0300034f106a034f01000100014f0200034f0e6a034f0200014f016a014f03000245014f0123010101230101012301010123010101230101014f02450400014f016a014f020003450c4f03450300014f016a014f0100144502000100014f014501000145010002450100024506000245010002450100024501000200034501000145020001450800014502000145020001450100030001451300014f014501001700014f014501001700014f014501001700014f020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004300081c140407000d24040004001224020002001624010017240100172401001724010017240518127201000618117201000418012402181100051812240100181818180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011500021b17050a0002ad0a0006000129020001ad022901ad0900090001ad022901ad0900080001ad042901ad0300012901000129020003000129040001ad042901ad04000129030002000329020001ad062901ad0200012901000129020003000129030001ad062901ad0700050002ad082902ad0500030002ad0c2902ad0300010002ad102902ad010001ad142901ad01ad142901ad010002ad102902ad0100030002ad0c2902ad0300050001ad0a2901ad0500050001ad0a2901ad050001000129020001ad072903ad022901ad0400040001ad0c2901ad0400030001ad062902ad062901ad0300030001ad042902ad020002ad042901ad0300030001ad022902ad060002ad022901ad0300040002ad0a0002ad0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd00071b160504000e51040002000251061803380518025102000100015109180138081801510100010001510918013808180151010001510a1801380918015101510a1801380918015101510a1801380918015101510a1801380918015101510a1801380918015101510138091801380918015102510238051803380118035105180151010003510838011801510138015104180251020008510238011803510418015101000400075102380518035101000a000a5102000b0007510400000000000000000000000000000000000000000000000000000000000000000000014700031d1403090008490900070004490142024901420449070005000549014201490242014901420549050004000149014201490c420149014201490400030001490142014904420126014202260142012604420149014201490300020001490142014903420a2603420149014201490200020002490342032601280126022801260128032603420249020001000249034203260828032603420249010001000249024203260a2803260242024901000349024202260c280226024203490249024202260e28022602420249014901420149024202260d28012602420149014201490249024202260e280226024202490249024202260e28022602420249014901420149024202260c280226024201490142014902490242022606280201012605280226024202490349024202260c2802260242034901000349024202260a28022602420349010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011100051d14030a00038e0167028e0a000800038e0167018e0167048e08000600038e0167018e015701670157018e0167028e0167018e06000500018e0267018e0367011102570367038e05000500028e026708500157038e05000300018e0167018e015702110150018a0350018a025002110267028e03000300028e01670650018a0750038e03000300018e01110d50018a02500167018e03000200018e015701110150018a0e5001110157018e020001000167018e1450018e0200020001670450018a0c50018a02500267010002000111145001110200016701000350018a0d50018a0150018a025002000100016716500167010002000550018a0550018a0750018a025001000167030014500167020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d100041c170405000ee60500050001e603c8040105c801e60500040001e603c8040107c801e60400040001e602c8040108c801e60400030001e602c8040104c8034303c801e60300030001e601c8040104c8014303c8014302c801e60300010016e60100010016e60100010016e60100010016e60100010016e60100010016e60100010016e60100010002e6011f10e6011f02e60100011f0137141f0137011f091f061d091f010008e6061d08e601000200020e0500061d0500020e02000200020d1000020d02000200020d1000020d020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb00011a14050a00012b02e608000a0001e6012b02e607000a0001e6012b02e607000a00012b03e60700090005e60700080006e60700070006e60800060006e6012b07e60100030008e6012b07e6012b01e60be6012b07e6012b01e60de6012b06e6012b0de6072b01000ae6012b0ae60ae6012b08e6012b01e60ae6012b09e6012b0ce6082b010001e6022b05e6012b02e6012b08e6010008e6042b06e6012b01e60100030004e6012b03e6012b07e6012b0100040008e6072b0200000000000000000000000000000000000000000000000000000000000000000000000000df00031a1f0504000e840300030002840cd8028402000300018403d8089903d801840200040001840cd8018403000400018402d8089902d8018403000300010b0e72010b02000300010b0e72010b02000300010b0e72010b020d0300010b0e72010b020d0300010b0e72010b02000300010b0e72010b02000300010b0e72010b02000300010b0e72010b02000300010b0e72010b02000300010b0e72010b02000200120d0100021f120d0100011f0100120d0100011f1400011f1400011f1400011f1400011f1400011f1400011f1400011f1400011f1400011f1400011f140000000000000000000000000000000000000000000000000000000000000000008f00071a1605010002ee11010100010002ee1101010004ee110104ee110104ee110101ee017c010d01ee110101ee017c010d01ee110101ee017c010d01ee110101ee017c010d01ee110104ee110104ee110104ee1101010002ee027c01ee010101ee010101ee010101ee010101ee010101ee010101ee01010200010002ee017c1001010004000c010500050008010800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d300041917060a0005570400030004570100025705010257020002000157040101570301015705010157010001000157060103570701015701000157100101570157110101570157110101570157110101570157110101570157110101570157110101570100015710010157020001570e0101570100020001570e0101570100030001570201097c020101570100030001570d01015701000400015704010357040101570200040001570301015703000157030101570200050001570201015704000157020101570200060002570600025703000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c700021914011000016707000f000167011c016706000f000167021c046702000f000167061c016701000c000667021c0101011c0167010009000367081c0101011c01670100080001670d1c01670100080001670d1c0167010008000101011c0101011c0101011c0101011c0101011c0101011c0101011c0101010008000f01010008000f01010008000f01010008000f01010008000f0101000143010002430100134302000143020013430100024301000543012301460123014601230a4307001143070011430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c100031c150406000c81060003000281017c0281047e057c0381040002000281027c0b81017c03810300020003810f7c038101000200168103000b7c0181017c078101000500118102000700047c0181017c0181017c0581040006000c81060005000d81060004000b81090002000b810b00010009810e0002000a810800018103000500088106000181040001000181010001810100017c049c0281017c0681010001810300018101000481067c088104000300128103000300048108000481050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010900031b14050900050508000700020504000105080007000105020009050300020011050300020008050723010d04000300010d08230a0d020006050323030d0505010d020002000205031f0205031f0205031f02050100010d010001000305031f0205031f0205031f03050200010501000205031f0205031f0205031f020501000105010002000205031f0205031f0205031f0205030002000205031f0205031f0205031f0205030002000205031f0205031f0205031f0205030002000205031f0205031f0205031f0205030002000205031f0205031f0205031f0205030002000205011f0523021f0205031f0205030002000205031f0205031f0205031f020503000200110503000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023500041d19031500018904000300126101890161030002000289016101cc01820161018201cc01610282016101cc0182016101cc0182016101820189016103000100018901940261028201610282016101cc018201610282016102820161018201cc028902000100018901941461018902000100018901000261018201cc016102820161018201cc0161018201cc016102820161028201610189020001000189010002890282016101cc01820161028201610282016101cc0182016101cc018201610189020002890194016101891261018901940100038901610189018201cc01610282016101cc01820161018201cc016102820161018201cc0161018901000189018901000189016101890282016101cc018201610282016102820161018201cc01610282016101890100018901890100018901610189126101890100018901890100018901610189018201cc016102820161028201610282016101cc018201610282016101890100018901890100038902820161018201cc0161018201cc0161018201cc01610282016101cc018201610189010001890189010001891461018901000189018901000189026102010161020101610201016102010161020101610201016102000189018901000189026102010161020101610201016102010161020101610201016101890100018901890100018914610189010001890189010001890194110001940100028901000189020002891100018903000100018901000289150001000189010001941600020002891600000000000000000000000000000000000000000000000000000000000000000000000000000000000000b500021e15020e00014f0d000d00034f0c000e00014f0d000b00064f0b0009000a4f090007000e43070006000a430106014302060243060006000c430206024306000500124305000500124305000500124305000400144304000400144304000400144304000400144f04000200184f02000100054f026d014f026d014f026d014f026d014f026d014f026d044f0100064f026d014f026d014f026d014f026d014f026d014f026d054f0400144f040009000a4f09000000000000000000000000000000000000000000000000000000000000000000000000000000000000011700021b16050600027903260b00060004790200027903260500020001260300027903000579060002000126017902000279020003790900020001260179020002790200037909000200027902000279020002790200018003000126030002000279020003790100027905000179022602000200027903000579050004790100018002000279020005790600037901000280010002790200057907000279010003000a7904000479010004001079020004000f7902000180018005000a79040002800700087907000300018003000879070006000180017901230125012301250123027901800300018002000500038006790380050004000e8004000500018001000380020002800100018006000800018009000180030000000000000000000000000000000000000000000000000000000000000000000000000000000000df00041b16040b00021c0a000800011c0300021c0600012602000900021c0100021c040002260300050003660100051c0200032604000200031c0366071c032601660400011c0100031c0766011c0426026604000100031c012007660426036604000200011c02200766032604660400020003200766022605660400010004200766012606660400020003200e660400020003200e66040002000320125f01000220023a0e5f0120015f0120015f0100043a035f012001660123016601230166012301660120065f0200033a125f0200033a125f0300023a12000400013a120000000000000000000000000000000000000000000000000000000000000000015b00081c140418011801030101230101012301010123010101230201012301010123010101230101012305010301011f0101011f0101011f0101011f0201011f0101011f0101011f0101011f05010301011f0101011f0101011f0101011f0201011f0101011f0101011f0101011f0101012303010301011f0101011f0101011f0101011f0201011f0101011f0101011f0101011f0101012303010101011f0101011f0101011f0101011f0101011f0201011f0101011f0101011f0101011f010101230101011f01010301011f0101011f0101011f0101011f0201011f0101011f0101011f0101011f0101012303010301011f0101011f0101011f0101011f0201011f0101011f0101011f0101011f0101020202010301011f0101011f0101011f0101011f0201011f0101011f0101011f0101011f050103010102010101020101010201010102020101020101010201010102010101020501180118010000000000000000000000000000000000000000000000000000000000000000000000006d00051b140501230200012302000123020001230200012302000123020001230200012316001600012314000123160016000123140001231600160001231400012316001600012314000123160016000123020001230200012302000123020001230200012302000123020001230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f700031c15040800081f08000800011f0641011f08000700021f0642021f07000700011f014106280141011f07000600021f0341031f0241021f06000600021f0141041f0141021f0141011f06000500021f01410b1f05000500041f010c051f010c031f05000400051f010c051f010c041f04000400051f010c051f010c041f04000300051f010c071f010c041f03000300051f010c071f010c041f03000200061f010c071f010c051f02000200051f010c091f010c041f02000100021f020c0f1f010c021f01000100021f020c051f010c0c1f01000a1f010c0341010c041f020c031f061f010c021f010c091f020c031f0200141f0200000000000000000000000000000000000000000000000000000000000000000000000000000000013500031b1505090004d40900060001d401ef02d4020102d401ef01d40600040003d401ef02d4020102d401ef03d40400030001d401ef03d401ef04d401ef03d401ef01d40300020003d401ef02d401ef04d401ef02d401ef03d40200020004d40aef02d4010101d40200010004d401ef0ad401ef04d40100010003d401ef0cd401ef01d4010101d40100010003d401ef0cd401ef01d4010101d4010004d401ef0cd401ef01d4010102d404d401ef0cd401ef02d4010101d404d401ef0cd401ef02d4010101d404d401ef0cd401ef04d4010003d401ef0cd401ef04d4010003d401ef0cd401ef03d40100010001d4010102d401ef0ad401ef04d40100020001d4010102d40aef04d40200020003d401ef02d401ef04d401ef02d401ef03d40200030001d401ef03d401ef04d401ef03d401ef01d403000000000000000000000000000000000000000000000000000000000000000000000000000000000000009700031a15060237041a01830237011a0137091a061a01830d1a061a01830d1a061a01830d1a0100128301000237011a0137091a01830237041a0d1a0183061a0d1a0183061a0d1a0183061a0100128301000237041a018301370c1a061a01830d1a061a01830d1a061a01830d1a0100128301000237011a0137091a01830237041a071a0337031a0183061a0d1a0183061a0d1a0183061a00000000000000000000000000000000000000000000000000000000000000000000000000000000bb00081d1403020008a40e8c0200029701a408510ec801970197012301a408510ec801970d9701080c9701970ba40197010801970a430197019701a4057c05a4019701080c97019701a4017c03a4017c05a40197010801970a260197019701a4017c03a4017c05a4019701080c97019701a4027c01a4027c05a40197010801970a980197019701a4017c03a4017c05a40197010801970a980197019701a4057c01a4034701a4019701080c9701970ba4019701080c970d9701080c97000000000000000000000000000000000000000000000000000000000000000000000000bd00091d140419080108117e0108052401080108017e0f08017e0108052401080108017e0f08017e07080108017e0f08017e01080124010801240108012401080108017e0f08017e07080108017e0f08017e01080124010801240108012401080108017e010801a40d08017e07080108017e01a4010801a40c08017e01080124010801240108012401080108017e010801a40208010101230101012301010123010101230308017e07080108117e010801a401080124010801a401081908000000000000000000000000000000000000000000000000000000000000000000012d0003191f0402000fee0400020002ee017201ee017201ee017401ee017201ee015101ee0155017402ee0300020002ee017401ee017401ee017201ee017403ee0143017402ee03000200037210510200037206510472065102000372045102720475027204510200037203510172087501720351020003720351017208750172035102000372025101720a750172025102000372025101720a750172025102000372025101720a750172025102000372025101720a750172025102000372035101720875017203510200037203510172087501720351020003720451027204750272045102230372015102430351047206510123010003721051012301000372105101231400012314000123140001231400012314000123140001231400012314000123140001231400012314000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd00041a150802000c0a040001000826011e0126021e0226030001260e51012602000126065102780651012602000126035101780651017803510126020001260e51012602000126015101780a51017801510126020001260e5101260100010a01260e510126010a012601260e510126020a01260e510126010a012601260e5101260100010a0126045101780451017804510126020001260e510126020001260651027806510126020001260e510126020001000e26030002000c0a040000000000000000000000000000000000000000000000000000000000000000000000b300031b15050400051d0d000300051d02240c000200051d0124011802240b000200041d0224012303240a000100041d082409000100031d06240123011802240800041d02240123011807240700031d0d240600031d0e240500031d0f240400031d10240300031d112402000100021d122401000100031d1124011d0200021d1024011d01000300021d042401230118012301180624011d02000400031d0a24021d03000500041d0624021d05000800071d070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011300021c1401120004df05000e000adf03000c0002df014a0adf02000b0005df024a0243014a02df014a02df01000a0002df024a01df024a0143054a02df014a01df090002df024a01df024a01df034a01df0143024a03df090001df034a01df024a01df024a01df064a01df080002df024a01df024a01df034a01df024a0300014a01df080001df034a01df024a01df054a040001df0100070001df0d4a0600070001df0d4a0600060002df0d4a0600060001df0e4a0600050001df0f4a0600050001df0f4a0600040001df074a0143024a0143034a0143014a0600040001df044a01df024a0143034a0143034a0143014a050001df020001df044a01df044a0143034a0243054a0300010002df164a0100014a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e300011d15020d00010f0d000c00020f0d000c00020f0100010f0b000b00040f0c000400010f0600040f0700010f04000400020f0600030f0100010f0400020f04000400030f0100010f0200050f0400030f04000500040f0200060f0100040f05000500050f0200040f0100050f05000600050f0100040f0100040f0600010f06000d0f0600010f0100020f0100010f03000b0f0500020f01000100040f0200130f01000200170f02000400130f040005000f0f07000900030f015c030f015c010f09000800050f035c030f080006000f0f06000500110f05000400020f0f00020f0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e900021a1405060001270896019505000600012701960727019505000600012701960600012701950500020003270d9601950200020003270396010e0196010e0196020e049601950200020003270396020e0296010e059601950200020003270396010e0196010e0196010e0196010e039601950200020003270396010e0196010e0296020e039601950200010003270f9601950100010003270f9601950100010003270f9601950100010003270f9601950100010003270f9601950100010003270f960195010003271196019503271196019503270496092704960195032711960195032711960195000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b500061c1404030005970700059704000300059707000597040003000597070005970400030011260400030011070400030011260400030002970e8101970400030002970e8101970400020003970e8101970400010004970e810197040005971181029703000297018101d6018101d60f8102000397018101d6018101d60181042301010123010103230381010001000497018101d6018101d602230101062301010223018102000597018101d6018101d60c820300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c700021e15021100044a07001000064a06000f00084a05000e000a4a04000d00064a010e054a0300014a0400014a0600064a010e014a010e054a0200024a0200024a05000f4a01560100064a05000f4a015601000100044a07000d4a03560200034a07000c4a04560200054a05000b4a055602000156134a065603000156114a0756030003560e4a07560100040005560a4a0856010004000656084a0856020005000556014a030e034a0856030006000356074a0856040007000156064a085606000a000956090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012b00041a1606080009d6030007000cd60100060005d6080d0100050005d6010d097c040005d6010d037c0281017c0281017c0181030005d6010d017c0281017c0281017c0281017c0181020005d6010d0481017c0281017c0281017c0181010005d6010d0581017c0281017c0281017c018106d6010d0581017c0281017c0281017c018106d6010d0581017c0281017c0281017c018106d6010d0581017c0281017c0281017c018106d6010d0481017c0381017c0281017c018106d6010d0381017c0381017c0381017c018103d6010d02d6010d0281017c0381017c0381017c028102d6030d01d602980181017c0281017c0381017c038103d6010d02d60398017c0281017c0281017c0381010006d60398017c0281017c0281017c02810200060003980b00060003980b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007100051b1405166f166f136f0101026f136f0101026f136f0101026f016f129401190194016f016f1494016f016f1494016f016f1494016f016f1494016f016f1494016f026f1294026f0100016f1294016f01000100026f069404190694026f01000200036f0c94036f020004000e6f040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b700041b1404030008ec0c00020006ec014604ec0a00020001ec020002ec034604ec090002000146030002ec014606ec08000546020004ec014604ec070001000346040002ec014601ec014601ec014602ec06000100014601000146050002ec014606ec050009000aec0400080008ec014602ec0400080001ec014605ec034602ec0300080008ec014603ec0300080004ec014607ec030007000dec030006000eec0300050007ec050e02ec04000300125402000100165400000000000000000000000000000000000000000000000000000000000000000000000000000000cb00061b14060a0001010123090001000223035e0101012301010123010102230100035e040001000201035e0101012301010123010101230200035e040001000223055e0123035e0123045e040001000201065e0323055e040001000223065e0323055e040001000201075e0123065e040001000223075e0123065e040001000201075e0123065e0400010002230e5e0400010002010c5e0623010002230d5e012301010123010101230301025e0101012301010123010101230101035e062303230d5e052303010d5e0523000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000004c00000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000ea0000000000000000000000000000000000000000000000000000000000000005b000b171007030006200100062003000120020102230120010001200201022301200420020102230320020102230120042002010223032002010223012001200200012002010223012001000120020102230120030006200100062000000000000000000000000000000000000000000000000000000000000000000000000063000b171007030006230100062303000123020102640123010001230201026401230423020102640323020102640123012302000123020102640123010001230201026401230123020001230201026401230100012302010264012303000623010006230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004b000b171007030006230100062303000323016402230100032301640223102301230200012301650223015a01230100012301650223015a01230123020006230100062303000623010006230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053000b171007030006230100062303000123020103230100012302010323042302010523020103230123020001230201032301000123020103230123020001230201032301000123020103230300062301000623000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000b1710070300064301000643030001430201022301430100014302010223014304430201022303430201022301430143020001430201022301430100014302010223014301430200014302010223014301000143020102230143030006430100064300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000b1710070300060701000607030001070201022301070100010702010223010704070201022303070201022301070107020001070201022301070100010702010223010701070200010702010223010701000107020102230107030006070100060700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000b171007030006c0010006c0030001c00201022301c0010001c00201022301c004c00201022303c00201022301c001c0020001c00201022301c0010001c00201022301c001c0020001c00201022301c0010001c00201022301c0030006c0010006c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043000b171007030006230100062303000423010101230100042301010123072301010623010101230123020006230100062301230200062301000623030006230100062300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069000b1710070300060f0100068b0300010f02010223010f0100018b02010223018b034a010f02010223010f014a018b02010223018b018b0200010f02010223010f0100018b02010223018b018b0200010f02010223010f0100018b02010223018b0300060f0100068b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000b171007030006c8010006c8030001c80201022301c8010001c80201022301c804c80201022303c80201022301c801c8020001c80201022301c8010001c80201022301c801c8020001c80201022301c8010001c80201022301c8030006c8010006c800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000b1710070300063701000637030001370201022301370100013702010223013704370201022303370201022301370137020001370201022301370100013702010223013701370200013702010223013701000137020102230137030006370100063700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000b171007030006de010006de030001de0201022301de010001de0201022301de04de0201022303de0201022301de01de020001de0201022301de010001de0201022301de01de020001de0201022301de010001de0201022301de030006de010006de00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000b1710070300060901000609030001090201022301090100010902010223010904090201022303090201022301090109020001090201022301090100010902010223010901090200010902010223010901000109020102230109030006090100060900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000b1710070300061401000614030001140201022301140100011402010223011404140201022303140201022301140114020001140201022301140100011402010223011401140200011402010223011401000114020102230114030006140100061400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069000b171007030006200100069a030001200201022301200100019a02010223019a036e0120020102230120016e019a02010223019a019a020001200201022301200100019a02010223019a019a020001200201022301200100019a02010223019a030006200100069a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000b1710070300062401000624030001240201022301240100012402010223012404240201022303240201022301240124020001240201022301240100012402010223012401240200012402010223012401000124020102230124030006240100062400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000b1710070300065901000659030001590266022301590100015902660223015904590266022303590266022301590159020001590266022301590100015902660223015901590200015902660223015901000159026602230159030006590100065900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000b1710070300061c0100061c0300011c02010223011c0100011c02010223011c041c02010223031c02010223011c011c0200011c02010223011c0100011c02010223011c011c0200011c02010223011c0100011c02010223011c0300061c0100061c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000b1710070300063701000637030001370201022301370100013702010223013704370201022303370201022301370137020001370201022301370100013702010223013701370200013702010223013701000137020102230137030006370100063700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069000b1710070300062601000613030001260201022301260100011302010223011303420126020102230126014201130201022301130126020001260201022301260100011302010223011301260200012602010223012601000113020102230113030006260100061300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000b171007030006280100062803000128020102230128010001280201022301280428020102230328020102230128012802000128020102230128010001280201022301280128020001280201022301280100012802010223012803000628010006280000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/packages/nouns-contracts/test/foundry/files/descriptor_v2/accessoriesPage.abi b/packages/nouns-contracts/test/foundry/files/descriptor_v2/accessoriesPage.abi new file mode 100644 index 0000000000..c433c67d39 --- /dev/null +++ b/packages/nouns-contracts/test/foundry/files/descriptor_v2/accessoriesPage.abi @@ -0,0 +1 @@ +0x00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000004aa000000000000000000000000000000000000000000000000000000000000000890000000000000000000000000000000000000000000000000000000000000ecfbd5b5b731c3516968ed4331eda3376e28cc7b13df624b6f12dc18490c4863831b1210402e11ec26d4db2013610eeb0b04baabcb50f5bd43eefbbabf68ff87dff847fca7ee7483dd333d8adee31bbaafae69ca3237dbab45a2da97b94ca0cad6cb7fa35db7d2c90ffd84ec0bf9fed3fbe11f0ef06fc01fe9100ff4880ff442be0dfc9f6d7b3ddaabe1df0ef65fb473702fedd6c7f23dbad1adbd9feb140f96381f24f06ca3fb997ed1f6f05fc3b01ff7eb67f6223e0dfcdf64fb6b2fdcd6cb76a06f8a736b2fdd301fee99d6c7f2b90bfb59fed3f15e03f1d28e074807f6637db3fbb1df0ef65fbe7b2dd6a2ec03fb79bed7f3cc0fff84eb67fbe15f087f2ef67fb173602fe00ff42807f31c0bfb89bed5fca76aba500ffd24ec0bf9fed5fde0df803f9cfb402feed807f2fdb7f36c07f36c07f7637dbff44c0bf12f03f99ed564f6e04fc01fe7301fe7301fe737bd9fea75a01ff76c01fe03f1fe03fbf13f007f89fde08f87703fefd6cff8500ff859d803fc07fb115f007f82f06f82f6d04fc7bd9fed56cb75a0df0afee66fbd702fc6bdb01ff5eb6ff9956c0bf93ed7f3690ffd950febd6cffe500ffe5fd6cfffa46c0bf13f007f8af04f8afec66fbaf66bbd5d5ed807f2fdbbfd10af803fc1bbbd9fee7b2ddeab900ff737bd9fe6bad807f27e0dfcff66f6e04fcbbd9fead6cb7dada0ef8f7b2fdcfb702fedd6cff0bd96ef5c24ec0bf9fedbfbe91ed7f3150fe8bbb017fa0fc1b81f26f04f85fca766302508d135355ad742b52d42a411a803c220f824ffb3896d6cb103b36506aac3e5e25654e21fd295211a04577a053618eacb082fa376b9aa2d39aec697092398d1248b32e1a703af2a0c2fccbaa715cfa678651520449335197d4332863c6f455ff69e91f70cda28f67c125127cb30632cc39a31a2393555c8f39ab684e2b3ba767f5e32c8d327324f14709ebaa7ea259d5f3e8bd79d46ede78b0ce7125914674ebe35d3a339fa7b737557d742ad60b15a517906fa10c807f21f2301267d85f2b2baa4588a59ae138b1cd427ffd9e84793586f16fa505d46e8191d6b0ed5a16f5cd7f03fd3735e8fa49fb3e62761256127692b892ebd74507abacebf345ce4bc8db5f3887f22732cab7aab444288bfc6fd172647ce46a1fb70525483badf8f25cb95702fd87fa8baea58f749bdf74c52563b378b8c4f34b15a379198c020d1df728a4f620d846749786d3e60d2b6a7464b2a6cfe06e07f419ed415e1ad109ba05e84cd1fa9f57a37c7de44e35edde4824c7195596bb957bb82cbd5b24fc5bd51bd3153a8b39cbc3a674c113096c4a075664b65b2181edb218b09f8426b05d16704e529f2381edb218b09f82e651b4cfd2e1acb46ff2fce4d3745cab2a101fa70bd080f8025d8406c417e9127e2f15e75f4ef8e768155c29c4abb4060d88d7e819fc3ed34ffdff2efc43cfeacbfa400c5fd6561f086351bac7a0d5ebe8d3756d7b61103fb8aeafc07b45aff7c2203ebed24fbd93b0e8fae7ead4066a02c41b8412ab29c4ebf41c7e432bf54382bfbed72637f98eae02f1320d4303e261da8206c45b3482df91e2fcf3c2bff4fc70054c3d882bf40234200ead6303f55fba5e7b9c36c1b34975fcd6e945f002f18b74039a477ca338ff8c1a1b69d630574ce10a4f1901bd8419e925e882a3ad2f5e51638dc90acf48a68de47961daeb88c4475d6b10d4043e4ae52d1efcfc35474d7ad9fdda948edf8ed6b42fa7d351137569c7d82e0bbf588be91467da6256d829deb4d5cb4ca1772c99e13b691fd631652d88bc3465e3653905b6b1ee69a7413dcae4edc8eb9db454eef05af812debeea77530b222fcd4de3653905b651bf761ad4ef26793bf27a272dddecf05af812de22e11f49fd5e41deebe0ac1bcc04ce420d45c71a6404295e853e8238dc814e27a47716ea2cba751cd7133ec4b7d9d09657c9db58ad8c38cbf1ea3e661e175e91faf35e0265cd96bc3ce62556995e76e2b2d21ca17c427e2a7979cc4b707bd989cb4a53bc7c7f7fdfa22d7acdfdda948edf8eb6655f4ba7e3b95fb7636c9785df5bb0539c698b5961a778d3562f3385ce5832c37dd7bfc3187740d423c94b331cf5488cad612bbaed91bfcdd347b7f7d66f1c3c40d423c94b331ef548d46fdc8a6e7be46ff31ca57eff72e3c3efbfc98f733a10b6cb36edbd3acd4629fde8798adc67befe2f2397874de9ddb087c4f7e631fcf4f17a94d2f3e629723ddafd7f2a814de9ddb05db691f324a74729fde8798a9c49cdf1fa08fb435e7111c9c9d3eb78da909bf134a194d78f72425105bf9c9f813bee63a0afab467d0af9690a7bbd29ebd771a82b603cc8c769f8cd54e4ed01c8307f8cebd7a8d4c66bf3b5cde2b5e3fde9d889c92a7ae90db4f10d3dabdfd06b006cdc1d4eb20f7146d2b05d24dc96f1555b20555ac05c0119039505b4da83cf9d8cf8b51a90f32612988501d8d8152f589f96246d8c34f142def23f4ecabf86f2afa19c4d94bf89f237c981399711bfeccb5f863dccb1988717cac31227fb10d4630be90158520fd993e4aec9c1615935307ed1da37d1f237510aa47d936d2d36cb92f8fa9b652fb4cf6fa8e70cc7faf3212b276d03729693ff5ca8c3cfe7d7bc63e3e79481b47866697996b9679c96671a89ad0545762c0dbeff6a7a11d77f111c8b9ad7738bf9c7607bfff4166af2166af6967e1b50d1dbe011fb284f2f3e3f1aab4fe2fad9b7c1054e02b400ad079c8eb2e1b76f172f6b06f34793cfbf095788ca320f0d10cf4765d8033cdf1da9fe733cfe6a18173183bcc4787907fbbe773016ded1f303eff4cf8feb373a5e2de3a96a66712f01464ed9f3e69f76f96fa3276feb364a80113d947f59ce0f07909604e465590df89997a6c8cb7edaf7ab1a6d4c55f4bba8cb81183e249e5103ccef94a7df5180fee5f70b8aee38d480e80e66ea3b7826dc09cf04d36af4f8c4108f424a41bf27ef7dde0b8ff7218ceff161f79e289a7facf00db2e2df9fd120eeb141f00ca27706719f0ce2790be96c8ec72c3758bc97f87c58e68f0fc0f3813ee324fae703cdf28cf980ce10247c125734b8fec7dcf021da9f82fd106dfa30fcdea3ae1ac7276b831f21f54718c77f6014a9c57ffcfa4f0ff7e0c303d09be6a07479d2a05dc5cb8a02fefeee8076fbb7ff9f88fe0779fa6bff79353a3ac5ef57b0efe259ba2c33b4a1d22cdfd31ad210cfd8ce67d95788ffa43c7fadccfa24ef544938ca399f00f3c83f59d3fc064510a983f53e9a2ee1923cff4a1f8323070c4022f3f2f7ffe6d2855b323e5b77cb778edda57b28fdaeb94377f59de82e6a0469eed21d2b1e03ab22b198c7ef5af620b62a31656fc5778b967f21f07eb1d45e435a7987caefff8a8cc46398ff4ff27a7b95776b46457f2c56bf793fbef4969c007959eab1fb3f233fab1a8dc94aaccc4859d9937cbe68eb2cf93c5134e534acc6aef73308cf62fdc8f71fdd472fde472fde87fe09dda7f7c1fa897d9fa13946714cf130ad4e36262a5abe68486348be76888377a18cbfd89e30aa92427402e3ed53c84f336492ae4b16adff9aaad7a7074d1363cb033ae68f9207f4037d26e7fc32a1c68e4fd4f467e893cfd0cf9004e9ec3cf9d7a57e35f46534abfdecc6fdabff64fc3724e52eb027b1f28cca26ea87f94f11e677b3cdd2f07cefbfe20907fe7e86f797fa16f20a504380bcad6f457c360af4774a7212f343e337dfa7e4fbf684c3b3b23ed772ef27ab4827798f831103f09ea713df499b272cab51ec9f2239b5d4e35a4e31ed38db5a6c1ac70c365e855eeaabfdcb72be03aee161bfdb05e77005c0fdecd725163af5b93e79df9d5f3ca86dd5166b4d69fd2cfa4660bb2c06f74d62d92e0b7880fbfd01b9b7a9d841c78b79ca6fa0fc6665696e49be6eaa7ac4a1ffb574e59fa82cbd5f53f439f27d5e932f37e2e5bcf9ddfb79b45e315ced0f9379390fe0bf087e80e45b82c3e411f8bf003f405f80e7507904fe71f0033caae343653ffca7707f8e574deac96ffc1b62edbf67e987b513d6f17c1dafd0a7544b60533a0365b42ddb65512dcc7fcfadef1751e345b46011b5072c74bb58511160c5a7c5c7d27a491297b639df808f7bac0dca751f1d16d6e4fc4fcb4c8c32de953755298995ccbb6eb64e24fb58e60b23b27e36329b56783d0f14a9df39553f3e5dc35c721333480ee89bc5daff4fcccfd3315a76192d7c882bf11012bab9cc3a7afe32037ee8f4a5f311a763bd89df249fb31f3a5bf4240ee971e5bf441aac1004d04d3349e3f252b3bf7340df3f5fa17fbea21c28da3fb11a3d363564af911abcd64ffd56e4fc106dfc1acfa0aff1acfb1a6d863480165d77f98a86abcc8f1d58f91bf07c83550d641afa1b1274c7631df48dcb93a3fe2726abe65bdc73dfe2ca7d0bb64324a731df16adff0577fefe1d6a05e8ef48253a7d57f671e04df91945f8c7ea1383d45e776b01a510b5cf443bc81fd6b07f6fc6cc3c009601c96d647579901cf0253c96fb04d6f50ff27c8f32be478dbfd7228dd8656f93c84437dfe7afff843a599fa8721f58df1fc67f899def2d2cf2637d423f605dd283f8873cf997797eaceadbc69f2d93873b67261f67e0a7e059f34161c5f5df553c77aea25d57b5405fc55c0cdb88aedb9242ffd7f94d98e7fd7355a756c8ba67b5ecd04fdd39f0f7ab9355cc15bcc3ad83b54e5e26e078c20ed8f938ae485891efefcd8fc89d03f463d1faf3f98e9c0f63f5ab1fa07e0f582f7b1b3d2f28f7f8f3b7a1cd2f5790fc552c7bdb5d59d3b6137f7efeb5847f0cf9c7907f8c75f0fd39e97fd60c5f053e45f13b8efcbb8d4b7cbecdfc0f3bcf5f7a58f6369805e51e7ffefa9fc2fd3501fe92fc5f856152127caddc54078639377f633d47b2bed3cae925958eeb3f9c77fc7c4ffde47e75726ffd84a7e8aa76dfb9afba15b15ee56f228bf0dfc0f86ff27b8a66e4661d5997746620ac5352efbdd21e99a7da76bfe78cfc7c1a1f74a764bef4ad0e6495949ca2353bfefc6153d6df78dedcc31efb1e7a874f21ef596f57c4b640e9dee1698e12787ee4f1676e5b79fbc73de56678f0cbaccebdd7dfde9fc39afc7f45ff4c7fd13f4780feabfed97ac936c7a3049b0025dbc744cf17fee6bedffac57fc90849bfd4944ed946665ddc4dbf182f658e6ea718824e9ddc75934a4d3e75c2efb8d3b98ff67659a947aefe8fc0e5418f5046ca368f508b47a60d824d6ddf90d89dbc2695967a7c351fd7e10e87aa9cff956a589bd74a05d7e61c66a47dcf68ac390e417ca42ef4fc5861570f41dcf7bb8f14ff10b80e413cf43bf097c07508e2ec9befbf0000000000000000000000000000000000 \ No newline at end of file diff --git a/packages/nouns-contracts/test/foundry/files/descriptor_v2/bodiesPage.abi b/packages/nouns-contracts/test/foundry/files/descriptor_v2/bodiesPage.abi new file mode 100644 index 0000000000..8bbe6c5eb8 --- /dev/null +++ b/packages/nouns-contracts/test/foundry/files/descriptor_v2/bodiesPage.abi @@ -0,0 +1 @@ +0x00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000f40000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000143add7c9ad83501044d167196c4319cf781e909cc55f118a43211442211442f9954075b368a45a5de9ec5e4ba4647e8d9dd3dbcef3c1ee99e3679dd347bbe7add37bbb2fec9c163fa70f765f364eef9c3eda7dd53abdb77b61e754fc9c3ed8bd6c9cde397db43b5aa7f7765fdb39ad7f4e1fec5e354eef9c3eda7dd33abdb77bfaa6faf229fe66b3548961e61053fc392d31cc03fc8c9618b2003fa725863cc05fd0128377a3a6f84b5a625806f82b5a625805f8052d3178376c8a5fd2124319e0f31155624080bfa62506efc64df12b5a62a802fc0d2d316c02fc2d2d316c03fc1d2d31ec02fc3d2d31ec03fc032d311c02fc232d311c03fc132d319c02fc9a9618ea00ff4c4b0ce700ff424b0c9700ff4a4b0cd700ff464b0cb700ff4e4b0cf700ff414b0c8f00ff494b0ccf00ff454b0caf00ff4d4b0cce2fe824ff434b0c1f13f8070000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/packages/nouns-contracts/test/foundry/files/descriptor_v2/glassesPage.abi b/packages/nouns-contracts/test/foundry/files/descriptor_v2/glassesPage.abi new file mode 100644 index 0000000000..e05313fd6f --- /dev/null +++ b/packages/nouns-contracts/test/foundry/files/descriptor_v2/glassesPage.abi @@ -0,0 +1 @@ +0x00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000da000000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000282a555318e1a4110dcee6158d65c8064902324232d3af103124b0e70e8d00996830b6c7fc30fe00724e62784bc02f9292e6aaed199196fb3f64a5bdb5ddd5d35b33b88aaeabcde7697ab5977597f76d783a31f9cf981333f70e6a3331f9df9a1333ffcd15daf9df9daf11f39f32367be71e61b67fed57ba77eecae8f9df9b133ffe0cc3ffceaae579faaf19b491daae14270874a16aada0ab2144562c8625d68d62b0bd3714c5f5c5fccbfc55c0bff164a5f05598a223110e19ad54b9cb4a6e7fb7fb8f10fad4053f87c4d6df986fc73524ff1c5d3faeff5f9dbf5b1b0fff0bc931af765ff83e73d1a7f9b87ff58c7f5fd6f30bf81ff865f12598a22311075a359bdc4c9c6f47af8d7e8c7536a2a204b512406a2d69ad54b9c5cf57af81fd17f84ff910ac852148981a847cdea254e8ea6e7fbbfbbf9fe8356f472d62ecf116ef06ae7adfe8773f764fa13f4efb0bf0957884c769768b033469903b39e12273bd3f4d7d0755ddfff095a27acef447564298ac440d49366f5122727d3ebe1bf46ff1afe6b2a204b512406a2ae35ab9738599b5e0fff33facff03f5301598a223110f5ac59bdc4c9d9f47af837e86fe0df5001598a223110b5d1ac5ee2a431bd1efe33f4cfe03fa302b214456220ea4cb37a899399e9f9fe4f2ffffff67ffcffedf9fbd81ba3cc81594f8993bd69fa6bb8ebfd2ca1b5c4fa96544796a2480c445d6a562f71b234bd1efe5bf46fe1bfd5ef504096a2480c44dd6a562f71b235bd1efe73f4cfe13fe70e90a528120351e79ad54b9ccc4daf87ff01fd07f81fa8802c459118887ad0ac5ee2e4607abefff57c3ea27f0aff472a209329cfe7d418650ecc7a4a9c4c4dd35fc35def6705ad15d6b7a23ab214456220ea4ab37a899395e9c1e037000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/packages/nouns-contracts/test/foundry/files/descriptor_v2/headsPage.abi b/packages/nouns-contracts/test/foundry/files/descriptor_v2/headsPage.abi new file mode 100644 index 0000000000..1a1f8e8a4f --- /dev/null +++ b/packages/nouns-contracts/test/foundry/files/descriptor_v2/headsPage.abi @@ -0,0 +1 @@ +0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000ebc000000000000000000000000000000000000000000000000000000000000000ea0000000000000000000000000000000000000000000000000000000000004f34ccbd7b941d57792fb8bf6fef5d8ff3a8537dfa74b7bae56eb5ecd31c4bd6305921c2321ecf18a98389456e44e7ba25c00e1d1bb06c8d64328a51b022a9f59625844158760be3a05ccbe1c6c4185db8219800820c413c6e12c0134c48904872657287ccacfc715756d6acbbd6fcbeafea749f6eb5cee96e933b73d6fad5f7dc8faadab5f7b74f55ed32a6ed6fb8bdd9fc97f6e6c1dbdbdb873a64bfe26c7bfbf0707bfbca0ef95f7fb9bdfd860bededf50ee9473aa47f4d077ba343fe374eb4b7af3adbdebeba43fa9bda9bcd4d97dbdbd75c686f7fed647bfbff38d1defe73edcde6e72eb7b7ff7c87f43f3fd9defebadb3bd83b94bf76b883bd43f9afef50feeb3b94bfaebdd9dc32dcdefe8689f6f65b3be47feb647bfbff747b7bfb6d1df2bfed427bfbffdca1fcffe56c7bfb1b3b94bffef6f6f60d13ededa31dd2ffe27007fb85f6f6374db6b7dfd1de6cee38dbdefee6cbededbf74a1bdfdcec9f6f68dedcde62d9dec1dcaffe50ef67f737b7bfbaf0c77b077c8ffadedcd66ac43f96397dbdb7f75b2bdfddf0e77b05f686fbfeb6c7bfbf8ededed9b3b94bfa583fd6d1dec6f6f6f366f9f686fbffbf60ef6cbededbfd6a1fc5f3bdbdefecee10ef60beded131df2fff50ef67b27dbdbefbbbdbdfdddc3ededefb9dcde7effd9f6f6ad13eded0f7428ffc1f666f36087f2b75d686fff5f3bd8b7dfdedebe63a2bdfda1f666f3d0d9f6f6f776c8ff3786dbdbffb70ef69d9dec17dadb7fb383fd7d1decbb26dbdb7f6bb8bdfdfdedcde6fd1df27fe4f6f6f6dd1dcaffed0ee9f74cb4b7efed907edf647bfb6407fbfeb3eded0726dadb0f0e77b077c8ff5087fc0fb7379b2317dadb8f76c8ff5887fc8f4db6b73f3adcc17ea1bdfd7807fb890ef60f4cb6b79fec60ff6087fc1feb90fe43b7b7b77fb8bdd97cf8727bfba9b3eded1fb9d0defe7887f4a787dbdb9f686f364f5c6e6f9fea90ff5487f46726dbdb3fdade6c3e7ab6bdfda90beded1feb607f7ab2bdfd77da9bcdef7448fff1b3eded6787dbdb7ff7f60ef6cbededffee427bfbb9f66673ae43fecf4eb6b7ffdeededed9f98686ffff7edcde6f73be4ffdc7007fb85f6f64f4eb6b7ff417bb3f983b3ededcf77c8ff5313eded2f0cb7b77fba43fe9fbedcde7efe427bfb7f98e860ef90ff673ae4ffd9b3ededff71b2bdfd0fdb9bcd1f5e6e6fff5c07fb1f75b07ffe6c7bfb8b1dd27fa143fa3f9e686fff6207fb97863bd82fb7b77ff9427bfb85c9f6f6af9c6d6fffeaededed7f32dcc17ea1bdfd7fef50fed726dadbff74b2bdfdebc3eded173be47ff1427bfb372eb7b77fb343fa6f0fb7b7ffa7dbdbdbffac43fa3fbbdcdefee71dec7f71b6bdfd3b93ededdf9d686fffdeededed2f7548ff9767dbdbbfdf21fdcb93eded3fe860ff617bb3f9e1d9f6f6bfee60ff9bcbeded3f9a6c6fbf34d1de7ef9f6f6f61f9f6d6fffdb0ee5ff5d87fcff7ea2bdfd3f77487fa583fd95e1f6f69fb4379b7f98e860bfdcdefe5fce7628e0b0e1a15ae00dad63a0db3028afeb3216d4aeab1807ea4033b92bb777e7fe15535e57bc0602e3f7ca96f6d2be0cc575710b5fde5b58e7ebb1721d2a79ed1fed326ea0e6dd3d64dc9b33d024d09301fa3a740ae8ebd0297e567a323d757a1b6580dedd01e4f45f596fba513ab477cdc085c0788685e829b4772d2ec58c7ea127e81ee3fb6b81356e7f62e2fdb149f607a6b2df9a74bf03cd40fb9303576fd1de744bfbe900edaf1c20e5ecfef2c1607f191a365dfb3b97ff8cb1d7d56c60925b8b406cf8d60408e7506f38040770680d85d4e05b5d18341c34d4a010b5906d23081dc0b926824724dcadbd216a77aba0672e17aab549cd32200cedae447936a27b153ffabca1c17e5f3074a8cfd8b40714f54951f2a1aae1d40abfbbcb50249453d0dd94a6b0a87448b6b8420f4500d2ecd6941189fd10f45108e06c449a27aca213d80c8744273e3ed7b1a616ada40076db54316de5ac6ccdcf3691a59292d2bc0e2dd6ac4e9cdbed2c9bee112cf1ecfcd4125da51348edafd652eaa7eb6653aef22cbd33f379cfd5067a1ce66ac2e95a688da23e1cb55e630ff52cf004ff47e3066bd6195f778fd806fa61500f8a6bf09150e447e2065af02368936b4270042f5a631bbc86450fde2b8f7a340213291f18dbf039ef8d6f3853021c7cb9c1260102e5093cc18fd654354f3235a5d6141a764d8cb4f0db9221447abb05656d71c86be1bf7fc0f5d9e38a86876b26184e8d1d763bed70093297093c81f270a4726613d999de615c3b3b2dfc79a7cb01bba16142ba195d26bbabfcfeb5651aaea26c8b7a92ecdb4e1e5ef4b5adbfcf637ceb0b22e34a89894ab8ce478a25f45a251a29005442c9f3f2e871739e4bacfa92ea49f5c27b2001dc1c2a3e33fead69edacb25c894702804b6843a560c4a25e25d430424d5d295ae0fe7dcfd881de20347e032d2f19872d2b70c637f072d1ba0dde643487a19cb339688335d1744ad1b1fa841bbcf89912f8ee1ce186daf2d2344fa6081ac03f565f2b35b89f2ad3c8f3742698559e37d3b5919a6a3d794349eb192eeafcfe8bb1433546ff7518bdc3e16a4e117f1dc6557ab8041ebdd2613a42900994218b8f57dea9cd1f0ed56681424ec5dfe7b23fecd55e53bd6be1adf2bdcaf30278527e99969dd1087087b94ef72142b80f14728c7c59eb61ebc4a4604d831684baa45a9f851d1fc40fcb7a227f3430c151c49ea00cfabb473962419d8e21ff63a0990c842dfcb581be2d5ac0c84b15c3fd121ff3315c09c78aa6782c349563885b8e59d3051dcadf503a463b1832da1d247eb3870cbdb18f42f36652d09bc576b59edf8c16b603e7f85132fffdb457d70067ec2a9d3765ddfa47c323fca837c9a3bca8b62dbf1386076a017aa621d4657fd9d0100df010ef47afbc1fbd3c246820894d257015f5120fcc378e944d7adc9a78808ed334ec718c45c7ed400afe0dc779e046a002994ce138af0ce0efd42fccfd5177e896f2bbdfd07535199f1abd403746c38a8caa1c36ca4ae3465169b151c06829884dda88aec609418011d4492cc9558cb2a5865db712a36a6f63e931e0b386076b5c366eb2cf04933563276933296a8685be43a1127f00fc0768b2cbf849fa406e9b4c4d71b2a2284f964d3249278bc80d4772d29ec4b833c9e0fc49af5c71323c891164d29a12e04fda49c40e00414bf02e22b768923fc8a07cb2309998e06434192c79ef5af66f2df66f2df66f2dad2105f648e8cd0a95f831f08fd15aecdf5a7a2cb7adc5feadad28ca6bb17f6be966ecdf5aecdf5a7b33f66f2df66fadbfd92b575c1bde8cfd5b8bfd03fccd762df60f404e00f60fb9456bb98f41f9e6c25aecdfcdd1da57b17ff418e2f73e8bb8ed43cb8034a7e8eb27042ee33fe4735978c4001368df004d20dd045af84a6856da018c1613ac1a5ee92678254f1445ca7d78c27d9827e03b401385a61e29f9c3aece1fa6dc225aaff9a8ef047d38a813ac0cabcd6a3300cb87236841073002a1764d4d96a378f2875c9e7fab45ea6fe7d117a6f7a3b53c9a08b52636af234ff080d40ff18f70f91eb19628fac2f4be6b4e9a03fa98018fa3837c06383f82a1ee3d7a8b09f4471fc2d83b11e7c77df17dc427343e0b4d308ad17f343885bc47e9146df6a7ec5df6148e0c747497fd2de0148e0824becb41e2533846a3216c4e6d2ce93647a7dc5dee1422c6d1ea293bdaa510be09ece5a83d15fc56a4feee147f243e25e5495e09f277a3a553182147451b697d68b488ba2d2e2669fded31eebade103d72827c129c8b8431337409ed8c139965e2fc27bcb390589d79c20abdd3d964aaba9c3e5e455a5a5f053f1b0e76440409c6f7c4efb449644a49c1149232e47801f5fb24468d1e5b32615ac5dccb0ebab4623c28669f839c22a24c09b429174d0a5d8299a9058d309b64b533d2e3b8edc1cc067e418af16a4f00ce0198bf0d7a68684f08a9acb60873d22252c77b308f4aa33d25e4e790daede931c19e9a89f624a67a3a36fe74b912832b9ae4f4d2cec13f19b77c05c64f7e5b4f8eb2899ee0b7854fa0464fc490850a300ebd0dc7f8095cb94f76bf979fa4f7d220f004bd37ae641471fb7b339b7dafad70a67b82c15be8f8bdbee201d6b4619e466826db16bed5d69a6ebe7cbbdf5b355ca921945a08163b12feaa09aeab856482299ccba90228cb3f025374a66042e1958ba628e78a534dc4a63c1599642a34b52932af9db28d1b40bb0f2dae0607a57ccccfed54e5a332ff774a7125a2c4ca4739b2d31c8363e5c878e52cfc6c0b0df32d7f94aea2fea30512fb5c8ad48b3c62b37f0f18b7ace69d298f3b531877b7f0389b5f1e47cc341e84c50e341ec7959dd3cab83776bcd8902d35bc46fdb6d1d425e34b8c70a8683ce2c7c044db6263b7a11fdfe656da6d18a1c0db6db4d2a90ef500cf00b580a7756ce6ea047e1bda0da89de59b510704396d4d6373bd6ff143fe57f9c42dbccfd384ca739e864c35af97cdd38badb92f593dc4576c3882db96769e6f45ffd18bf39b7060aa6c4d8d1920f35120e3d10bc35661f49fdc6d58812b9117d65f7d04b3df3e1f99e0c1c4d807f929ff60c130a87b90d93d88b6fb2041e7c07be503f0904d017656a0ed8022add8b9eb413287801ae41a6c05a409e15fd4b438ef2a13f2a7a708f9d383167a0b1ea3c65388c79e5ae83f0fd9ef011366edab88bea348aff1c5d038a5f41a5b449d41cb451c3f502ae258153943f6cfd854d0e029c4f30acc03a65c23015f0270dd9b2a7aa514a9d3e2e2674ed9efc73a7f92fb33e8e3d7a16dac43acb28e5667f75f84524ea38c36727d23d7633e423ae7405af0f6368c7db721fab90dfe9b19926c49b781495722ea5d1970b812bdd5ca88839cfa9584b6822b7a650ce0aca18df0ca6416a59515d06a0e9214f0f4e2bd52aca43a52d9ab0ead9d7b3abd41d7e1f78fe81f7a0394693390758f92b5401812e4a085175b795ad7445b7d7f39a734c7969595de033e224bf7d0c76c0e52b0d0dc6655e6796d4d9dfd18cd63d7fca59ca7b332177d78a847ef8f21a2fc1dbe1a4cbf63e76059fe7fcdfcf01f4f993f8e33fb71e6f259e83ede04d28a7c15d002725fffff990f6614aa6bda7a177131bedfc4d7c9f8e8f6616cdf17c81d37d385488febb48ff6d048650fae27f05d7b789f551befe33a5f4debb369024a394ff5e21ece6493f9e05aad2fac7ebf28e737407cbe3b35f610ed46acb5bb62dcee920976a3966f6013eff6c6bf013deaa14d276bffee7f0811638db56279583bb4e87635fd3b2ac707fd53348eb9d478e468bc88315f28a25fa5a109c70347cf10788904f8198718a3364e5b48b7723f916f8cc7f946b9afc8cfd038dd88ed8d34ce72af51791e77cfa0ff503e7c26b71b7e06fdf38d88816ff44baeff69e95f1191b9b7612efd36be8f401de2e802f2a77be96d741fa2ea7be9c66814a5deeb94c72cee2e5219f1ef7dc08cfdbd99dddee532f9c6a6ed83f7f24d7c2f1fa35970f3eabaef5dccf10f97cbf55d43e4cc952abb0a5a7c2565ab34e3b9e2cfa1ef3e875116d49fe38a3b67956750378f3cd7bf266808a812940bc3c5320f2376d27b1b71391976e5a51effa7300faf0552f732806819f325078aba07ae826b0e9454b601ea253eb9ec821068dae2693d05e53c4d570523efbc60e36ff3016f7781c3081805f4641888ce06eec94c97060beb24fec5d8e5cb24fe3997183e176ce573887fce1540119b9c4bb6d2398cdde7e8860a388cc2e7f806d1a19ee7fc0dc5ad3c0a0df8e006daea22bb15ade61cdadd39c4b8376016718ea27014b9aea428001fe43c230dcf273f05b991fb820f1b591efc907f2acfb781322294f5103f9595cc8de256ff5056a3f256fb50564bd4f6a1ace652db30dfa342be8788b2ce2d30caa2b5c60ff522c67487d15e72c8bd0df7381d0e72d8c703b117831c36bb9f51ccc0d7e031fb394c8f07d3c01c0a79a1bdceda3af19a2e3938fc700b8fab3ecb714e1ad9222fb13c1eccd4eb7197ddffe850af565e4a68ad233daeba967d17f0aca3131c5ec4304f88d7067b9d35f65d3d86de85b3f8ae5a4eab267a17ea92b402fdf4bb28c1d5360b4e3c138665062cffda24c1bb9284c0474ab33c82775540a3dc42d35e926f34cb66df85fe27514ca797dc732d7c9dd687e700e3d5bbf8aa5a222e7f17cdd91fc1ab9bfffe37c3d7f5cafffb43bdf24f927143dd2618c25870d80ed1613794d148eeeb83732a59b9ff9ff20d0c1de55e42bd3e9de0ea043dc397a10bf44908ba01f182fa07ea87b486b1b5b9c6a5b62eff413525f19f91c51f5750ca87a32186d5cb9dc121b993561bb2a67708ed07a505752735c15ed8c3c90d566bea6f90b2038052f0524bd38bbcec0d98adddb0901eee598d2f52e37e33326ed0cda50fbadf04bfaa0d37f0b3e2681071dc35ec4b3fff9fd1f1c7eb9312dce0d565e3f3ad5dad7776568b96d6102412698d6c698d5d5d6895e11d6b1af18ec085ba8d5607d8c6ba2dacf6ba75d89656db7c2ba96da3bc9a4c962f379c9666ebbe45c7c837d4527ca3b27a31fbb7dbf8eb6ace9b805353e492c1fced5c84fe38c0385fc23c4dc6fd94c98c304621007133fcd0f76b2c809632ade77398b9abec01561a99644fc124e7321097c689c12b1616933d6d68798fc7bc344df489a1302d9b625ad46798c25c67d3347ff2a79ad32eb9ce80b2b1fdf0ec17dead0f4cdc1fafb7d816d7b3f2e865d613b8f2fab9106db0def6b37afaf5d48f6847d3c6c8c72347bf7e21cfb1bcd1d8653579fe691ce3da7801b16e84581823e6b170dc1ec3713ee6c6dd3194718c40c91c3be66aa56341ad007d496d8b399b57ffb6c9fff33e30d160d914068ba00968d984833c4283255ca3e148c9d0606104f61c45688a4a6343236c4a23a8ef8835e5118c96801ff1f578c49b2ee82bf0298d24261c59d25d2ef2f2ffa8ef7e1667e859fa3dfb2c7f829e8dfebdf0049d871c3c4bbf1f3c8bb3faac7d8ed45ef824ab4ccfd127e939563bfd7ef82cfd81a4122ffa7d0758c003fc7bbe45124aeadbaa6505ff1e3f9b8a4e73caac956759cafa7db1d0b445906ade597efcc9b9e0a66fee3f9f07ff5e8f7a2dfdfc7e0ee3533fc26baaf71a0ab95e33165bccf24244ebe052b4340f8a598bd21264442fe0ed8658792ffa0d912980d206aa07a6a49ece244ab1f761456c98bd5a702e24e34191bb0944c6b62c4f3a6c406b0eed31ee0920e93331612c4f456cc0390ec3636f01d7033deab961e113eca3b882e5ff7b3a82887d8a8ed8a958793e425316c03e54e223618b1ddc5438cb4740471c3c4bd8b67a0a780afb75b212bcfd24c6c6e3c90062fb1c76a0749c945ffafdf73b70fdc9f3019ebbd0b726dac796d1ff5538345de803e5ffd51e059b5ea00ffdebcf017d0a86deebff654bfdfd0daef0de509eaf40df3c5840b42d11619c53c4c8831e637e308878049ec1901bcc2cd842c219953b6343727f0c36956888550ae125f7be10390c154ce663918f9491eb913fe213b947866d80a84024f11109790f49e91e9c47b934e4efc156eeb821b740f395fb75521b445443728f2df32d48adb1470bf907faa4cc7f6dd1b8eea28977b9ee7817e2cf5d74b7eba6bb23e5838c4276cf43d78db6d63de32152968eee263397e379e8ccbf61d155f6c59fbfaf60ace995fb459fc2bce05318793e456be9f5b4d67fca1a066f45aed3da0076915d2e479f129ff67cb2485afc94adcfd684283598ae816da95d90d77831cf7acef7fb65bdfe238c3fe8c9462ac661acc9503601c6a9e00501c6b5170a261a11c418c3d09bbd20084de905f46718bbdc48e9976a238b2fff792dbfdba65d6ca9abf2886cc347e8d3a172fe11df4590a80b504df088fd343fa27257a6c1567c323f8067f9573a6c7b2c9d4fad3d0fe93c29ec7f00462cf8a68e735df712a63a0fe5cf5706674aa67006f1da196fc23374243ae34c1994cf58533dc300999d67f888054d40193aab948e14e0c3cafb231ee902e862e4e34033e05c20ffe0cca2ef7193442d721f2ab6e5f3d6b2f1d61ed77d7eb4093e4fc7496d9c1d8b6bdab3b4653966759a372f376da399e37d4d9f36e9eb73caaa5fb36e8f529bfc32bbd43ddbff459f5eead1f9abc4debd129bbf85f53e8dc8fafffe5b428c4788d7dfe200abb600c8e44c1faa5f41d3869a47a0be82cc97739da42176eadff40b214b3e65b11bf1a840d395a592d418ddd45b799b7b32463d9ae6034dc739b292b39aa0c62841d2fa5cce7cb29a2052400e2513a9946a8ee2b190e7469abf3d26d0f753681233ae495ff7d31ce63e39276f149540fb27b95e9e84be5e9cf4f224fea400d7d31cca93893c9d85746e8223ab903b06896eed441c712e77aedf2ec3cbf5fe432d50843507609e52439ba9e188d6f83388f93e5386dc0d5b113a0f3f0fea6a8893f4fe42089e4caaba8c8e228f147e4d0435f799605a5e78437cc0042b6a987ff8cf769bc2672ba6f459ccc93eeb39a863f6fcd980a33aced267238eeb11e2a3b0eefe303005f6f5e80f650e1ad78b7fe8a1457f0fcf0a5a5641b7388ef029832b4b44cba5fae2eeeacefc7e0351484f843e0d3924380e29900c45d7440fa225811db275c44c0a0b19310ff8d9c8f42ef7c3d8a9691757bfecff15b4f0bb711d027437cfe2f96ef4b3002326e10fd01aba1b2deb6e3794515ac3ebe9037417a8d8ef46ecf631c46319bf86fa693dc3e6efe6214ebd78f7e37a44aed706727dbd5fe3007abdcd75afe60da5f71b3fd0e39ca992808d23ba9fdf41f717de1191d022e88c269905263eefdaf015c2350604c8b790f302af652dac7ecfe8fd758c8faf453b7b6df0397e2ddaeb6b0b9fa3d7e2f8bf360475007a85d7dacf657a9bf324fadc8e7396f97dce6636c8259559f32880566721f349f3b4699e6f22f999f48fd0a7fe11ae953f127ee97303f97d1fc77f99fcbfb5919c0378636c6ccedb8da1f281f2686739ef365ae139cafc0c3bf4ac0e3d2b68d1f9dc5200e6a37e63cde1bac8f3f2595e79be591919c2967ac42df52b2a9f01f3de9ca78d1593715d46f661d1fbff79dae000fe3cf63fe7ede743e503e551b79c779fb7c27394f9614e8bfddf80fd072d6ef0b9a500cc47fde76b1bb0ff795e3ecb2bcf372b2343d8528fb8a57e45e53360ff739e3e5f311987fdfffcc2f7ff19e397f778c218e9649c94e3c97667067da2a3c96f4414366d738bd097991724871cac0f737d8d8b1bd1d7e33cba459ccbf97eb79970b02792b9660528992f6a9f8c73d58a7934b52141c7ece98b261eecb56eb46adcb8fe1f2bcfd866fc98be15aafffcb9d1489e7b1bcd3c5a2daa1be3d1c07066bfa68f3cf5ebc4cb74f2b3a3dc9a5b1b4fa13c3a2bcf56efa6d7742ac99767fc9ae9c6e7f325f16dcdb5adb7e46b17e0c9e338061dfcec7890e535c7eec70bc6e77a3f9e82efdc7e1e36c180c47fc91462ac2365f977c978d0e048320fdc54708b6ba1762abac5821228e60009dd82599211adabd32df254a8831e5741f68f816acab72ca647ff7ff2f91b6df6db31426da7cd6e3bbdc8db31e302b5dbbd89b6d30ebf9de549fcedfc226da7010b4db0dd9a103ce45b3c52c106d9df2239c06e90cb0ef0a811dd126ca741dace00ed107f44fdb7f00e780d06b954ca6994a556dea234ab326b2e79ddb4149b9728750d50378fdac0fe22e4cdd1762735dbec2ab443ea0ffd40ac254746b89291bad8ed0b9b4bee32e17535cf26e991fbd4156c695f9053dad3440a99a7e5b4c52b4b1369faa2f1fbe85c17b67c0ead679f3d5731e1be8ad137fd1b19a29e18be0b7fde64b3bcbf1b22bee004f3a4924931db91ff051702cfe91d688decee40ff0f14eef0dca59ab4d3bac9d3bf87e5fd778739522391377dc7b851923b5c6368ad63348ba79ea209d4c3f6e03a6c84f2966f0f66ad0d2f9ce96db0e9c3d5f766a04fc1aa2b36e844dcc0396d585044d88dc54c639f69fe3f815eb520bde8280de21a1e44af35286f4f5848f2cfa2caa3e120a2a441d1dad17810bd15781a74e0d12b0c46a3a5c1f26834188e26f0854e524266a5483b2a5e0138969e0efe0e7ac9310627bd2fa9bf1df526415d0aa8d3ab7977427e7f62a8bf07e7dfb1cc63f80527b356a6173022be20b23c675bca66c390330418ab4929ab8cfe63daeea0b3597ad5955af862e683362669e905cce9d5b790a76de55f97e50d5fb907482f446ab7685bbc22447d4a1cc9bcfe055ee07dbc6bfd3e81fdaf0538af0dc4320d0e651d858c16e41e46c3aa24efefbb304368ca61a06b30b81c147a95e9789e430ba5d0693e4d5f59bfa12b64d38516da0d749de04c86be02df0c5ecb081ab66e1bb1894f2c7d1f4fc8fd63c41f7e4f519e4332d11e8cf495a2717b28fb4fb3e24cfe8c9282153c0df482c64e83f5d9a476e00aeda40aefc8403b7d8b6d093ffa44f3fa1b2b193b96c505760ce74be2831c76cc37e57d390c8fe1b8cfd6edd3f179cce67af0ad967dd4f46fa2c592a5148f3c32d1d47c1f4ddbb9593b2dddddc7d37e36cf29b86fa66e336507f735cb6849bfcfdd375363dbe22d65ced48bc79a356bd9bf7db38f424bda161be328b4a434adc7c0b51e877d738eef9ce32fb5431f34b6e43e880eeafa11c8eb0bc10cd65a63bf8076b996b155ee0bb41630fe0bacbc05159ec1872d3aab7e99dee7fc5c5b94d1b5b97e6dae5fdb9266da8632d6cef56fd1691d32d05a97f3b3cbbbb69ef37cfd5575d134b3f4f9fecf6b9b5b8e3f929511b4ecf37cba99e3b8d49327bf0fcbf305f27c61bd0c4426addb0d61233c26ab73202a3019dfd4fdac689637e44ff16c3bca5f5cfd9fc6fcb3e67bff18b9b541ef1ff317e98f53c05d83da2fd26fb7f7984bf98b9d4bed5cff1386562ca3c470badcb8b4df04a9acb343f7b8b447699076e732dd63d32e53505a3125a565534d8ba696c6a617e3dab2d49b81d49aeb5232436930cb16a4c13d25b537301626fa6c0ba7526e519f8d9167ce96f2fb82e1ecfdf52fd54cf0a52ec35fa62f65a8189bf3f6cb65e59df2a516bea87ca07ca1858f4cf54ba8ff971037439f7c39907cebe997a8ce5fe6161eede84b2d96169ebe44ea67bf54acf355e902e4b9b0fddd692cda1766e42bed8bb84256d28b88d35fa495451342c32b6358d0bbaee48950de643136a73c4195d078e12ab8ba56caa81d9b68a58cd24513af4c800ae4d4c83b30376d2bae0ce2e52bc9d4562eeedfd0ffa6cf0723d6d9d46ddc269cd317d1333ce536d153d8df1751831733c9bfe84d089ec1872f229a7ed1d542e8dc8b5c733b801731e77d916ad10eaa59e8f929ce25e4f814fa73a4a35a01323d05def84d9954c829e4393e764e1ebe25ff40cbc5fcec8894ecf3dab8961afa969a8773f6aa8c3dedc61e1716707cbe82f949bf93bb3b35c49b55f43bf25419e6cc469e50e14c92be48d766b1889e03e9f536c0560757453f550d37c8fcaab0213645f6d816e41f1fd018b1addb50d0ffbe2ac8c999748393bb53c8c799ea06967b571b420e379072419d39d0d56662761b304e6e48f43917072a6bbee87f6f90499ebfd9c0bafe5aefa25ac3d5bfcd72ff29d467203052e3480fcad31ac2735ac00ca749cb83faa6f2344d73a08f400a7987f97583b5adc93dbc1531fdd685b7d1ff2aebb3617e22abfe64405f5342df004a5b6c89b6c439cde0c5ab45066435a2599a7c05a1593aff339091ef059aa3e3929bd6a11ef3d4c55e55e3c544caf71bd75fa3c854d6c640c194eb45536ee8b3a0bf569ca668fd6b49d6a3306e6db9a191957256757eada4984121cb0da379d7636186458eaa33bf8730bef65acc2d4ff6187712fdfc49f42927d19b9d440d4ee22a39498e1468c7d005d3b0a606dd0cbca9229da00b79749dc43e835654967c6b485f5d74fd0e9bf8ba2aaeaec27e0664653f5c87e0333a5b8e81b085fafd7696bd933c373f91b372977a748d79ccd0402d880dafc735bfbecbb8f51513ac4f80b289d69780a229acc738f815d4e5abb87ebe927c95be82f6ffd58c7373287f15d7ed2fbb5980efbcefdbf157c5565ccf5ff5263a418f8527167f27eeebe8599679d4ed3cc6c804ede27c62dc79ab94cf638e53a7f33c2db9f3642aa255c83320492e91520b994536c2a7e7255fecc3f948d1751eede67c603c7c4b396ddda3f03cc633e80a486fc15bd002d24b1e7cbe0b14e3d8f954f3a6f355d537e9527f7fde9cdf3610d734dc1adb90ff22788d03e4fd7406cd56c2d37579d69400795796735e56c4137daccf768b8dd4662147d9aa786bd26cb5bc79a9d8e5bf085299356d45dfc5559fd5d470ab9de6eb5aeae25bea18e5f5c63cb0b1f879e0768dbfd954aff7267d02d7f9f564565d8f59faf5d510f3cb90afaf01ad7c067b7d14dad784e051f7ebc3907ae8356891af0942ba1e7b018d05cfd7e38c5d5f823722b6eb977296be86d1ae57fe13d3751c5b919a5294984a84e842d64e8892dde8c1c075efc6e818f5ec46bf8aad58ba7653e4c0d928ddcd5f73b088b7707c50b4e5dda4bca42b294f0731de477e37231d4afb9a85c67f4dd2892c7afa1a4347796e6cc2dd0eba50dea98c7015edf6116b4e29f22f2d61bff31f21fe19ea418c133c86fd79ac62e8b1a0418f79a00c9e1ad0373c408fc522ab6ec64778d185b9bed55f104debe10fdeb5c8adb6c202f4414bf9736da2f72d72696eba9f81decd29bf34a77cdb222773d3fd0cf468f559f940daac0b744b3ff9f2fb88fc3fe31173fea9ff3ae62f5f27d0a209fe94958b4d089af191894049f9d0c4aaf79003e5a32550fbf5ca9fa2478654aed39f8ab60c0c7e7d31f57fd8b8ebfa10bf7b7d6f2032f1089968c49b6004b134e046ace8d88327503b822b1894e15703dd08da0b5d2ffc6ac8a386b4d591d084e25f0f4662938c144d49df5cc05c6ca46618f2c27f5f3056d70f9327e5e95e771fdf8b281f94eec53853ef077a31530c37a3f79539e04acc90a6116d46efb61263f02c6dbc192de1be64a5df6c9937eb9a87f795e797e0c7a6b4b2b0393045e486517073680a398763b532d88cbddc8c190a742593acace4cf6b554d525fd8fb166f3381f6efb6bf8a48be0bb309cc5afb935988fbcba6d85f32a5fe22a259860ef14cbf831e7d6bbf370580fbd11efa5dddf55b7df6a870f7c28eef197dbe2034912f1aeba361eb71147d32cc1273f8ea30795c27be063903e424d70f739279ea0aad49965a56770d93c80799aecc09ac49acda043a440eaa2d966575550f5e72441e892f630f6089cb451395173a527e12c74fde3fcaaee5b2b1cf93f6c5f679ecc763d8e2bacff8f079f44dcf6364c6d6eef04ddd8ea08513eb5cdd6c6bf584f423c909c44319a0e313b403fc34e2130e7ea4decd1e2739b1b418e89f8dedabc5b8ca8f87b21ad71b82e3f4063a84739cf3a0caf371dac1b2aee21b1c247b9c77d000e792874dd7519cc7f6ffcf74bce0150dfe49d61ff6b2fe75c5f01e5db96c8c0e211aaecaea65163cfa8e2acbea66631930d7aa522ed3c58c8655275af85b4d134a6ac845e5257559399432161e1a18f3553b563ce4942255d55eb4b03565aefa8bdc225335bc482ac3ab41aa0b2ed21ebe38e38314b90c7b3df371176d8b4f11350bf724638b6b3f5f36e175fd8cfe7c307adc0fa02d0ffa8f456cfbec00c6fb41fa9887de0e30cbf30773e550d3501f0db86fcce5c336ba304f1b6a9efc31378ba7c7d1673e2e6f6807a84f56af02ea252bfd21261944dc34d00fbccec83a841d7e84d9f290febfcea93c857c1b6a7e9be5923c19054a00df963d4f4db705800708f19ad889dd6da4b2bf4deee306b98fcb9e9bbe2dcd6cc6ab3d405ef23e909327a2355df6ac36df16c3469a4e9f9016aae5f0b49fd259369ba5bf35ab7156030bde4d6b331f9fa7c9f2b19a8f9ba307bfb846d1f2fb8e3c9f1c20324f313aa7f2df15ce431a0f46b2bade207d53dee47129a84ae84be55e7e8a3ef09b64744dbe6fa22f1ad4f73755c7f0023788110ade6851df9476e624ef6f4aaa18f992f875e492466052ccaaca0dbac36533af3b48dfa415d01d36036655bc1af1f41d3e5bdf7c91fb2ffdc7728c7f7e82b659596f735b32815609a934e14cf78435d184df2556ced6e6dce626e25db023455928f4955d0cea41c3892ee8ba76595d87b37b57b69ee75c6a1fa25d73007dcf43b29a58f450f0e1403941f290ac3396f12a9bf9e5a6aea294954f55cfdbba73daa3a06d8b3b3e2771f6062ccecb41cce70e22163968f7164dba97d7e198edadac4364b42ebe05b1e3bac22df13a36c12d8575d15e36f1baca5e9c9b75b5bd6edd6fc3bb17b4b637d0d5ae8a7b4bf04cd6b9d7d8751633b9e23a7e0d636e6a0f06c61d8ca077e06a0743533d88d811254707abc0529e347c54d79fb3fb0ac6ee73724ffa16da17e554647b8b3c4994519fd3a63e543fde8723aafeb129209f685f6916827dd1015bb72db47840b65c8f0fcc48c5034ba8bc91f79379594de6d02318d31045bb91128019c6f182091063f2081f6f01e24e32074630ae028511777cd912dea96afd1d457cd5ebfb86a944b7554b3c5cdbbc10b861aa5007b8e1ee8a5da0dfb2e1a5d6ff7ec343fd181fec8a1e13ade832a51588a357209e5624a6a0a89858819606f4adc07c06e859811e6005e6334823fee227f6700562f515ddc6214f5ed16b6845df52ab478fa1ffed95ef7f9cac01b87e4fa1359e440b7c235ae929442127d1e79ea437e20a7e23fad4532cff089fe293f68de865e16bdf283289c7297ea378375389c6422356562b52212fab7aab3af89cf4f9eacf3cedcf9a1bc15feaa2f96a6ab1282ffeb2caedacbc33ab551b4bba37725e2b7f929bb5442a7f327ca3eed1299be7037a2a6a7aeb1e68fa5385bc363e3b02e003dd8abf37590d65ebea80bc1d8c3d073d15e6b5c9f68c735952c65a9e1ccde691913d4ff458495d16dfc3dc6ffc608f0d714d3abd3631ef056253c6fcd7621e9c8c58509fcf99ad59067b3052c2dc1a476224e578a4cae1488d07218b6d197c7ae11f8d388e301f4f75e6bcd4b767e4fd2842ff8176823e231c913506656500cce4d7a17740ef41eb5093759cad1cb04eeaec641fd6cd5036c59b882b39dc4d45ccff2af3a09070dde6bc4b8a1ebe0bb805fc2bbafe8233d130e6acc338d3c3817c43c464df0cd1ef8124916e65a5e248562b36e9eedf38c13b0a0003ee04d7811d1168df89c51e9f874d3458b364a2d5887856a3b5ac0e8a404ea9011de210a145d062835645fa1d165a851864953c37193578d5b24c36cb10a7f4282fcf5bcaf755b84839e4dfdfaaae30bf9895181ed6e76331d61e479f731cfdcdf1a229783e8ed976071a203acd38c489b7d2b414ccc3e15cd5c5a3a2babe453caa7049ffbf287c8b4ce95b889ebe8533f62d4484908b00010e60e5d12f7d2bcc7d44675517e63ee1b42ecafdbdfa3511e4f9f85cb6eae7a7fd62d565903c66ca98c9236aa9137d2bcdcb99293fc8cb977af6a8add3feffc084032b647dc6272a015dcfb212da1314241fa1eb695456439e962afac47d2e615637c307af4e8f9ca72d3cc35f145eeb74912ad3b55bf03aceb5059eff13f2fc86fcdfbfb13c89f3b03198f4233c89de64a39f8c1193d88db16840cba356de181aa5491a65c04d66bc68cb4bd95ed477395b344bf97d4ddfdfeb99c2b1610a2c1740798a72a99849ca97728be5b272989d0598f7092061d61660460650936a4a07decec8a0f3fa5d43ef5a4ae80ae6df56b9676a49bb2e3fead7f7e7f4bd565d43863166d14e7dfb55b623d9d69a9eb24d791ab002a029dd43e93c7444ec5d65fa15d04f5bf00eb065ccc633ddafb4e876ced509e26bf05efe375ca20d75e7a63dd2729b326b3aa94b53ee59e08a88079bf7278f958c3d66dfe98e45c68186c7306f3ec6ef0c8ed13bed3159ab85de49c7aca91e63e3c147aa2759e1e59dd001f4ce7f0359ec15f0f23d1a7f8ceb016c84f445e4c9c833cb4f202bc260f671ecd53ddf7ed0f8eb7a9cd57f114bf24fa20932fe483bbe70a878a49c233884bd3b52309523f134fc91f299607a1b9ce1c30c508b8ece1421174df9ccab7b3ff230a2ef9a3c3ff1fa6500daefebd17b29ed514aafef03104fc23e9bd64c5cadcabf7e77c6d58ad262b5acb45c2d99ae6ac17457639553d01ab0bc8ad1bd8ae35e0d8fc8bf88e19110292ad5a54767ba7e198e7fc138ee96ff923e68b94bfe7bfa6090bd0f0f5a31054e729e3e485c3625c61c868bf93a5da8e3107a9f2107c8db71917c87871d740e948742b5fb5cc74381ca05e5659596199b1db29ab602c8bbd145e4176a1e647a657519a495356716777eec502d0c2b88262bde2c8e227af6f11c387dca7e2ead7a0f9ef4ae04818f3cbf85000fbeea5fcd0a83afc8f8264fad4da2cd4c2646be9843187758be523a89f904f456c621d832dd6ad39bbdeff15e7a4b97ae6c40bab2c18c265f4de1bdfc96747ac587f9a5d99ead39f15baa99e774be7ebacc20e71cbb75d9ca0cd1b486734d21cf17f1de5be439baa5fe9e318cf61be9fac1d1388fb9717d931294153c2e6b0bbb310f1d8f5b5380ae20ef128296c6ed18ebba6b6e2cc87cc7acfab152dba24be1bb1cbebde3ce545146f242e12af00b285da9ac3d4ce0e54dcf252f6dabbfe9ff5ff46b8c65e31ac8b35134c189fcff9706e62033c8fe7fb9c39e60a070873bb16cc16f7acdfffb5d5dff0f739f3fa3ff645b407f86b33c4b9381d5d3cdd18757f95d4b5765505de9aa57bf3660afe20b6cff3c56d9eb17095eddef8bf2fd62e9eb6e5e0ea00ddf8cfefb66ecefcd984dfc05e5103df6ece692c8f7cc00ba33f651db57c8f57c8fedb3678247b92f9ad6709f1b80cf57f951ea638c3dcdd4dc170cd0a3f4557b077d1514e9acb9ae4466a0c466e03866eac79d5956f2a6f778607a4ba1a995621396c2e3ae5434692931a5857c23912a1a5fa27e4fa35f7f9a72a4c602b4ce3e2ddf03e0a733ae097a1afdc91c1d7c8c9ba30bfff5e58ba86f9d66ea7051399349aec562e7d90b6f688e6ef1ade569b9fee4fdd991c414473003477c5a1a71f2bf8a0946304ee8da5119e59152851640537d6fab10c9fb5bb6528a48294534c2e0412b163c35f52305919a7cbdc997403bd77fbbdc5fa1b2a1049176b2ccd8a4cfb8a4d7f8a4c70449d51493b24992a27e65c9025d0946b4844c37f83ef0bda0cbf4bb4d646a89dc3d67d8843a132571a920df592ac9b381716929bdf8af9878592d447c7914c7f4a83595a39c83cccf83f2513719d4ad8c7edf7147093c463cd17f0723e17710337f87618bc011e0beb3d8f2f719b7ac37aa8f45e7c2313e871c003e17cce2e99cddc3008177e718fa260d916ed9ab485bef7837f5ff94f6e74353f82e7a94ef16be47df450ff25dfa9e7b890182ec552eb4f0f412ff1ff43d8606b4456f5fcab4b645d79a0f438e20d3779d716b84173ddaf99a198ebe1b2acf265c001fac61e191d2afb1df0d5e929ced1a9773287f4d08de9aa2782da1f5c8f75f79b086f8d51fe832ee803de80e20563d101fa403980f81da03e8fb0ef883f68c872e840f1f8ccf30fc9cea63d50bcf072bd0937c37fc001dec3a430725bfae33f620c3d60d1b1f70078333762c848e0e603622e59df1634e7d3066209d3d138e59a4e503385f07e80c8f8712639c419d2057c6b33ad8710fb8038194fb97e001fe4bb175fde5e2aea2d326be6e99ac76b5c3ef8cdfc7e8a1dc0ede49e7795af23ba3f7d9113271ce15e6a1e1fbdc34cd3c85cb52679cddc1988b4bbec1fbfc48569e70bd324747cfb64c4123fd2a2ffcf74efdbe3bc6967a0c60965747ff5a8f6565270eeb65cedee4481857ba49797e14d8d5b985868c1e436d9d6bf28b261eacd9e5df47fda78194dff74ae9fbb5b6b4effbfda6f6fd57f37dca7fcabfafe45fc61cf065fbebee65ccec5ea65fb7dfb0bfce2f1795a76fc896bf01ee6544972ff3af5b911568556ab3b039c851264b0e92f26549e55f76aa2d02c1cbac7956414597665ed33aa1659480ba98cacb5999523b8b5cb27ce9656fb2b2f91b5ed2820bb456a275dfd09aa25ed9de483d8ac6a26e167b283559dcef2e7dfe08f9cb3a5ef522da4841db8abccb88b6b1c5a2bd70dd820626dc42756f0a5b1c604d690b036486b6b886df62f52be3764bd888d67535165efe3f4b7c68d187fc00c7ebaf801f203efc01fd1051d45f013fa41f5433db0fe9afa1f96bfaa1f87419fea1ff6bfe6122be869fa3bfe1e7ecdf6414a97e80a3f303915c0e7e8e459773044acf651efcdc8c7e360d555f51de9bbee758cbead3fc05e0a46c506e91677c58d2ff551720e9e9b9eebfa2e702d3f35c64ba9e5bf81ff0bf81f6db13a185544af26eb9a7b793976f70081f552253c42cba5c09140966d6820a66d75d88617eb9426f0f010f38803a802b5d6faf2d20e669fd7d12f3e71e9f3d5f12c97adf295d08d292be7329bcbc1fc9aa43449e1684577d9846f2cc88bc977981eed1ef3782ab66abf1dfd39d92e9017a73da2d5ea9ae4d7b21cdfe83543ff12fa688042e484e4e4b172b5d702923d7c07878c5690caf25cd816945f3fbc2df4e01c498dfc6d5f9ed62cedb16bea98f728af12a76398fb610d300c5a0dfae18fa918be947986ffe8862fb230660f95164aa3f423b019f02f423ccc67ec4e2fb85d990f7c05ff7057ec27e819e24d93e414f5ac85e39cef0119ee19b40ba198ff8234d0ebded3553e9972be7e6d362edfcdfde797dbf1d3d94ae3b6d1f97f7f47817e4edf41a48af91556868176da75d68d3bb18d4779352017adb5da9e8c447d27005126abc8b4d4d7c54dfbd9dba69bb93b58277f56e170d2b156b6dbb05e55d3d793a498576825c795760ba5142b08bba99a93bd85532a55d8bfdb7f5611360ffbc8947c2a108339768489ead260ec121e21f612e8cc443ac5c113a325d90e7824c3a226b33133c2bc849388cb72316b3914cef35ef48cb59cc9bc6b27e776fc897d0da2e972ff9cb38369792cba8cfa5b26ea3cbf612b7c8e02fc52df2c2b7feb2bbe4a66529858c949895bdc8c33afdfb3b5dff37d0ef0df08fe599348c153f969e807f2c2b55d38f23637f8cfe00b03fc66c09e055dcc810b4f0023747468b9825cb3d5f9e5fd7989d52bfe3378f4ede2592f78852d0aabe8b643750c3017603eb536eadb23549e3d5fd3fbecd04d7f5f8b82f31f11941c5d8c89d49afb145bfdc4719d7272b09dba87b7aeb225963388866de088b227b868dacde568b6af05a42f5a8bbf9ff7d7db9a13390ce58a32b89d631bfd5efa915a1f3723f6a8c649da38c4217cb1a6a67641d571e932fb759fde7d14b143b265f63b1e388f4c7f54b6f634e5391ea827144d8f285b633927398a3950fe499c39c932f4136799ae27a0c399ac27cc2f846531689a65a7026fb7a6469aad0b053f24d59aaa753e8f7a7504ff073e1a6d0264193a992a94c2dee303edb5c7f7b1dc69f75183bd6a19dad4b725a96ef4e8296e45b92ab18a07545b5b1da71adac0b5665dfa48c5665dfa0148afd5d57000d722adfaf2cadcabe612954be63695759f565cd5b60d7f9bc0cd27c6c5de414f2125a46fedb6e1ce23f59497699f1dc6d62fd0e4a624afc2653bc984ea374b102a04d5c74a67a519fcb05e72f061caa54b818b397bbe517896379b70533153fa2ffa09bf0621136e1175fbf47f5f91544bacf6076dee357c9da5bbe07c7a2c70138cee029971da8c82ef35b154147f069fa17a12fcea2190a9063e5ada643fb972b50f2427f55ea41acfdcc527b099dff85187311a96728083d94216ee1e9106d41fb6891790b624a44fb09a2fd14d17e06326fdd62f72e0315bed3ef218c8f3d0eedf61bbd2694b7f176d337c2dd4553dccddfe0dda1a940e6ddcef4ee66d3b79bccb2197c43680a3fbfdb9a7877cb9baaaac3d9072defc62c1ab4883c0bbb17ff7cd727f5fb2cb83e1e40fb782005d00702f400e6e0775ae31fa03b1d787f273f60ef0c1f4069775a70f60106d03bc19a49ee01c41577a6f0a8429f01e9ef2c3f10c0468f1701079e1f8f1fe0c7833b0b0f38c90f32ac77f2eb01787894193cceb0d103f6f1c8248f174ce9f1b2891e5fda5dc8cfcbfba5b2bed7a7e96bf4e9740e9567c6e8d3f2ed18d05f0af53f54a119dcbf12ef8fc8ca15b403f49a7ebcc0e75a4fcafd470c4d7494cef71bc6b6cfd8a37cbe175b7bbe663cb6ddd8baf398331ee5c3e2017a3e35e1517f3e31d1d1e03c8eeed1f03cda0fb6056ca3f398571d8dcf87a604aba4f0a67c54df843e6a0fa3a4c3213cade464e2a3b66e8f16e5bdeca3a5f38b3e3df43a5d3f1cd7e4ddddb25e743fada7bbabc2ad077f7762acae318dd1ee6eb4d16c4d695d6b3ae3d1fef2f5a7adea58f58c3c74d5e9bb79bdcd57a9664de96061e841733d28745e52dc853419a756ca6a018d6b6ab35c4083f50ccce8a444073fcd7f7d5637a5229fc8a9f85c432fefb4d17aabbce8516fc87cb7ac70ed4dfa7a6ffcddd17a8ff4b2e2f5627eab8cebeb89ed4ec4f973f0ee9d43be58779e59b062894bccbda0f77f10f9f7631eaeefe8a177370e5bc49afdb6a7780766014a719c40ed1d45896473ce2ab56974d7d59cbdcb77cfcfdb6e36d790ea6d6c2a2df6b73b7f7f91e51938a0bc937d71a7f5b493b32f9842e69de4f5691bd53bd509baa08747195c992bb56ba00a3b57a2b2f75eb95a19697c0d691752bf5f95f821221355ba4c58c10cae52046293542245a51298740ee24a980448514a18692a4986b27c19b112278b6b089f31f1a0fcff6157f6c8f7b3078295a9bc8f0a5a361e9401b752562c125d246fb00e6476a1f2462bab6c4169a5054457413a79e3b50b32ae19e8dd399a06d29c63f5a7735226b600e794546fe57bdee7500378da1cc139b4c5738b5b23e48b86aeeb75b109de9d9ac2bbcba6f4eea249de5d006293be1bfdeebb8355fceee0417a3762caf784ab98c307e91d8837de13ac721c3cc8ef4099eff1ab02f60fda77700b8f38ea3d7655c4f641ff8e192e780f83e307837784ef4104c5f460f88ee83df4b701d3df46e0226c71b6df1380724e31a3788f03f5a02c5e06b998e01d0b39932f181ee891efcb6fc21c6513a2ca4db49d3795652d2650cc976e729bec4d386f37f10a605346112f831600ba0963fc4db40211c24dd83b7045d902bca264dc4db846a02b9be0aa2de9d3d6b3b966ca826c9163b4c223ff14e525a843e1a6c57752bf2adf77b388adfe2ec74b4d9e66747f37a35b26fabfcf64fa3bfbf7b60594fb2de6f7655ddf16f51f469b198e4cd563ce21ef16cf0382ad9a837c0ad9892fe42625a576b8c95185c107000f730bafab79a2efe1b75f0df455c3b9b57435282bbb92d5a5f3fdec3fd7f5cd70cecb18b5cb7698cb8875e53de8b2038f36255f622e7bf018c340a91c0028bf5c05c51e40e7ca859c8f8733082fe9d29c0f919e8643d56569903750031c74c9b0551aa99fd5fc9dd6c16a1a81d374999fc801ea23760b1ed72ef2139fc5fefe44d7afc3fcf334fabf018c11a7bb7145b9d329c6c5e07419dbe874d1f881f834fa9081c2e9087cf13466e903f6340d45a783690e751ec2553bc0a719125adf1029c201520da9dd0d799583d34ebe9336645572a7fd108eef104a1e62f021fc509bfc3b20a0f08e1129a2ef1c62d19db643182786305e0cbd9abb4bf27e3d5fd713d15388de9ea24d55c3d8761959bf2dd515d72ad0b84d98af3f15a057a1a742e967b0c52cfda97853c164abc1059b6259ed6d13f67f5364b2d5df824da1720e5ca0560fceab0e470d7a7a2ad555e2e24d0e3a59e1ad00ce213fd467d382aa4f3df9fad3ee11c4ca8f14407d4e31e63f4273f850e97c323dc29ff6b95e205fdacaf26aea6c9e37ae5f9531664296b436fb3217749ce745b9de5ea593742dba4f377556ed6843d090e6cc6a75b91ca877885a66a5c752a3ba946cf59b6005134ef38be9653faef707cafa7da7ec8b4add267baaaf2aeff14297cabad29748f90a6c196fb96c42a5fa7d24f8164cac345f1f8f43f9ce2b68604aa0b2e67459a93589fca7c10366d92179cfbd7646d60bc0ecfd4c0ad021b49043296868d2439dafe727f5ff79d4ffd165c6feb84ffe635d8e19d48f53131da247c34391090fd15e06ef401d7207bf576ca4d48adfde82da183502fe33202bfeef08c669470484f21d80c1653bdc60b0231af43be42b836e90cff8410bf019d215f2e4bb65515dbe51563db3f07ee87bc65fd72bdf17bcd26da22b1553ba82f6702b7a86b1e40a8ef8adb24a2f469f2b382ab2b26f4ff90a213217def694c07b5dd197c711a15f6195f41b073df115db13c86ac9e3418fbfe27a42f11baff4449276bcd8a36b014baee33ce6e1a3df70188be49b0b6385719b95861ab8713b168ebb6cede05b19b50ba091ff31b5dc5bbd09c7657d611ac33ec0cf8f2dee398d0f9b78a8874b53e933648ad8cad70dd04a94e3291c8705730972a069a9a492d3dc788a1a3c55548d37f1947d06fbac1262e9299e96d0669e59ec5a4b4feafc1df1d72bdd393072bc82f9ec2b1550eccd4f9a1cfd0435f909bf8228e995107acc8d5f419b7da52fa74d5853fe4904ca26fd0962cf8ffb57405fa18f5bc9e527fc0f4dd04fc25744e772d9fd247805730694823c3ebed0fa9f97fed3a28ffc69aff13fed01d08ffe14ade4a74513288d4c711457cd4f65cd7a1ccf9fb2e9528a786614e5ffb45bde6fc9b7e928fd94d49a7156fdc49ff374f4532b6bf0c3463fe551ced737c82056fd3ac73c56be0de3ef687cdb624778e9dffae5fe6782fe2dc1f94912534a30074810ff239e8be4cde1615bb2e0d361ccbb4611e78dc2361ae5c0f53c1ae4f0a6867dc8604def68f35b26694ed1af8f2600b57c0f2569e1fbe7f877be565ec1f5a14fb65ec051bd40dbec83b4ad90537b01e55fa0eb688e3ed719be86cd01c86b4f02d825caf3e58bf266d5c75fb0159e55279e671f1cf66de94fe93e6c7c7f4fe84c01e726c5f147bb3375207d81af89f0053a4f40f082d3ef7b7226efa05c9f213076969c01a3da0b8ba9ed2710f5c9fb9b7277a756cf28d5a39ca6ba1e538ff2f22dbd0185ac1be5eacb4cb15e32b547d18b3f5af82d7a34067cce87bf45f7d322e42c6def2f00390d7e21a81744fe05b4ef5f58faf70976193f28fd9f3e0da6df4f65793758bffb5d539e3903220c7dc7d8710ad8915ef62368d923e8af46aaba6e971b49397b5e3661795f3918297030826b6e2434055def0bd7e54849bf27bed0df3372ff2042dd4e16e42dedb10c4edebc1ef3407052d7fbc7964eda31ce3cd4131e533c2610492cee2478c831a8cff55675d420058f8527e3a9e8a4cb350c3e9eca4ac148835cba303eba31570d516a2512bc9aafdfc9fa6ee1508fc7fcc52d036ac6caff5cae1773c0966d9d1c376af2454959edb11ec83dc9068dcb97574a756ad87172be61d1deb8c1e39193bb9a313779cf54ef6296c8ad4e5c9475b75c810b4a652d31cc44676012b7b8f9f53f6386755d5032f630cecf61e479d81ea1c3a8e5613ae20ef311fa0b3e8c2b40393aec8e3080a8fb88f074d883af1c9128c61e41e422dee0087148aac058b3b734ce7bada9ee25b36a2f22dcbd184ff62272dd6b95e7bd6e8e8c6875af07d5ef9c18a1b4177df8dec5f3883b73decda10b3f46bb657d60b411bb1a670570ab718c56f30d7635dd10af26e5e3d5f606061f82e79cb7cacf960ba0698e7f9ba72de7d4aef675c91bf20d904db27a4175a4418caf03b2feddb63ee3b66136b68dfe51d674f14abb4ca81471edb6b249b661d6b829d946325b0465cc107953ba4d6686986f6e9359a303a54d4883f9a0531bfd23e5bc9ba636f7c7f1052cf2ca788c3332a37c13b8f956bcddc46f72b91752bda9b4c9bec9e6327ae78c7f138e07c08a20a70294a93694f3a628a702e4f8a66e4db96cce762147f0361361fe159af24864aae8f3d0479abe59f0fdd59d8888fbbbb075fde857fbbbd0a75561fbb9fecef9ffdf8697f7c9fd99e75339cf869e476b78be9a53ccf49f77a0d2a6a41de04a5aed729d53d96a9a0032b7f8d85c5742bed16a00b404eaa41c50f83d5f03adc187729dcb7d70ec9e474b7cbe90d320af57b8da6a9dc45e020db50cd67202ad13a30eac750bb4fe2c6bdf691ab4a3e7651f17ffffcfb326d4e76b9331e43516f4db5b7c7ff67595b89f6e89fab36fa63479992315c0c7f0e944652bc0a8823ced2d04cef767df5c892081bb05634abf7cad25828fd8717e31970ab314985115c630cb1e7b15df40a755b23ea5ac8f7427e62577d20606dc9d25e341e94e066883bf3336a472694346c35c96e77c9006d0677e54e7739bdd50906781323fc3906d83e41922805659793ee84e9beba35cc6f94399b65180cc5217632173a324cf1fa11ec227cadbbc7edc284b9e5a8e6db1bb797db37c667c8355e8f11bbe25f75233455e72615a5edaef9f35fec1d8f5186de5c7aa4a09708f254d7e0bb65b48ed22a30f7c8c41ed56aaf216bbd53e86960b4df456da62b3d571351557e9ad74c202fc56ae3252cb4a8fb43580267cabcdd6b1ad96d52e29747ddc2da4a992b7826ed1356b61a9bd55579dddea602965f96d95f503a197b503b7e258402b39915a25552ff2c43c1ab2d7f2b414233aa4dabaf0f1eb857cfdd6e40aaef72bf6a293a75caec4391f82c71e5f61f011f830e7dd453b6a21631faf90ca24f22843873ef20a5f137c85865340febba0615a57030ac3c1503c4c26ba120c4557e4fb58887f87bc7e3b8b931468d2c5df5ffcb8acdf2eeb23ade12b55a92d68d70c5d63afa4c65fa998e04a9283d684d8874829ad29e53401c456be12ae2153005703c4ab08c4ea19c182e3b3c66bee6a453e4ed3c9717157a4bc2c3f0f4bb8a6f3fe7ccdd88115d2ff21cae2c3a597f9b09718ece5e8a3f665d2c8ab041a4a04061d67ba52b293f44b0dad94137b1537d7e75ad4996a82716258b6b2066b466b0bc6d27f474d38d02b317341625cd96294c5b6092ad01e4aa823372b0df2e13db0f1b580368894a97e074fbe1fb2f437f43f8398a02f2818bf25344e9f8f42ecba0557fb16c4b55b10d342962f52d016c4ef5b10e7c287b6a4f0e99a174d7b9626913c722a7932c77b38e7cb92b79663b5acc064e5d99c86eadf4c27cf66c9f358e8f116b57fcf1beeaf512a3d92f45483b4b5079407dd565c5d5b03c8651340c671058f7e786b94f3e863b6966753d15f13b1a95c05cabf704ba65bffeb61d04cf6a38828efc850180d4d9762f1e7ef77757d85c0940ec4f27ed81e3ee0f6f93df6008ed401de5384c61e401476a0026a4d2f50dc43d086f0e8421aa792c01f282097a2298316418b074a263e909a82be69169948df26f3f2d659863dee69293150d9aace1d08f64407425385af431a77e0d57d9d51de4f94fb8bb1f1be6258ef835664566a62ef4d97ae8410d629415b49a27a01fd6fe06ddd26deeb7a5ade0ecf00b594f74c5b7416f9903ed731c70f73d3d93aff339069d8d7f99af6aea5ade2c05dc60df65bb4e9e338eaf7d271ba1779634bdfa683d81e04bd970f4ecb4d2d3c702c8fd36956eb8cc7b484947cdcaa4f0df92a67b83547e56664d535fd8ecf93636b0d8eb3d4f2b4705aebd38821a4d6c7afaaf1dcf234779252249779ebddac4bab67758e3cbbdeb3f3697adae373f7f3aada4de7596be1714c99e647478ff973a4d3e8ad4e4fe70f0af9b8cb8f75af523abd4cf9c5fd3e6278a847d65fd9348079f000e832136caa99c2a6d424a3655318a500fd56c0a32553525a34d5d1428ed8d446a3196c0acc32cc9ffd26de41f3c0e99ddef96d7e93437a94b76971cfb0fe575d5f3290bb998daefc0ea96da03f906fa43c82ba3c12c9b74c542f77548b7324ce7901c9f77ae49b2bd93d59237742e12b5f3ed19ce46e2d8ef3feccdb3f12645efb299743bd135b00e44e6f0a7b4572deef55c7fb43133d52d052a247caa0f408faffd764e047b474f8d8fdc123767f6c12003e9059cba0fd384baa5b4c4ff17579ff53ee5f0c22ba1c94b58c65b53f9149d73566f947ef7e8c4783d8e706f668d0de1f0e622676bfae970d39bc9f065d83efc72832482bc3fb5dc3de1fc85ad7e06dc381b7e0b8e1e1e1c05123505dd2b2ad4e903ce9756b32412b298371b75ae1eec7fecf606530817adc5acdb7a8efad68ddb72efebb4ef98f36e8ff23af9bfbe5a23972c4881a5bc073e44e76c92358808fbb5a37af9fd0b9be4b2b93315876dc37a216f01c79edab7a41e73efdbe4ff6d5886b610d50eb40dba57f35f5fbbec64f721f0f31e270b09e8611670c071b781857db30ad0f56117465e8ec7a8cd4eb79b8049ed63b40280d17552e0e178cd3279de42928c42b39ef86a3163e543e543e68e1319fcc793fec541f674f2f216f2e57f48925565e6c25cc70e48929bb3e7bca2ace9f688a650538f8d586177ccaa84fdf5f451cf812e2aa97e8ffe2979819945e422cdc22db9742b58bcee5945ef2b94fa6cbfcd0fbbd54109ee9256b445f503bab6f49d3896dae4ceadb94839c977cfc3c3c7ca7d3b7f216f94a7a9e2ed7e67201bc9ba7be7e9efd5a780fbb0ff3df9e80d7b9e57488d7d1725a5701d79da3bc1c735159574e2db1fa74b5d88369bba4a775d50e698bcbed3a3b2b7da7fa3dabebbfb289ce2527e5d9063a178d2517e56dac8c4ba6282a4f15cf11284d1546c5c3eff12a97c163fe00f8a6bdc17374e283b92a30ed7366ae4f53e7e167df4c79baaccc7ea0b4f4f51dcd27647d05371075eda3c8cbfa36fb2a402b1f4deb74cd9b917c1d9cb636d073e5dc8efa422a5dc30b74ce5862355d975a73ef73034b9da053c3d8fe158e4da510c89c7f27657838a763c0383dcc052fd6875b2c0fdb02e69e6ab13b53f96af7ce60cc01c2b931dee9dec74221d931da19bd8f76da7924865480c48b94dae5d9527addeea4311eb55a337d8311759da135b3502cf5f719e3067ae4fdb6a297558f57508357b07eff2e19cbde71c5117b7f90f3d80fe1df6f73b9e983f3f0fe02402d7a446cc59c2b72e63947ce3c1cd2e59895676bb9a29377653deab9b87ff39fced727f043a93c1f3a92608b36d9af6bed43467b1d29828b46d0df0f0590c516e536ea0f652d96a1b2acd032948cc87a8a15594b7b281db1d876c91b5343d511565e9e4f6558680871e590d3f402e43a24e90b233c243907a065130e2de42efcbfc8f3b55435ee52b7295cc2d87c8936162e958dbfc41b7994368acc9730064326c1a8571d5d8a6774972c8059cc460b6d26352d0110cdf1849f21d5cff8fa8d88875553de58d62de200ddd2a564236615972af91611fea570a39446a3ba1eb06a5c5e3b3badc5b87389738b532d8f4a297ca977a3ac37bcb0f3fb6544e23d8c1aa5fd8615f28e78afae474169008a713bc51e82b76a93ef9b44398f598bae1a81f11fbc7c1fc5a505e858be89025a94f523947769a0f995d3fc5d744d6f4d31f5fabd1449df0db90ff66ee45741f9f91a18f750da857cec3df29df00af2ec829d539ccb05ac49f1e7b27eaf3c937e63f4243d81237c233d19ded8e4444f4fa085de58d6b51aec8df649aa90822b6e5ac71586ce5fe593c1ced133fc4587167e63455779581845af756397a4cbb7eec9f846d722cb76616775e6f7bbf2fe82932712c379d185b96e5798519e4a0ed05493e27c2b95f7b385a20f98ea3a204f37622c3e407f29a81cd0e72573890eb87c14b3750b8b9bb6307481aca05e97f5abfcb4be74f0d5ae8f785eff7fc0cc7d639f0936f6986823aef38d5de071bef43a74b2eab6caa43af4310a6f2a1b6933c19271a8efc6d094375a70165c69a303e7612d6ef4e06873f7c6603372dcdcb531942fe76d4e40ffdfcece2539611806c3b6643b8f01d3322d9bae3ac33dbacc823593a5afe00bb0e91d58e420bd4a4ee143f497928164da45293342e693100ea3c48e070b6f7cdf9e6ae8d0d7d0f8567b7be21da3ddc0a78246aef501fac934fd833b6ced3bc69743a84d33b6663322fa5847ccfc471b9b8b53cd9769dd5656615989bd91899252b76256995fb1f06fe2749d784978263cf50b844416943e69e488dc18ecfccec932f9f270ff0c70135644aa97f1f00c79e4bf127f7b9cf5fef2235b7a9d85f3fe6a6557447ef92162a38c2b97f86464510e57d9a74119f99037b00713f32323ec60dc9b9c9f75892614dbb98211a1207261b491391dce3770f92dacef90a3ea83a3ef9c723b0b155ca73bf4acf3b37f342d62d56a9398b0202621a6308696585569cdb63426226655fc4ee2eccf6c0ee7bff5ff4bf63706ad967b6ca5d255bacf65a5361a27f4879654eeb9951e7db2e27f74ea13128308bfb5a8823528bbb5162ceaeb4d0a5a836d9b167368a2b49e57736ae0e16191e7c5017c03000000000000000000000000 \ No newline at end of file diff --git a/packages/nouns-contracts/test/foundry/files/descriptor_v2/paletteAndBackgrounds.abi b/packages/nouns-contracts/test/foundry/files/descriptor_v2/paletteAndBackgrounds.abi new file mode 100644 index 0000000000..e96869e32b --- /dev/null +++ b/packages/nouns-contracts/test/foundry/files/descriptor_v2/paletteAndBackgrounds.abi @@ -0,0 +1 @@ +0x0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002cd000000c5b9a1ffffffcfc2ab63a0f9807f7ecaeff95648ed5a423fb9185ccbc1bcb87b11fffdf24b49493432351f1d29068940867c1dae32089f21a0f98f30fe500cd26451fd8b5b5a65fad22209e9265cc54e3880a72d4bea6934ac80eed81162616dff638d8bc0c5c4da53000000f3322cffae1affc110505a5cffef16fff671fff449db8323df2c39f938d85c25fb2a86fd45faff38dd56ff3a0ed32a099037076e3206552e05e8705bf38b7ce4a499667af9648df97cc4f297f2fba3efd087e4d971bde4ff1a0bf78a182b83f6d62149834398ffc925d9391fbd2d24ff7216254efbe5e5de00a556c5030eabf131fb4694e7a32cfff0ee009c590385eb00499ce1183326b1f3fff0bed8dadfd7d3cd1929f4eab1180b5027f9f5cbcfc9b8feb9d5f8d6895d606176858b757576ff0e0e0adc4dfdf8ff70e890f7913dff1ad2ff82ad535a15fa6fe2ffe939ab36beadc8cc604666f20422abaaa84b65f7a19c9a58565cda42cb027c92cec189909b0e74580d027ee6b2958defad817d635eeff2fa6f597ad4b7b2d18687cd916d6b3f394d271b85634ff9f4e6f8ddb0b92b3cd08b11257ceda3baed5fd4fbc16710a28ef43a085b67b1e31e3445ffd067962236769ca95a6b7b7e5243a86f608f785ecc059542ffb0d56333b8ced2f39713e8e8e2ec5b43235476b2a8a5d6c3be49b38bfccf25f59b34375dfc99e6de27a463554543b19e00d4a0159f4b27f9e8dd6b72129d8e6e4243f8fa5e20f82905555353876f69410d66552d1df71248fee3f3c169232b28340079fcd31e14f830018dd122fffdf4ffa21ee4afa3fbc311aa940ceedc00fff0069cb4b8a38654ae6c0a2bb26be2c8c0f89865f86100dcd8d3049d43d0aea9f39d44eeb78cf9f5e95d3500c3a199aaa6a4caa26afde7f5fdf008fdcef2f681e6018146d19a549eb5e1f5fcff3f932300fcff4a5358fbc800d596a6ffb913e9ba12767c0ef9f6d1d29607f8ce47395ed1ffc5f0d4cfc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000006643564376531000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066531643764350000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/packages/nouns-contracts/test/foundry/helpers/Constants.sol b/packages/nouns-contracts/test/foundry/helpers/Constants.sol new file mode 100644 index 0000000000..3a1c19af7f --- /dev/null +++ b/packages/nouns-contracts/test/foundry/helpers/Constants.sol @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.6; + +abstract contract Constants { + string[] paletteColors = [ + '', + 'ffffff', + 'c5b9a1', + 'cfc2ab', + '63a0f9', + '807f7e', + 'caeff9', + '5648ed', + '5a423f', + 'b9185c', + 'b87b11', + 'fffdf2', + '4b4949', + '343235', + '1f1d29', + '068940', + '867c1d', + 'ae3208', + '9f21a0', + 'f98f30', + 'fe500c', + 'd26451', + 'fd8b5b', + '5a65fa', + 'd22209', + 'e9265c', + 'c54e38', + '80a72d', + '4bea69', + '34ac80', + 'eed811', + '62616d', + 'ff638d', + '8bc0c5', + 'c4da53', + '000000', + 'f3322c', + 'ffae1a', + 'ffc110', + '505a5c', + 'ffef16', + 'fff671', + 'fff449', + 'db8323', + 'df2c39', + 'f938d8', + '5c25fb', + '2a86fd', + '45faff', + '38dd56', + 'ff3a0e', + 'd32a09', + '903707', + '6e3206', + '552e05', + 'e8705b', + 'f38b7c', + 'e4a499', + '667af9', + '648df9', + '7cc4f2', + '97f2fb', + 'a3efd0', + '87e4d9', + '71bde4', + 'ff1a0b', + 'f78a18', + '2b83f6', + 'd62149', + '834398', + 'ffc925', + 'd9391f', + 'bd2d24', + 'ff7216', + '254efb', + 'e5e5de', + '00a556', + 'c5030e', + 'abf131', + 'fb4694', + 'e7a32c', + 'fff0ee', + '009c59', + '0385eb', + '00499c', + 'e11833', + '26b1f3', + 'fff0be', + 'd8dadf', + 'd7d3cd', + '1929f4', + 'eab118', + '0b5027', + 'f9f5cb', + 'cfc9b8', + 'feb9d5', + 'f8d689', + '5d6061', + '76858b', + '757576', + 'ff0e0e', + '0adc4d', + 'fdf8ff', + '70e890', + 'f7913d', + 'ff1ad2', + 'ff82ad', + '535a15', + 'fa6fe2', + 'ffe939', + 'ab36be', + 'adc8cc', + '604666', + 'f20422', + 'abaaa8', + '4b65f7', + 'a19c9a', + '58565c', + 'da42cb', + '027c92', + 'cec189', + '909b0e', + '74580d', + '027ee6', + 'b2958d', + 'efad81', + '7d635e', + 'eff2fa', + '6f597a', + 'd4b7b2', + 'd18687', + 'cd916d', + '6b3f39', + '4d271b', + '85634f', + 'f9f4e6', + 'f8ddb0', + 'b92b3c', + 'd08b11', + '257ced', + 'a3baed', + '5fd4fb', + 'c16710', + 'a28ef4', + '3a085b', + '67b1e3', + '1e3445', + 'ffd067', + '962236', + '769ca9', + '5a6b7b', + '7e5243', + 'a86f60', + '8f785e', + 'cc0595', + '42ffb0', + 'd56333', + 'b8ced2', + 'b91b43', + 'f39713', + 'e8e8e2', + 'ec5b43', + '235476', + 'b2a8a5', + 'd6c3be', + '49b38b', + 'fccf25', + 'f59b34', + '375dfc', + '99e6de', + '27a463', + '554543', + 'b19e00', + 'd4a015', + '9f4b27', + 'f9e8dd', + '6b7212', + '9d8e6e', + '4243f8', + 'fa5e20', + 'f82905', + '555353', + '876f69', + '410d66', + '552d1d', + 'f71248', + 'fee3f3', + 'c16923', + '2b2834', + '0079fc', + 'd31e14', + 'f83001', + '8dd122', + 'fffdf4', + 'ffa21e', + 'e4afa3', + 'fbc311', + 'aa940c', + 'eedc00', + 'fff006', + '9cb4b8', + 'a38654', + 'ae6c0a', + '2bb26b', + 'e2c8c0', + 'f89865', + 'f86100', + 'dcd8d3', + '049d43', + 'd0aea9', + 'f39d44', + 'eeb78c', + 'f9f5e9', + '5d3500', + 'c3a199', + 'aaa6a4', + 'caa26a', + 'fde7f5', + 'fdf008', + 'fdcef2', + 'f681e6', + '018146', + 'd19a54', + '9eb5e1', + 'f5fcff', + '3f9323', + '00fcff', + '4a5358', + 'fbc800', + 'd596a6', + 'ffb913', + 'e9ba12', + '767c0e', + 'f9f6d1', + 'd29607', + 'f8ce47', + '395ed1', + 'ffc5f0', + 'cbc1bc', + 'd4cfc0' + ]; +} diff --git a/packages/nouns-contracts/test/foundry/helpers/DeployUtils.sol b/packages/nouns-contracts/test/foundry/helpers/DeployUtils.sol new file mode 100644 index 0000000000..783c0962e4 --- /dev/null +++ b/packages/nouns-contracts/test/foundry/helpers/DeployUtils.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.6; + +import 'forge-std/Test.sol'; +import { DescriptorHelpers } from './DescriptorHelpers.sol'; +import { NounsDescriptorV2 } from '../../../contracts/NounsDescriptorV2.sol'; +import { SVGRenderer } from '../../../contracts/SVGRenderer.sol'; +import { NounsArt } from '../../../contracts/NounsArt.sol'; +import { NounsDAOExecutor } from '../../../contracts/governance/NounsDAOExecutor.sol'; +import { NounsDAOLogicV1 } from '../../../contracts/governance/NounsDAOLogicV1.sol'; +import { IProxyRegistry } from '../../../contracts/external/opensea/IProxyRegistry.sol'; +import { NounsDescriptor } from '../../../contracts/NounsDescriptor.sol'; +import { NounsSeeder } from '../../../contracts/NounsSeeder.sol'; +import { NounsToken } from '../../../contracts/NounsToken.sol'; +import { NounsDAOProxy } from '../../../contracts/governance/NounsDAOProxy.sol'; +import { Inflator } from '../../../contracts/Inflator.sol'; + +abstract contract DeployUtils is Test, DescriptorHelpers { + uint256 constant TIMELOCK_DELAY = 2 days; + uint256 constant VOTING_PERIOD = 5_760; // About 24 hours + uint256 constant VOTING_DELAY = 1; + uint256 constant PROPOSAL_THRESHOLD = 1; + uint256 constant QUORUM_VOTES_BPS = 2000; + + function _deployAndPopulateV2() internal returns (NounsDescriptorV2) { + NounsDescriptorV2 descriptorV2 = _deployDescriptorV2(); + _populateDescriptorV2(descriptorV2); + return descriptorV2; + } + + function _deployDescriptorV2() internal returns (NounsDescriptorV2) { + SVGRenderer renderer = new SVGRenderer(); + Inflator inflator = new Inflator(); + NounsDescriptorV2 descriptorV2 = new NounsDescriptorV2(NounsArt(address(0)), renderer); + NounsArt art = new NounsArt(address(descriptorV2), inflator); + descriptorV2.setArt(art); + return descriptorV2; + } + + function _deployTokenAndDAOAndPopulateDescriptor( + address noundersDAO, + address vetoer, + address minter + ) internal returns (address, address) { + IProxyRegistry proxyRegistry = IProxyRegistry(address(3)); + + NounsDAOExecutor timelock = new NounsDAOExecutor(address(1), TIMELOCK_DELAY); + NounsDescriptor descriptor = new NounsDescriptor(); + NounsToken nounsToken = new NounsToken(noundersDAO, minter, descriptor, new NounsSeeder(), proxyRegistry); + NounsDAOProxy proxy = new NounsDAOProxy( + address(timelock), + address(nounsToken), + vetoer, + address(timelock), + address(new NounsDAOLogicV1()), + VOTING_PERIOD, + VOTING_DELAY, + PROPOSAL_THRESHOLD, + QUORUM_VOTES_BPS + ); + + vm.prank(address(timelock)); + timelock.setPendingAdmin(address(proxy)); + vm.prank(address(proxy)); + timelock.acceptAdmin(); + + nounsToken.transferOwnership(address(timelock)); + + _populateDescriptor(descriptor); + + return (address(nounsToken), address(proxy)); + } +} diff --git a/packages/nouns-contracts/test/foundry/helpers/DescriptorHelpers.sol b/packages/nouns-contracts/test/foundry/helpers/DescriptorHelpers.sol new file mode 100644 index 0000000000..a4436eb28d --- /dev/null +++ b/packages/nouns-contracts/test/foundry/helpers/DescriptorHelpers.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.6; + +import 'forge-std/Test.sol'; +import { NounsDescriptor } from '../../../contracts/NounsDescriptor.sol'; +import { NounsDescriptorV2 } from '../../../contracts/NounsDescriptorV2.sol'; +import { Constants } from './Constants.sol'; + +abstract contract DescriptorHelpers is Test, Constants { + function _populateDescriptor(NounsDescriptor descriptor) internal { + // created with `npx hardhat descriptor-v1-export-abi` + string memory filename = './test/foundry/files/descriptor_v1/image-data.abi'; + bytes memory content = readFile(filename); + ( + string[] memory bgcolors, + string[] memory palette, + bytes[] memory bodies, + bytes[] memory accessories, + bytes[] memory heads, + bytes[] memory glasses + ) = abi.decode(content, (string[], string[], bytes[], bytes[], bytes[], bytes[])); + + descriptor.addManyBackgrounds(bgcolors); + descriptor.addManyColorsToPalette(0, palette); + descriptor.addManyBodies(bodies); + descriptor.addManyAccessories(accessories); + descriptor.addManyHeads(heads); + descriptor.addManyGlasses(glasses); + } + + function _populateDescriptorV2(NounsDescriptorV2 descriptor) internal { + // created with `npx hardhat descriptor-art-to-console` + (bytes memory palette, string[] memory backgrounds) = abi.decode( + readFile('./test/foundry/files/descriptor_v2/paletteAndBackgrounds.abi'), + (bytes, string[]) + ); + descriptor.setPalette(0, palette); + descriptor.addManyBackgrounds(backgrounds); + + (bytes memory bodies, uint80 bodiesLength, uint16 bodiesCount) = abi.decode( + readFile('./test/foundry/files/descriptor_v2/bodiesPage.abi'), + (bytes, uint80, uint16) + ); + descriptor.addBodies(bodies, bodiesLength, bodiesCount); + + (bytes memory heads, uint80 headsLength, uint16 headsCount) = abi.decode( + readFile('./test/foundry/files/descriptor_v2/headsPage.abi'), + (bytes, uint80, uint16) + ); + descriptor.addHeads(heads, headsLength, headsCount); + + (bytes memory accessories, uint80 accessoriesLength, uint16 accessoriesCount) = abi.decode( + readFile('./test/foundry/files/descriptor_v2/accessoriesPage.abi'), + (bytes, uint80, uint16) + ); + descriptor.addAccessories(accessories, accessoriesLength, accessoriesCount); + + (bytes memory glasses, uint80 glassesLength, uint16 glassesCount) = abi.decode( + readFile('./test/foundry/files/descriptor_v2/glassesPage.abi'), + (bytes, uint80, uint16) + ); + descriptor.addGlasses(glasses, glassesLength, glassesCount); + } + + function readFile(string memory filepath) internal returns (bytes memory output) { + string[] memory inputs = new string[](2); + inputs[0] = 'cat'; + inputs[1] = filepath; + output = vm.ffi(inputs); + } + + function getGlassesPage() + public + returns ( + bytes memory glasses, + uint80 glassesLength, + uint16 glassesCount + ) + { + return abi.decode(readFile('./test/foundry/files/descriptor_v2/glassesPage.abi'), (bytes, uint80, uint16)); + } +} diff --git a/packages/nouns-contracts/test/governance/NounsDAO/castVote.test.ts b/packages/nouns-contracts/test/governance/NounsDAO/castVote.test.ts index 0a9e7f64d7..2ad0a98903 100644 --- a/packages/nouns-contracts/test/governance/NounsDAO/castVote.test.ts +++ b/packages/nouns-contracts/test/governance/NounsDAO/castVote.test.ts @@ -11,7 +11,7 @@ import { getSigners, TestSigners, setTotalSupply, - populateDescriptor, + populateDescriptorV2, } from '../../utils'; import { mineBlock, address, encodeParameters } from '../../utils'; @@ -19,7 +19,7 @@ import { mineBlock, address, encodeParameters } from '../../utils'; import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { NounsToken, - NounsDescriptor__factory as NounsDescriptorFactory, + NounsDescriptorV2__factory as NounsDescriptorV2Factory, NounsDAOLogicV1Harness, NounsDAOLogicV1Harness__factory as NounsDaoLogicV1HarnessFactory, NounsDAOProxy__factory as NounsDaoProxyFactory, @@ -78,8 +78,8 @@ async function reset() { } token = await deployNounsToken(signers.deployer); - await populateDescriptor( - NounsDescriptorFactory.connect(await token.descriptor(), signers.deployer), + await populateDescriptorV2( + NounsDescriptorV2Factory.connect(await token.descriptor(), signers.deployer), ); await setTotalSupply(token, 10); diff --git a/packages/nouns-contracts/test/governance/NounsDAO/inflationHandling.test.ts b/packages/nouns-contracts/test/governance/NounsDAO/inflationHandling.test.ts index d17306d30c..92d00e843c 100644 --- a/packages/nouns-contracts/test/governance/NounsDAO/inflationHandling.test.ts +++ b/packages/nouns-contracts/test/governance/NounsDAO/inflationHandling.test.ts @@ -7,11 +7,11 @@ const { ethers } = hardhat; import { BigNumber as EthersBN } from 'ethers'; import { - deployNounsToken, getSigners, TestSigners, setTotalSupply, - populateDescriptor, + populateDescriptorV2, + deployGovAndToken, } from '../../utils'; import { mineBlock, address, encodeParameters, advanceBlocks } from '../../utils'; @@ -29,51 +29,6 @@ import { chai.use(solidity); const { expect } = chai; -async function reset(): Promise { - // nonce 0: Deploy NounsDAOExecutor - // nonce 1: Deploy NounsDAOLogicV1 - // nonce 2: Deploy nftDescriptorLibraryFactory - // nonce 3: Deploy NounsDescriptor - // nonce 4: Deploy NounsSeeder - // nonce 5: Deploy NounsToken - // nonce 6: Deploy NounsDAOProxy - // nonce 7+: populate Descriptor - - const govDelegatorAddress = ethers.utils.getContractAddress({ - from: deployer.address, - nonce: (await deployer.getTransactionCount()) + 6, - }); - - // Deploy NounsDAOExecutor with pre-computed Delegator address - const { address: timelockAddress } = await new NounsDaoExecutorFactory(deployer).deploy( - govDelegatorAddress, - timelockDelay, - ); - - // Deploy Delegate - const { address: govDelegateAddress } = await new NounsDaoLogicV1Factory(deployer).deploy(); - // Deploy Nouns token - token = await deployNounsToken(deployer); - - // Deploy Delegator - await new NounsDaoProxyFactory(deployer).deploy( - timelockAddress, - token.address, - address(0), - timelockAddress, - govDelegateAddress, - 5760, - 1, - proposalThresholdBPS, - quorumVotesBPS, - ); - - // Cast Delegator as Delegate - gov = NounsDaoLogicV1Factory.connect(govDelegatorAddress, deployer); - - await populateDescriptor(NounsDescriptorFactory.connect(await token.descriptor(), deployer)); -} - async function propose(proposer: SignerWithAddress) { targets = [account0.address]; values = ['0']; @@ -116,7 +71,12 @@ describe('NounsDAO#inflationHandling', () => { signatures = ['getBalanceOf(address)']; callDatas = [encodeParameters(['address'], [account0.address])]; - await reset(); + ({ token, gov } = await deployGovAndToken( + deployer, + timelockDelay, + proposalThresholdBPS, + quorumVotesBPS, + )); }); it('set parameters correctly', async () => { diff --git a/packages/nouns-contracts/test/governance/NounsDAO/state.test.ts b/packages/nouns-contracts/test/governance/NounsDAO/state.test.ts index 6db6e05149..5148848a2e 100644 --- a/packages/nouns-contracts/test/governance/NounsDAO/state.test.ts +++ b/packages/nouns-contracts/test/governance/NounsDAO/state.test.ts @@ -11,7 +11,7 @@ import { getSigners, TestSigners, setTotalSupply, - populateDescriptor, + populateDescriptorV2, } from '../../utils'; import { @@ -27,7 +27,7 @@ import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { NounsToken, - NounsDescriptor__factory as NounsDescriptorFactory, + NounsDescriptorV2__factory as NounsDescriptorV2Factory, NounsDAOExecutorHarness, NounsDAOExecutorHarness__factory as NounsDaoExecutorHarnessFactory, NounsDAOImmutable, @@ -121,8 +121,8 @@ describe('NounsDAO#state/1', () => { token = await deployNounsToken(signers.deployer); - await populateDescriptor( - NounsDescriptorFactory.connect(await token.descriptor(), signers.deployer), + await populateDescriptorV2( + NounsDescriptorV2Factory.connect(await token.descriptor(), signers.deployer), ); }); diff --git a/packages/nouns-contracts/test/governance/NounsDAO/vetoing.test.ts b/packages/nouns-contracts/test/governance/NounsDAO/vetoing.test.ts index 77d4bba3a5..53aa85d647 100644 --- a/packages/nouns-contracts/test/governance/NounsDAO/vetoing.test.ts +++ b/packages/nouns-contracts/test/governance/NounsDAO/vetoing.test.ts @@ -7,11 +7,11 @@ const { ethers } = hardhat; import { BigNumber as EthersBN } from 'ethers'; import { - deployNounsToken, getSigners, TestSigners, setTotalSupply, - populateDescriptor, + populateDescriptorV2, + deployGovAndToken, } from '../../utils'; import { @@ -59,49 +59,15 @@ async function reset(): Promise { return; } - // nonce 0: Deploy NounsDAOExecutor - // nonce 1: Deploy NounsDAOLogicV1 - // nonce 2: Deploy nftDescriptorLibraryFactory - // nonce 3: Deploy NounsDescriptor - // nonce 4: Deploy NounsSeeder - // nonce 5: Deploy NounsToken - // nonce 6: Deploy NounsDAOProxy - // nonce 7+: populate Descriptor - vetoer = deployer; - const govDelegatorAddress = ethers.utils.getContractAddress({ - from: deployer.address, - nonce: (await deployer.getTransactionCount()) + 6, - }); - - // Deploy NounsDAOExecutor with pre-computed Delegator address - timelock = await new NounsDaoExecutorFactory(deployer).deploy(govDelegatorAddress, timelockDelay); - const timelockAddress = timelock.address; - - // Deploy Delegate - const { address: govDelegateAddress } = await new NounsDaoLogicV1Factory(deployer).deploy(); - - // Deploy Nouns token - token = await deployNounsToken(deployer); - - // Deploy Delegator - await new NounsDaoProxyFactory(deployer).deploy( - timelockAddress, - token.address, - vetoer.address, - timelockAddress, - govDelegateAddress, - 5760, - 1, + ({ token, gov, timelock } = await deployGovAndToken( + deployer, + timelockDelay, proposalThresholdBPS, quorumVotesBPS, - ); - - // Cast Delegator as Delegate - gov = NounsDaoLogicV1Factory.connect(govDelegatorAddress, deployer); - - await populateDescriptor(NounsDescriptorFactory.connect(await token.descriptor(), deployer)); + vetoer.address, + )); snapshotId = await ethers.provider.send('evm_snapshot', []); } diff --git a/packages/nouns-contracts/test/governance/nounsGovernance.test.ts b/packages/nouns-contracts/test/governance/nounsGovernance.test.ts index f984414638..d571c76724 100644 --- a/packages/nouns-contracts/test/governance/nounsGovernance.test.ts +++ b/packages/nouns-contracts/test/governance/nounsGovernance.test.ts @@ -1,14 +1,17 @@ import chai from 'chai'; import { solidity } from 'ethereum-waffle'; import { ethers } from 'hardhat'; -import { NounsToken, NounsDescriptor__factory as NounsDescriptorFactory } from '../../typechain'; +import { + NounsToken, + NounsDescriptorV2__factory as NounsDescriptorV2Factory, +} from '../../typechain'; import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { deployNounsToken, getSigners, TestSigners, setTotalSupply, - populateDescriptor, + populateDescriptorV2, minerStart, minerStop, mineBlock, @@ -59,8 +62,8 @@ describe('Nouns Governance', () => { token = await deployNounsToken(signers.deployer); - await populateDescriptor( - NounsDescriptorFactory.connect(await token.descriptor(), signers.deployer), + await populateDescriptorV2( + NounsDescriptorV2Factory.connect(await token.descriptor(), signers.deployer), ); domain = Domain('Nouns', token.address, await chainId()); diff --git a/packages/nouns-contracts/test/nouns.test.ts b/packages/nouns-contracts/test/nouns.test.ts index 36342cae71..07424572e2 100644 --- a/packages/nouns-contracts/test/nouns.test.ts +++ b/packages/nouns-contracts/test/nouns.test.ts @@ -2,8 +2,8 @@ import chai from 'chai'; import { ethers } from 'hardhat'; import { BigNumber as EthersBN, constants } from 'ethers'; import { solidity } from 'ethereum-waffle'; -import { NounsDescriptor__factory as NounsDescriptorFactory, NounsToken } from '../typechain'; -import { deployNounsToken, populateDescriptor } from './utils'; +import { NounsDescriptorV2__factory as NounsDescriptorV2Factory, NounsToken } from '../typechain'; +import { deployNounsToken, populateDescriptorV2 } from './utils'; import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; chai.use(solidity); @@ -21,7 +21,7 @@ describe('NounsToken', () => { const descriptor = await nounsToken.descriptor(); - await populateDescriptor(NounsDescriptorFactory.connect(descriptor, deployer)); + await populateDescriptorV2(NounsDescriptorV2Factory.connect(descriptor, deployer)); }); beforeEach(async () => { diff --git a/packages/nouns-contracts/test/utils.ts b/packages/nouns-contracts/test/utils.ts index 3cf713ec25..d34a3565b1 100644 --- a/packages/nouns-contracts/test/utils.ts +++ b/packages/nouns-contracts/test/utils.ts @@ -3,15 +3,27 @@ import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { NounsDescriptor, NounsDescriptor__factory as NounsDescriptorFactory, + NounsDescriptorV2, + NounsDescriptorV2__factory as NounsDescriptorV2Factory, NounsToken, NounsToken__factory as NounsTokenFactory, NounsSeeder, NounsSeeder__factory as NounsSeederFactory, WETH, WETH__factory as WethFactory, + NounsArt__factory as NounsArtFactory, + SVGRenderer__factory as SVGRendererFactory, + NounsDAOExecutor__factory as NounsDaoExecutorFactory, + NounsDAOLogicV1__factory as NounsDaoLogicV1Factory, + NounsDAOProxy__factory as NounsDaoProxyFactory, + NounsDAOLogicV1, + NounsDAOExecutor, + Inflator__factory, } from '../typechain'; -import ImageData from '../files/image-data.json'; +import ImageData from '../files/image-data-v1.json'; +import ImageDataV2 from '../files/image-data-v2.json'; import { Block } from '@ethersproject/abstract-provider'; +import { deflateRawSync } from 'zlib'; import { chunkArray } from '../utils'; export type TestSigners = { @@ -47,6 +59,33 @@ export const deployNounsDescriptor = async ( return nounsDescriptorFactory.deploy(); }; +export const deployNounsDescriptorV2 = async ( + deployer?: SignerWithAddress, +): Promise => { + const signer = deployer || (await getSigners()).deployer; + const nftDescriptorLibraryFactory = await ethers.getContractFactory('NFTDescriptorV2', signer); + const nftDescriptorLibrary = await nftDescriptorLibraryFactory.deploy(); + const nounsDescriptorFactory = new NounsDescriptorV2Factory( + { + 'contracts/libs/NFTDescriptorV2.sol:NFTDescriptorV2': nftDescriptorLibrary.address, + }, + signer, + ); + + const renderer = await new SVGRendererFactory(signer).deploy(); + const descriptor = await nounsDescriptorFactory.deploy( + ethers.constants.AddressZero, + renderer.address, + ); + + const inflator = await new Inflator__factory(signer).deploy(); + + const art = await new NounsArtFactory(signer).deploy(descriptor.address, inflator.address); + await descriptor.setArt(art.address); + + return descriptor; +}; + export const deployNounsSeeder = async (deployer?: SignerWithAddress): Promise => { const factory = new NounsSeederFactory(deployer || (await getSigners()).deployer); @@ -67,7 +106,7 @@ export const deployNounsToken = async ( return factory.deploy( noundersDAO || signer.address, minter || signer.address, - descriptor || (await deployNounsDescriptor(signer)).address, + descriptor || (await deployNounsDescriptorV2(signer)).address, seeder || (await deployNounsSeeder(signer)).address, proxyRegistryAddress || address(0), ); @@ -96,6 +135,96 @@ export const populateDescriptor = async (nounsDescriptor: NounsDescriptor): Prom ]); }; +export const populateDescriptorV2 = async (nounsDescriptor: NounsDescriptorV2): Promise => { + const { bgcolors, palette, images } = ImageDataV2; + const { bodies, accessories, heads, glasses } = images; + + const { + encodedCompressed: bodiesCompressed, + originalLength: bodiesLength, + itemCount: bodiesCount, + } = dataToDescriptorInput(bodies.map(({ data }) => data)); + const { + encodedCompressed: accessoriesCompressed, + originalLength: accessoriesLength, + itemCount: accessoriesCount, + } = dataToDescriptorInput(accessories.map(({ data }) => data)); + const { + encodedCompressed: headsCompressed, + originalLength: headsLength, + itemCount: headsCount, + } = dataToDescriptorInput(heads.map(({ data }) => data)); + const { + encodedCompressed: glassesCompressed, + originalLength: glassesLength, + itemCount: glassesCount, + } = dataToDescriptorInput(glasses.map(({ data }) => data)); + + await nounsDescriptor.addManyBackgrounds(bgcolors); + await nounsDescriptor.setPalette(0, `0x000000${palette.join('')}`); + await nounsDescriptor.addBodies(bodiesCompressed, bodiesLength, bodiesCount); + await nounsDescriptor.addAccessories(accessoriesCompressed, accessoriesLength, accessoriesCount); + await nounsDescriptor.addHeads(headsCompressed, headsLength, headsCount); + await nounsDescriptor.addGlasses(glassesCompressed, glassesLength, glassesCount); +}; + +export const deployGovAndToken = async ( + deployer: SignerWithAddress, + timelockDelay: number, + proposalThresholdBPS: number, + quorumVotesBPS: number, + vetoer?: string, +): Promise<{ token: NounsToken; gov: NounsDAOLogicV1; timelock: NounsDAOExecutor }> => { + // nonce 0: Deploy NounsDAOExecutor + // nonce 1: Deploy NounsDAOLogicV1 + // nonce 2: Deploy nftDescriptorLibraryFactory + // nonce 3: Deploy SVGRenderer + // nonce 4: Deploy NounsDescriptor + // nonce 5: Deploy Inflator + // nonce 6: Deploy NounsArt + // nonce 7: NounsDescriptor.setArt + // nonce 8: Deploy NounsSeeder + // nonce 9: Deploy NounsToken + // nonce 10: Deploy NounsDAOProxy + // nonce 11+: populate Descriptor + + const govDelegatorAddress = ethers.utils.getContractAddress({ + from: deployer.address, + nonce: (await deployer.getTransactionCount()) + 10, + }); + + // Deploy NounsDAOExecutor with pre-computed Delegator address + const timelock = await new NounsDaoExecutorFactory(deployer).deploy( + govDelegatorAddress, + timelockDelay, + ); + + // Deploy Delegate + const { address: govDelegateAddress } = await new NounsDaoLogicV1Factory(deployer).deploy(); + // Deploy Nouns token + const token = await deployNounsToken(deployer); + + // Deploy Delegator + await new NounsDaoProxyFactory(deployer).deploy( + timelock.address, + token.address, + vetoer || address(0), + timelock.address, + govDelegateAddress, + 5760, + 1, + proposalThresholdBPS, + quorumVotesBPS, + ); + + // Cast Delegator as Delegate + const gov = NounsDaoLogicV1Factory.connect(govDelegatorAddress, deployer); + + await populateDescriptorV2(NounsDescriptorV2Factory.connect(await token.descriptor(), deployer)); + + return { token, gov, timelock }; +}; + /** * Return a function used to mint `amount` Nouns on the provided `token` * @param token The Nouns ERC721 token @@ -211,3 +340,23 @@ export const chainId = async (): Promise => { export const address = (n: number): string => { return `0x${n.toString(16).padStart(40, '0')}`; }; + +function dataToDescriptorInput(data: string[]): { + encodedCompressed: string; + originalLength: number; + itemCount: number; +} { + const abiEncoded = ethers.utils.defaultAbiCoder.encode(['bytes[]'], [data]); + const encodedCompressed = `0x${deflateRawSync( + Buffer.from(abiEncoded.substring(2), 'hex'), + ).toString('hex')}`; + + const originalLength = abiEncoded.substring(2).length / 2; + const itemCount = data.length; + + return { + encodedCompressed, + originalLength, + itemCount, + }; +} diff --git a/packages/nouns-contracts/test/write-to-file.sh b/packages/nouns-contracts/test/write-to-file.sh new file mode 100755 index 0000000000..ceb7c3fa29 --- /dev/null +++ b/packages/nouns-contracts/test/write-to-file.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +set -e + +echo $2 >> $1 + +# sleep 1 + +echo "0x" + +exit 0 diff --git a/packages/nouns-sdk/package.json b/packages/nouns-sdk/package.json index 5b0128820b..2ab4c42ea5 100644 --- a/packages/nouns-sdk/package.json +++ b/packages/nouns-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@nouns/sdk", - "version": "0.1.6", + "version": "0.2.0", "description": "Useful tooling for interacting with the Nouns protocol", "author": "Nounders", "homepage": "https://nouns.wtf", diff --git a/packages/nouns-sdk/src/contract/addresses.json b/packages/nouns-sdk/src/contract/addresses.json index 188d23a82e..36f0a1500e 100644 --- a/packages/nouns-sdk/src/contract/addresses.json +++ b/packages/nouns-sdk/src/contract/addresses.json @@ -12,27 +12,27 @@ "nounsDAOLogicV1": "0xa43aFE317985726E4e194eb061Af77fbCb43F944" }, "4": { - "nounsToken": "0x632f34c3aee991b10D4b421Bc05413a03d7a37eB", - "nounsSeeder": "0xA98A1b1Cc4f5746A753167BAf8e0C26AcBe42F2E", - "nounsDescriptor": "0x53cB482c73655D2287AE3282AD1395F82e6a402F", - "nftDescriptor": "0x1F28f148ef5f9BD182cCEfeAD4240A505C54dc9B", - "nounsAuctionHouse": "0xfAB74e535409A3ad1F7C2858dd2E5Da1eAAc6cE7", - "nounsAuctionHouseProxy": "0x7cb0384b923280269b3BD85f0a7fEaB776588382", - "nounsAuctionHouseProxyAdmin": "0x04d0e5a8ADB5076C098f49F39B01A774c313597d", - "nounsDaoExecutor": "0x6F3940820288855418B7ef8E33a2eC23d9DeD59B", - "nounsDAOProxy": "0xd1C753D9A23eb5c57e0d023e993B9bd4F5086b04", - "nounsDAOLogicV1": "0xdF05F2D3276F3F3fA00296702e4cf7190B78F6F9" + "nounsToken": "0x59D3356299432c58c80603316786868479753C23", + "nounsSeeder": "0x06f3FbB5E5D7e75Cb5ac3B76945668A466072889", + "nounsDescriptor": "0x99a06F809bFac2934252CeD9d081f656c96a9dEd", + "nftDescriptor": "0x54E9F30BCbA93ef7B577A78E1a05E273Ef96a2c0", + "nounsAuctionHouse": "0x88A97D11E4f5D04Cd59d872e4b186FCC3cAF612d", + "nounsAuctionHouseProxy": "0xDF87852c37D1774100526F92C89608C395785C5d", + "nounsAuctionHouseProxyAdmin": "0xE2c109430870A931473522b84d8E1c655A0E5de2", + "nounsDaoExecutor": "0x8B940C89fea4764D44846Fd6fDBd63d154A45C1f", + "nounsDAOProxy": "0x8c6B7F6F091bb3Ffb086DBa4d1b465E0D896a05e", + "nounsDAOLogicV1": "0x030082246E7381eadeF5cc663Aae4f915Df2F8e2" }, "31337": { - "nounsToken": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", - "nounsSeeder": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", - "nounsDescriptor": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "nftDescriptor": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", - "nounsAuctionHouse": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707", - "nounsAuctionHouseProxy": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", - "nounsAuctionHouseProxyAdmin": "0x0165878A594ca255338adfa4d48449f69242Eb8F", - "nounsDaoExecutor": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", - "nounsDAOProxy": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788", - "nounsDAOLogicV1": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318" + "nounsToken": "0x0165878a594ca255338adfa4d48449f69242eb8f", + "nounsSeeder": "0x5fc8d32690cc91d4c39d9d3abcbd16989f875707", + "nounsDescriptor": "0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9", + "nftDescriptor": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "nounsAuctionHouse": "0xa513e6e4b8f2a923d98304ec87f64353c4d5c853", + "nounsAuctionHouseProxy": "0x8a791620dd6260079bf849dc5567adc3f2fdc318", + "nounsAuctionHouseProxyAdmin": "0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6", + "nounsDaoExecutor": "0x610178da211fef7d417bc0e6fed39f05609ad788", + "nounsDAOProxy": "0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0", + "nounsDAOLogicV1": "0xb7f8bc63bbcad18155201308c8f3540b07f84f5e" } -} +} \ No newline at end of file diff --git a/packages/nouns-sdk/src/image/image.ts b/packages/nouns-sdk/src/image/image.ts index 5e01d1b4af..637ab5676d 100644 --- a/packages/nouns-sdk/src/image/image.ts +++ b/packages/nouns-sdk/src/image/image.ts @@ -1,79 +1,46 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -import { ImageBounds, ImageRow, ImageRows, Rect, RGBAColor } from './types'; +import { ImageBounds, RGBAColor } from './types'; import { rgbToHex, toPaddedHex } from './utils'; /** * A class used to convert an image into the following RLE format: * Palette Index, Bounds [Top (Y), Right (X), Bottom (Y), Left (X)] (4 Bytes), [Pixel Length (1 Byte), Color Index (1 Byte)][]. + * + * As opposed to the first encoding version, this supports multiline run-length encoding */ export class Image { private _width: number; private _height: number; - private _rows: ImageRows = {}; private _bounds: ImageBounds = { top: 0, bottom: 0, left: 0, right: 0 }; - private _rle: string | undefined; + public tuples: number[][] = []; + private _getRgbaAt: (x: number, y: number) => RGBAColor; - /** - * The image's pixel width - */ - get width(): number { - return this._width; + constructor(width: number, height: number, getRgbaAt: (x: number, y: number) => RGBAColor) { + this._width = width; + this._height = height; + + this._getRgbaAt = getRgbaAt; } - /** - * The image's pixel height - */ get height(): number { return this._height; } - /** - * The number of rows to run-length encode - */ - get rows(): ImageRows { - return this._rows; + get width(): number { + return this._width; } - /** - * The bounds of the inner rect to run-length encode - */ get bounds(): ImageBounds { return this._bounds; } - constructor(width: number, height: number) { - this._width = width; - this._height = height; - } + public toRLE(colors: Map): string { + this._bounds = this.calcBounds(); - /** - * Convert an image to a run-length encoded string using the provided RGBA - * and color palette values. - * @param getRgbaAt A function used to fetch the RGBA values at specific x-y coordinates - * @param colors The color palette map - */ - public toRLE( - getRgbaAt: (x: number, y: number) => RGBAColor, - colors: Map, - ): string { - if (!this._rle) { - this._rle = this.encode(getRgbaAt, colors); - } - return this._rle; - } + const indexes: number[] = []; - /** - * Using the image pixel inforation, run-length encode an image. - * @param getRgbaAt A function used to fetch the RGBA values at specific x-y coordinates - * @param colors The color palette map - */ - private encode( - getRgbaAt: (x: number, y: number) => RGBAColor, - colors: Map, - ): string { - for (let y = 0; y < this._height; y++) { - for (let x = 0; x < this._width; x++) { - const { r, g, b, a } = getRgbaAt(x, y); + for (let y = this.bounds.top; y <= this.bounds.bottom; y++) { + for (let x = this.bounds.left; x < this.bounds.right; x++) { + const { r, g, b, a } = this._getRgbaAt(x, y); const hexColor = rgbToHex(r, g, b); // Insert the color if it does not yet exist @@ -82,160 +49,91 @@ export class Image { } // If alpha is 0, use 'transparent' index, otherwise get color index - const colorIndex = a === 0 ? 0 : colors.get(hexColor)!; - - this.appendPixelToRect(colorIndex, y); + indexes.push(a === 0 ? 0 : colors.get(hexColor)!); } - this.updateImageBounds(y); } - this.deleteEmptyRows(); - - // Set the left and right bounds. Return early if empty - const rowCount = Object.keys(this._rows).length; - if (rowCount) { - this._bounds.left = Math.min(...Object.values(this._rows).map(r => r.bounds.left)); - this._bounds.right = Math.max(...Object.values(this._rows).map(r => r.bounds.right)); - - // Exit early if image is empty - const [rect] = this._rows[0]?.rects || []; - if (rowCount === 1 && this.isEmptyRow(rect)) { - return '0x0000000000'; - } - } - - const encodedBounds = this.getEncodedBounds(this._bounds); - const encodedImage = Object.values(this._rows).reduce((result, row) => { - result += this.getEncodedRow(row, this._bounds); - return result; - }, encodedBounds); - - return encodedImage; + // [palette_index, top, right, bottom, left] + const metadata = [ + 0, + this.bounds.top, + this.bounds.right, + this.bounds.bottom, + this.bounds.left, + ].map(v => toPaddedHex(v)); + return `0x${metadata.join('')}${this.encode(indexes)}`; } /** - * Append a single pixel to a new or existing rect - * @param colorIndex The color array index - * @param y The current `y` coordinate + * Given a numeric array, return a string of padded hex run-length encoded values + * @param data The numeric array to run-length encode */ - private appendPixelToRect(colorIndex: number, y: number): void { - // Create the row if it does not exist yet - const { rects } = (this._rows[y] ||= { - rects: [], - bounds: { left: 0, right: 0 }, - }); - - // First pixel of line or different color than previous - if (!rects.length || rects[rects.length - 1].colorIndex !== colorIndex) { - rects.push({ length: 1, colorIndex }); - return; + private encode(data: number[]) { + const encoding: string[] = []; + let previous = data[0]; + let count = 1; + + for (let i = 1; i < data.length; i++) { + if (data[i] !== previous || count === 255) { + encoding.push(toPaddedHex(count), toPaddedHex(previous)); + this.tuples.push([count, previous]); + count = 1; + previous = data[i]; + } else { + count++; + } } - // Same color as the pixel to the left - rects[rects.length - 1].length++; + if (previous !== undefined) { + encoding.push(toPaddedHex(count), toPaddedHex(previous)); + } + return encoding.join(''); } - /** - * Update the bounds of the provided image - * @param y The current `y` coordinate - */ - private updateImageBounds(y: number): void { - const { rects } = this._rows[y]; - - // Shift top bound to `y` if row is not empty and top bound is 0 - if (!this.isEmptyRow(rects[0]) && this._bounds.top === 0) { - this._bounds.top = y; + calcBounds(): ImageBounds { + let bottom = this.height - 1; + while (bottom > 0 && this._isTransparentRow(bottom)) { + bottom--; } - if (this._bounds.top !== 0) { - // Set bottom bound to `y` if row is empty or we're on the last row. - // Otherwise, reset the bottom bound - if (this.isEmptyRow(rects[0])) { - if (this._bounds.bottom === 0) { - this._bounds.bottom = y - 1; - } - } else if (y === 31) { - this._bounds.bottom = y; - } else { - this._bounds.bottom = 0; - } + let top = 0; + while (top < bottom && this._isTransparentRow(top)) { + top++; } - this._rows[y].bounds = { - left: rects[0].length, - right: this._width - rects[rects.length - 1].length, - }; - } - - /** - * Delete all empty rows. That is, all rows above the top bound or - * below the lower bound - */ - private deleteEmptyRows(): void { - // Delete all rows above the top bound - for (let i = 0; i < this._bounds.top; i++) { - delete this._rows[i]; + let right = this.width - 1; + while (right >= 0 && this._isTransparentColumn(right)) { + right--; } - // Delete all rows below the bottom bound - for (let i = this._height - 1; i > this._bounds.bottom; i--) { - delete this._rows[i]; + let left = 0; + while (left < right && this._isTransparentColumn(left)) { + left++; } - } - /** - * Get the encoded part bounds string - * @param bounds The part bounds - */ - private getEncodedBounds(bounds: ImageBounds) { - const top = toPaddedHex(bounds.top, 2); - const right = toPaddedHex(bounds.right, 2); - const bottom = toPaddedHex(bounds.bottom, 2); - const left = toPaddedHex(bounds.left, 2); - return `0x00${top}${right}${bottom}${left}`; + return { + top: top, + bottom: bottom, + left: left, + right: right + 1, // right bound is calculated to be one pixel outside the content + }; } - /** - * Get a single row encoded as a hex string - * @param row The row data - * @param bounds The image bounds - */ - private getEncodedRow(row: ImageRow, bounds: ImageBounds) { - const rowBuffer = Buffer.from( - row.rects.flatMap(({ length, colorIndex }, i) => { - // Row only contains a single rect - if (i === 0 && i === row.rects.length - 1) { - return [bounds.right - bounds.left, colorIndex]; - } - - // Set left bound - if (i === 0) { - if (length > bounds.left) { - return [length - bounds.left, colorIndex]; - } else if (length === bounds.left) { - return []; - } - } - - // Set right bound - if (i === row.rects.length - 1) { - if (length > this._width - bounds.right) { - return [length - (this._width - bounds.right), colorIndex]; - } else if (length === this._width - bounds.right) { - return []; - } - } - return [length, colorIndex]; - }), - ); - return rowBuffer.toString('hex'); + private _isTransparentColumn(column: number) { + for (let row = 0; row < this.height; row++) { + if (this._getRgbaAt(column, row).a !== 0) { + return false; + } + } + return true; } - /** - * Determine if the provided rect fills the entire row and is transparent - * @param rect The rect to inspect - */ - private isEmptyRow(rect: Rect) { - return rect?.length === this._width && rect?.colorIndex === 0; + private _isTransparentRow(row: number) { + for (let column = 0; column < this.width; column++) { + if (this._getRgbaAt(column, row).a !== 0) { + return false; + } + } + return true; } } diff --git a/packages/nouns-sdk/src/image/png-collection-encoder.ts b/packages/nouns-sdk/src/image/png-collection-encoder.ts index fe4ddc93a8..4d84a4bd78 100644 --- a/packages/nouns-sdk/src/image/png-collection-encoder.ts +++ b/packages/nouns-sdk/src/image/png-collection-encoder.ts @@ -38,8 +38,8 @@ export class PNGCollectionEncoder implements IEncoder { * @param folder An optional containing folder name */ public encodeImage(name: string, png: PngImage, folder?: string): string { - const image = new Image(png.width, png.height); - const rle = image.toRLE((x, y) => png.rgbaAt(x, y), this._colors); + const image = new Image(png.width, png.height, png.rgbaAt); + const rle = image.toRLE(this._colors); this._images.set(name, rle); diff --git a/packages/nouns-sdk/src/image/svg-builder.ts b/packages/nouns-sdk/src/image/svg-builder.ts index 9509a98d06..e8796bba9d 100644 --- a/packages/nouns-sdk/src/image/svg-builder.ts +++ b/packages/nouns-sdk/src/image/svg-builder.ts @@ -4,7 +4,7 @@ import { DecodedImage } from './types'; * Decode the RLE image data into a format that's easier to consume in `buildSVG`. * @param image The RLE image data */ -const decodeImage = (image: string): DecodedImage => { +export const decodeImage = (image: string): DecodedImage => { const data = image.replace(/^0x/, ''); const paletteIndex = parseInt(data.substring(0, 2), 16); const bounds = { @@ -26,6 +26,15 @@ const decodeImage = (image: string): DecodedImage => { }; }; +/** + * @notice Given an x-coordinate, draw length, and right bound, return the draw + * length for a single SVG rectangle. + */ +const getRectLength = (currentX: number, drawLength: number, rightBound: number): number => { + const remainingPixelsInLine = rightBound - currentX; + return drawLength <= remainingPixelsInLine ? drawLength : remainingPixelsInLine; +}; + /** * Given RLE parts, palette colors, and a background color, build an SVG image. * @param parts The RLE part datas @@ -44,23 +53,29 @@ export const buildSVG = ( let currentX = bounds.left; let currentY = bounds.top; - rects.forEach(rect => { - const [length, colorIndex] = rect; + rects.forEach(draw => { + let [drawLength, colorIndex] = draw; const hexColor = paletteColors[colorIndex]; - // Do not push rect if transparent - if (colorIndex !== 0) { - svgRects.push( - ``, - ); - } + let length = getRectLength(currentX, drawLength, bounds.right); + while (length > 0) { + // Do not push rect if transparent + if (colorIndex !== 0) { + svgRects.push( + ``, + ); + } + + currentX += length; + if (currentX === bounds.right) { + currentX = bounds.left; + currentY++; + } - currentX += length; - if (currentX === bounds.right) { - currentX = bounds.left; - currentY++; + drawLength -= length; + length = getRectLength(currentX, drawLength, bounds.right); } }); result += svgRects.join(''); diff --git a/packages/nouns-sdk/test/image.test.ts b/packages/nouns-sdk/test/image.test.ts new file mode 100644 index 0000000000..47ab3c4ec6 --- /dev/null +++ b/packages/nouns-sdk/test/image.test.ts @@ -0,0 +1,170 @@ +import { expect } from 'chai'; +import { join } from 'path'; +import { Image } from '../src/image/image'; +import { Image as Image1 } from './image'; +import { readPngImage } from './lib'; +import { buildSVG, RGBAColor } from '../src'; +import { glob } from 'glob'; +import { decodeImage } from '../src/image/svg-builder'; + +async function encodeSingleLineRLE(filepath: string) { + const transparent: [string, number] = ['', 0]; + const colors: Map = new Map([transparent]); + const pngImage = await readPngImage(filepath); + const image = new Image1(pngImage.width, pngImage.height); + const rle = image.toRLE(pngImage.rgbaAt, colors); + return { rle, colors }; +} + +async function encodeMultiLineRLE(filepath: string) { + const transparent: [string, number] = ['', 0]; + const colors: Map = new Map([transparent]); + const pngImage = await readPngImage(filepath); + const image = new Image(pngImage.width, pngImage.height, pngImage.rgbaAt); + const rle = image.toRLE(colors); + return { rle, colors }; +} + +describe('Image', () => { + describe('Comparing single line RLE to multiline RLE encoding', async () => { + it('builds the same svg with both encoders', async () => { + const filepath = join(__dirname, `./lib/images/head-cone.png`); + const { rle: rle1, colors: colors1 } = await encodeSingleLineRLE(filepath); + const { rle: rle2, colors: colors2 } = await encodeMultiLineRLE(filepath); + + const svg1 = buildSVG([{ data: rle1 }], Array.from(colors1.keys()), 'ffffff'); + const svg2 = buildSVG([{ data: rle2 }], Array.from(colors2.keys()), 'ffffff'); + + expect(svg1).to.be.equal(svg2); + }); + + it('builds the same svg for all images', async () => { + const transparent: [string, number] = ['', 0]; + + const filepaths = glob.sync(join(__dirname, '../../nouns-assets/images/+(1|2|3|4)*/*.png')); + + for (const filepath of filepaths) { + const { rle: rle1, colors: colors1 } = await encodeSingleLineRLE(filepath); + const { rle: rle2, colors: colors2 } = await encodeMultiLineRLE(filepath); + + const svg1 = buildSVG([{ data: rle1 }], Array.from(colors1.keys()), 'ffffff'); + const svg2 = buildSVG([{ data: rle2 }], Array.from(colors2.keys()), 'ffffff'); + + expect(svg1).to.be.equal(svg2); + } + }); + + it('builds empty image correctly', async () => { + const { rle: rle2, colors: colors2 } = await encodeMultiLineRLE( + join(__dirname, './lib/images/empty.png'), + ); + const svg2 = buildSVG([{ data: rle2 }], Array.from(colors2.keys()), 'ffffff'); + expect(svg2).to.eq( + '', + ); + }); + }); + + describe('Multiline RLE encoding', async () => { + const R: RGBAColor = { r: 255, g: 0, b: 0, a: 255 }; + const B: RGBAColor = { r: 0, g: 0, b: 255, a: 255 }; + const T: RGBAColor = { r: 0, g: 0, b: 0, a: 0 }; + const transparent: [string, number] = ['', 0]; + let colors: Map; + + beforeEach(async () => { + colors = new Map([transparent]); + }); + + const encodePixels = (pixels: RGBAColor[][], colors: Map) => { + const rle = new Image(pixels[0].length, pixels.length, (x, y) => pixels[y][x]).toRLE(colors); + const decoded = decodeImage(rle); + const colorsArray = Array.from(colors.keys()); + return { decoded, colorsArray }; + }; + + it('encodes single pixel', async () => { + const pixels: RGBAColor[][] = [[R]]; + + const { decoded, colorsArray } = encodePixels(pixels, colors); + + expect(decoded.bounds).to.eql({ top: 0, bottom: 0, left: 0, right: 1 }); + expect(decoded.rects).to.eql([[1, 1]]); + expect(colorsArray[1]).to.eq('ff0000'); + }); + + it('encodes repeating pixel', async () => { + const pixels: RGBAColor[][] = [[R, R, R, R]]; + + const { decoded, colorsArray } = encodePixels(pixels, colors); + + expect(decoded.bounds).to.eql({ top: 0, bottom: 0, left: 0, right: 4 }); + expect(decoded.rects).to.eql([[4, 1]]); + expect(colorsArray[1]).to.eq('ff0000'); + }); + + it('encodes 2 colors', async () => { + const pixels: RGBAColor[][] = [[B, B, B, R, R]]; + + const { decoded, colorsArray } = encodePixels(pixels, colors); + + expect(decoded.bounds).to.eql({ top: 0, bottom: 0, left: 0, right: 5 }); + expect(decoded.rects).to.eql([ + [3, 1], + [2, 2], + ]); + expect(colorsArray[1]).to.eq('0000ff'); + expect(colorsArray[2]).to.eq('ff0000'); + }); + + it('skips transparent rows & columns when calculating bounds', async () => { + const pixels: RGBAColor[][] = [ + [T, T, T, T, T], + [T, T, T, T, T], + [T, T, R, T, T], + [T, T, R, R, T], + [T, T, T, T, T], + ]; + + const { decoded, colorsArray } = encodePixels(pixels, colors); + + expect(decoded.bounds).to.eql({ top: 2, bottom: 3, left: 2, right: 4 }); + expect(decoded.rects).to.eql([ + [1, 1], + [1, 0], + [2, 1], + ]); + }); + + it('encodes RLE over multiple lines', async () => { + const pixels: RGBAColor[][] = [ + [R, R, R, R], + [R, R, B, B], + ]; + + const { decoded, colorsArray } = encodePixels(pixels, colors); + + expect(decoded.bounds).to.eql({ top: 0, bottom: 1, left: 0, right: 4 }); + expect(decoded.rects).to.eql([ + [6, 1], + [2, 2], + ]); + }); + + it('limits RLE to length of 255', async () => { + const pixels: RGBAColor[][] = [ + Array(200).fill(R), + Array(100).fill(R).concat(Array(100).fill(B)), + ]; + + const { decoded, colorsArray } = encodePixels(pixels, colors); + + expect(decoded.bounds).to.eql({ top: 0, bottom: 1, left: 0, right: 200 }); + expect(decoded.rects).to.eql([ + [255, 1], + [45, 1], + [100, 2], + ]); + }); + }); +}); diff --git a/packages/nouns-sdk/test/image.ts b/packages/nouns-sdk/test/image.ts new file mode 100644 index 0000000000..e3a2960feb --- /dev/null +++ b/packages/nouns-sdk/test/image.ts @@ -0,0 +1,243 @@ +// /* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { ImageBounds, ImageRow, ImageRows, Rect, RGBAColor } from '../src/image/types'; +import { rgbToHex, toPaddedHex } from '../src/image/utils'; + +/** + * A class used to convert an image into the following RLE format: + * Palette Index, Bounds [Top (Y), Right (X), Bottom (Y), Left (X)] (4 Bytes), [Pixel Length (1 Byte), Color Index (1 Byte)][]. + * + * This is no longer in active use, here just for testing purposes + */ +export class Image { + private _width: number; + private _height: number; + private _rows: ImageRows = {}; + private _bounds: ImageBounds = { top: 0, bottom: 0, left: 0, right: 0 }; + private _rle: string | undefined; + + /** + * The image's pixel width + */ + get width(): number { + return this._width; + } + + /** + * The image's pixel height + */ + get height(): number { + return this._height; + } + + /** + * The number of rows to run-length encode + */ + get rows(): ImageRows { + return this._rows; + } + + /** + * The bounds of the inner rect to run-length encode + */ + get bounds(): ImageBounds { + return this._bounds; + } + + constructor(width: number, height: number) { + this._width = width; + this._height = height; + } + + /** + * Convert an image to a run-length encoded string using the provided RGBA + * and color palette values. + * @param getRgbaAt A function used to fetch the RGBA values at specific x-y coordinates + * @param colors The color palette map + */ + public toRLE( + getRgbaAt: (x: number, y: number) => RGBAColor, + colors: Map, + ): string { + if (!this._rle) { + this._rle = this.encode(getRgbaAt, colors); + } + return this._rle; + } + + /** + * Using the image pixel inforation, run-length encode an image. + * @param getRgbaAt A function used to fetch the RGBA values at specific x-y coordinates + * @param colors The color palette map + */ + private encode( + getRgbaAt: (x: number, y: number) => RGBAColor, + colors: Map, + ): string { + for (let y = 0; y < this._height; y++) { + for (let x = 0; x < this._width; x++) { + const { r, g, b, a } = getRgbaAt(x, y); + const hexColor = rgbToHex(r, g, b); + + // Insert the color if it does not yet exist + if (!colors.has(hexColor)) { + colors.set(hexColor, colors.size); + } + + // If alpha is 0, use 'transparent' index, otherwise get color index + const colorIndex = a === 0 ? 0 : colors.get(hexColor)!; + + this.appendPixelToRect(colorIndex, y); + } + this.updateImageBounds(y); + } + + this.deleteEmptyRows(); + + // Set the left and right bounds. Return early if empty + const rowCount = Object.keys(this._rows).length; + if (rowCount) { + this._bounds.left = Math.min(...Object.values(this._rows).map(r => r.bounds.left)); + this._bounds.right = Math.max(...Object.values(this._rows).map(r => r.bounds.right)); + + // Exit early if image is empty + const [rect] = this._rows[0]?.rects || []; + if (rowCount === 1 && this.isEmptyRow(rect)) { + return '0x0000000000'; + } + } + + const encodedBounds = this.getEncodedBounds(this._bounds); + const encodedImage = Object.values(this._rows).reduce((result, row) => { + result += this.getEncodedRow(row, this._bounds); + return result; + }, encodedBounds); + + return encodedImage; + } + + /** + * Append a single pixel to a new or existing rect + * @param colorIndex The color array index + * @param y The current `y` coordinate + */ + private appendPixelToRect(colorIndex: number, y: number): void { + // Create the row if it does not exist yet + const { rects } = (this._rows[y] ||= { + rects: [], + bounds: { left: 0, right: 0 }, + }); + + // First pixel of line or different color than previous + if (!rects.length || rects[rects.length - 1].colorIndex !== colorIndex) { + rects.push({ length: 1, colorIndex }); + return; + } + + // Same color as the pixel to the left + rects[rects.length - 1].length++; + } + + /** + * Update the bounds of the provided image + * @param y The current `y` coordinate + */ + private updateImageBounds(y: number): void { + const { rects } = this._rows[y]; + + // Shift top bound to `y` if row is not empty and top bound is 0 + if (!this.isEmptyRow(rects[0]) && this._bounds.top === 0) { + this._bounds.top = y; + } + + if (this._bounds.top !== 0) { + // Set bottom bound to `y` if row is empty or we're on the last row. + // Otherwise, reset the bottom bound + if (this.isEmptyRow(rects[0])) { + if (this._bounds.bottom === 0) { + this._bounds.bottom = y - 1; + } + } else if (y === 31) { + this._bounds.bottom = y; + } else { + this._bounds.bottom = 0; + } + } + + this._rows[y].bounds = { + left: rects[0].length, + right: this._width - rects[rects.length - 1].length, + }; + } + + /** + * Delete all empty rows. That is, all rows above the top bound or + * below the lower bound + */ + private deleteEmptyRows(): void { + // Delete all rows above the top bound + for (let i = 0; i < this._bounds.top; i++) { + delete this._rows[i]; + } + + // Delete all rows below the bottom bound + for (let i = this._height - 1; i > this._bounds.bottom; i--) { + delete this._rows[i]; + } + } + + /** + * Get the encoded part bounds string + * @param bounds The part bounds + */ + private getEncodedBounds(bounds: ImageBounds) { + const top = toPaddedHex(bounds.top, 2); + const right = toPaddedHex(bounds.right, 2); + const bottom = toPaddedHex(bounds.bottom, 2); + const left = toPaddedHex(bounds.left, 2); + return `0x00${top}${right}${bottom}${left}`; + } + + /** + * Get a single row encoded as a hex string + * @param row The row data + * @param bounds The image bounds + */ + private getEncodedRow(row: ImageRow, bounds: ImageBounds) { + const rowBuffer = Buffer.from( + row.rects.flatMap(({ length, colorIndex }, i) => { + // Row only contains a single rect + if (i === 0 && i === row.rects.length - 1) { + return [bounds.right - bounds.left, colorIndex]; + } + + // Set left bound + if (i === 0) { + if (length > bounds.left) { + return [length - bounds.left, colorIndex]; + } else if (length === bounds.left) { + return []; + } + } + + // Set right bound + if (i === row.rects.length - 1) { + if (length > this._width - bounds.right) { + return [length - (this._width - bounds.right), colorIndex]; + } else if (length === this._width - bounds.right) { + return []; + } + } + return [length, colorIndex]; + }), + ); + return rowBuffer.toString('hex'); + } + + /** + * Determine if the provided rect fills the entire row and is transparent + * @param rect The rect to inspect + */ + private isEmptyRow(rect: Rect) { + return rect?.length === this._width && rect?.colorIndex === 0; + } +} diff --git a/packages/nouns-sdk/test/lib/data/expected.ts b/packages/nouns-sdk/test/lib/data/expected.ts index 30c4dd55be..26e263bf4e 100644 --- a/packages/nouns-sdk/test/lib/data/expected.ts +++ b/packages/nouns-sdk/test/lib/data/expected.ts @@ -5,7 +5,7 @@ export const expected = { { filename: 'empty', data: '0x0000000000' }, { filename: 'head-cone', - data: '0x000319140708000202080008000202080007000402070007000402070007000402070006000602060006000603060006000603060005000803050005000802050005000802050004000a02040004000a03040004000a03040003000c03030003000c02030004020c0402021202', + data: '0x000319140708000202100002020f0004020e0004020e0004020d0006020c0006030c0006030b0008030a0008020a00080209000a0208000a0308000a0307000c0306000c02030004020c041402', }, ], }, diff --git a/packages/nouns-subgraph/config/rinkeby.json b/packages/nouns-subgraph/config/rinkeby.json index 000d1e7432..35b42056e6 100644 --- a/packages/nouns-subgraph/config/rinkeby.json +++ b/packages/nouns-subgraph/config/rinkeby.json @@ -1,15 +1,15 @@ { "network": "rinkeby", "nounsToken": { - "address": "0xc52bb4Fc4ed72f2a910BF0481D620B927Ded76f7", - "startBlock": 8947618 + "address": "0x59D3356299432c58c80603316786868479753C23", + "startBlock": 11021592 }, "nounsAuctionHouse": { - "address": "0xBA088c634394775D89cAC7c67DFD52D73bfdFa05", - "startBlock": 8947622 + "address": "0xDF87852c37D1774100526F92C89608C395785C5d", + "startBlock": 11021592 }, "nounsDAO": { - "address": "0x2817A1A4Ae32AEc0D15b2E751AC207Da306Ea213", - "startBlock": 8973384 + "address": "0x8c6B7F6F091bb3Ffb086DBa4d1b465E0D896a05e", + "startBlock": 11021592 } } diff --git a/packages/nouns-webapp/package.json b/packages/nouns-webapp/package.json index dacfe726c2..74481b5c07 100644 --- a/packages/nouns-webapp/package.json +++ b/packages/nouns-webapp/package.json @@ -17,8 +17,8 @@ "@fortawesome/free-solid-svg-icons": "5.15.3", "@fortawesome/react-fontawesome": "0.1.14", "@netlify/functions": "^0.7.2", - "@nouns/assets": "^0.2.0", - "@nouns/sdk": "^0.1.4", + "@nouns/assets": "^0.3.0", + "@nouns/sdk": "^0.2.0", "@reduxjs/toolkit": "^1.6.0", "@testing-library/jest-dom": "^5.11.4", "@testing-library/react": "^11.1.0", diff --git a/packages/nouns-webapp/src/config.ts b/packages/nouns-webapp/src/config.ts index f200c07cb7..867c271bd6 100644 --- a/packages/nouns-webapp/src/config.ts +++ b/packages/nouns-webapp/src/config.ts @@ -59,7 +59,7 @@ const app: Record = { [ChainId.Rinkeby]: { jsonRpcUri: createNetworkHttpUrl('rinkeby'), wsRpcUri: createNetworkWsUrl('rinkeby'), - subgraphApiUri: 'https://api.thegraph.com/subgraphs/name/nounsdao/nouns-subgraph-rinkeby-v4', + subgraphApiUri: 'https://api.thegraph.com/subgraphs/name/nounsdao/nouns-subgraph-rinkeby-v5', enableHistory: process.env.REACT_APP_ENABLE_HISTORY === 'true', }, [ChainId.Mainnet]: { diff --git a/yarn.lock b/yarn.lock index 0a8ea75bb6..553523081a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2537,31 +2537,6 @@ unique-filename "^1.1.1" which "^1.3.1" -"@float-capital/solidity-coverage@^0.7.17": - version "0.7.17" - resolved "https://registry.yarnpkg.com/@float-capital/solidity-coverage/-/solidity-coverage-0.7.17.tgz#454eb53b00dd5c80d7b253db1513ccd9cfb68424" - integrity sha512-LeG+GcmrGxLWmSn5KReAp3Ii+8v5e0HXb6/ZQJPO4zNG8jpE96QRFys+NBq4A8VVgzdUyFj5ipnR5TiGyhuUgw== - dependencies: - "@solidity-parser/parser" "^0.12.0" - "@truffle/provider" "^0.2.24" - chalk "^2.4.2" - death "^1.1.0" - detect-port "^1.3.0" - fs-extra "^8.1.0" - ganache-cli "^6.11.0" - ghost-testrpc "^0.0.2" - global-modules "^2.0.0" - globby "^10.0.1" - jsonschema "^1.2.4" - lodash "^4.17.15" - node-emoji "^1.10.0" - pify "^4.0.1" - recursive-readdir "^2.2.2" - sc-istanbul "^0.4.5" - semver "^7.3.4" - shelljs "^0.8.3" - web3-utils "^1.3.0" - "@fortawesome/fontawesome-common-types@^0.2.35": version "0.2.36" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz#b44e52db3b6b20523e0c57ef8c42d315532cb903" @@ -4308,11 +4283,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@solidity-parser/parser@^0.12.0": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.12.2.tgz#1afad367cb29a2ed8cdd4a3a62701c2821fb578f" - integrity sha512-d7VS7PxgMosm5NyaiyDJRNID5pK4AWj1l64Dbz0147hJgy5k2C0/ZiKK/9u5c5K+HRUVHmp+RMvGEjGh84oA5Q== - "@solidity-parser/parser@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.0.tgz#d51f074efb0acce0e953ec48133561ed710cebc0" @@ -12127,15 +12097,6 @@ fuzzaldrin@^2.1.0: resolved "https://registry.yarnpkg.com/fuzzaldrin/-/fuzzaldrin-2.1.0.tgz#90204c3e2fdaa6941bb28d16645d418063a90e9b" integrity sha1-kCBMPi/appQbso0WZF1BgGOpDps= -ganache-cli@^6.11.0: - version "6.12.2" - resolved "https://registry.yarnpkg.com/ganache-cli/-/ganache-cli-6.12.2.tgz#c0920f7db0d4ac062ffe2375cb004089806f627a" - integrity sha512-bnmwnJDBDsOWBUP8E/BExWf85TsdDEFelQSzihSJm9VChVO1SHp94YXLP5BlA4j/OTxp0wR4R1Tje9OHOuAJVw== - dependencies: - ethereumjs-util "6.2.1" - source-map-support "0.5.12" - yargs "13.2.4" - ganache-core@^2.13.2, ganache-core@^2.6.0: version "2.13.2" resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.2.tgz#27e6fc5417c10e6e76e2e646671869d7665814a3" @@ -13531,11 +13492,6 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - io-ts@1.10.4: version "1.10.4" resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" @@ -15338,13 +15294,6 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - lerna@^3.22.1: version "3.22.1" resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.22.1.tgz#82027ac3da9c627fd8bf02ccfeff806a98e65b62" @@ -16121,13 +16070,6 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -16241,15 +16183,6 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - memdown@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" @@ -16707,7 +16640,7 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-fn@^2.0.0, mimic-fn@^2.1.0: +mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== @@ -18057,15 +17990,6 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - os-name@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" @@ -18097,11 +18021,6 @@ p-cancelable@^1.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - p-each-series@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" @@ -18117,11 +18036,6 @@ p-finally@^2.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -21779,6 +21693,30 @@ solidity-comments-extractor@^0.0.7: resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz#99d8f1361438f84019795d928b931f4e5c39ca19" integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== +solidity-coverage@0.7.21: + version "0.7.21" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.21.tgz#20c5615a3a543086b243c2ca36e2951a75316b40" + integrity sha512-O8nuzJ9yXiKUx3NdzVvHrUW0DxoNVcGzq/I7NzewNO9EZE3wYAQ4l8BwcnV64r4aC/HB6Vnw/q2sF0BQHv/3fg== + dependencies: + "@solidity-parser/parser" "^0.14.0" + "@truffle/provider" "^0.2.24" + chalk "^2.4.2" + death "^1.1.0" + detect-port "^1.3.0" + fs-extra "^8.1.0" + ghost-testrpc "^0.0.2" + global-modules "^2.0.0" + globby "^10.0.1" + jsonschema "^1.2.4" + lodash "^4.17.15" + node-emoji "^1.10.0" + pify "^4.0.1" + recursive-readdir "^2.2.2" + sc-istanbul "^0.4.5" + semver "^7.3.4" + shelljs "^0.8.3" + web3-utils "^1.3.0" + sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" @@ -25283,7 +25221,7 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.5.1, yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@13.1.2, yargs-parser@^13.1.0, yargs-parser@^13.1.2: +yargs-parser@13.1.2, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== @@ -25352,23 +25290,6 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@13.2.4: - version "13.2.4" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" - integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - os-locale "^3.1.0" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.0" - yargs@13.3.2, yargs@^13.2.4, yargs@^13.3.0, yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"