From 3f4b101442d4927957993b6519d72fec479c51bf Mon Sep 17 00:00:00 2001 From: AnriTool <59344539+AnriTool@users.noreply.github.com> Date: Thu, 12 Jun 2025 00:22:31 +1000 Subject: [PATCH 1/8] Remove dxt.js, added custom decoding, support VC/III formats --- package-lock.json | 11 - package.json | 3 - src/renderware/txd/TxdParser.ts | 119 +++-- src/renderware/utils/ImageDecoder.ts | 525 +++++++++++++++++++++++ src/renderware/utils/ImageFormatEnums.ts | 28 ++ 5 files changed, 647 insertions(+), 39 deletions(-) create mode 100644 src/renderware/utils/ImageDecoder.ts create mode 100644 src/renderware/utils/ImageFormatEnums.ts diff --git a/package-lock.json b/package-lock.json index dd18f95..57e9695 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,6 @@ "name": "rw-parser", "version": "1.4.0", "license": "GPL-3.0", - "dependencies": { - "dxt-js": "0.0.3" - }, "devDependencies": { "@types/jest": "^29.5.12", "@types/node": "^20.11.24", @@ -1635,14 +1632,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/dxt-js": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/dxt-js/-/dxt-js-0.0.3.tgz", - "integrity": "sha512-qNBx0i5/ICyNFO7rs5ZothChgfFD408dg/ZBBfWFXDy0xeDQ86t91QUZxj5WqeUzZQ/+PPtjTUC0w3mS+198jg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/electron-to-chromium": { "version": "1.4.690", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.690.tgz", diff --git a/package.json b/package.json index b858469..5aee4ef 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,6 @@ ], "main": "lib/index.js", "types": "lib/index.d.ts", - "dependencies": { - "dxt-js": "0.0.3" - }, "devDependencies": { "@types/jest": "^29.5.12", "@types/node": "^20.11.24", diff --git a/src/renderware/txd/TxdParser.ts b/src/renderware/txd/TxdParser.ts index cd9ffd0..5bd3e35 100644 --- a/src/renderware/txd/TxdParser.ts +++ b/src/renderware/txd/TxdParser.ts @@ -1,6 +1,11 @@ import { RwFile } from '../RwFile'; - -const dxt = require('dxt-js'); +import { ImageDecoder } from '../utils/ImageDecoder' +import { + D3DFormat, + PaletteType, + PlatformType, + RasterFormat +} from '../utils/ImageFormatEnums' export interface RwTxd { textureDictionary: RwTextureDictionary, @@ -90,21 +95,23 @@ export class TxdParser extends RwFile { const mipmapCount = this.readUint8(); const rasterType = this.readUint8(); - const _isPAL4 = rasterType & 0x4000; - const _isPAL8 = rasterType & 0x2000; - - const compressionFlags = this.readUint8(); + const compressionFlags = this.readUint8(); //dxtType for III/VC + // SA const alpha = (compressionFlags & (1 << 0)) !== 0; const cubeTexture = (compressionFlags & (1 << 1)) !== 0; const autoMipMaps = (compressionFlags & (1 << 2)) !== 0; const compressed = (compressionFlags & (1 << 3)) !== 0; + const paletteType = (rasterFormat >> 13) & 0b11; + let mipWidth = width; let mipHeight = height; let mipmaps: number[][] = []; + const palette: Uint8Array = (paletteType !== PaletteType.PALETTE_NONE ? this.readPalette(paletteType, depth) : new Uint8Array(0)); + for (let i = 0; i < mipmapCount; i++) { const rasterSize = this.readUint32(); @@ -114,25 +121,26 @@ export class TxdParser extends RwFile { // Raw RGBA presentation let bitmap: number[]; - if (compressed || d3dFormat.includes('DXT')) { - bitmap = Array.from(dxt.decompress(raster, mipWidth, mipHeight, dxt.flags[d3dFormat])); - } else { - // TODO: Make raster format an enum and add more formats - // All formats are in D3D9 color order (BGRA), so we swap them - - switch (rasterFormat) { - // FORMAT_8888, depth 32 (D3DFMT_A8R8G8B8) - case 0x0500: - // FORMAT_888 (RGB 8 bits each, D3DFMT_X8R8G8B8) - case 0x0600: - for (let i = 0; i < raster.length; i += 4) { - // Fancy array destructuring, just swaps R and B values - [raster[i], raster[i + 2]] = [raster[i + 2], raster[i]]; - } - break; - } - - bitmap = Array.from(raster); + if (0 !== palette.length) { + const rasterFormatsWithoutAlpha = [ + RasterFormat.RASTER_565, + RasterFormat.RASTER_LUM, + RasterFormat.RASTER_888, + RasterFormat.RASTER_555 + ]; + + const hasAlpha = ((platformId === PlatformType.D3D9 && alpha) || (platformId == PlatformType.D3D8 && !rasterFormatsWithoutAlpha.includes(rasterFormat))); + + bitmap = Array.from(this.getBitmapWithPalette(paletteType, depth, hasAlpha, raster, palette, width, height)); + } + else if (platformId === PlatformType.D3D8 && compressionFlags !== 0) { + bitmap = Array.from(this.getBitmapWithDXT('DXT' + compressionFlags, raster, width, height)); + } + else if (platformId === PlatformType.D3D9 && compressed) { + bitmap = Array.from(this.getBitmapWithDXT(d3dFormat, raster, width, height)); + } + else { + bitmap = Array.from(this.getBitmapWithRasterFormat(rasterFormat, raster, width, height)) } mipmaps.push(bitmap); @@ -162,4 +170,65 @@ export class TxdParser extends RwFile { mipmaps, }; } + + public readPalette(paletteType: number, depth: number): Uint8Array { + const size = (paletteType === PaletteType.PALETTE_8 ? 1024 : (depth === 4 ? 64 : 128)) + + return this.read(size); + } + + public getBitmapWithPalette(paletteType: number, depth: number, hasAlpha: boolean, raster: Uint8Array, palette: Uint8Array, width: number, height: number): Uint8Array { + if (paletteType !== PaletteType.PALETTE_8 && depth == 4) { + return (hasAlpha + ? ImageDecoder.pal4(raster, palette, width, height) + : ImageDecoder.pal4NoAlpha(raster, palette, width, height) + ); + } + + return (hasAlpha + ? ImageDecoder.pal8(raster, palette, width, height) + : ImageDecoder.pal8NoAlpha(raster, palette, width, height) + ) + } + + public getBitmapWithDXT(dxtType:string, raster: Uint8Array, width: number, height: number): Uint8Array { + switch (dxtType) { + case D3DFormat.D3D_DXT1: + return ImageDecoder.bc1(raster, width, height); + case D3DFormat.D3D_DXT2: + return ImageDecoder.bc2(raster, width, height, true); + case D3DFormat.D3D_DXT3: + return ImageDecoder.bc2(raster, width, height, false); + case D3DFormat.D3D_DXT4: + return ImageDecoder.bc3(raster, width, height, true); + case D3DFormat.D3D_DXT5: + return ImageDecoder.bc3(raster, width, height, false); + // LUM8_A8 has compressed flag + case D3DFormat.D3DFMT_A8L8: + return ImageDecoder.lum8a8(raster, width, height); + default: + return new Uint8Array(0); + } + } + + public getBitmapWithRasterFormat (rasterFormat: number, raster: Uint8Array, width: number, height: number): Uint8Array { + switch (rasterFormat) { + case RasterFormat.RASTER_1555: + return ImageDecoder.bgra1555(raster, width, height); + case RasterFormat.RASTER_565: + return ImageDecoder.bgra565(raster, width, height); + case RasterFormat.RASTER_4444: + return ImageDecoder.bgra4444(raster, width, height); + case RasterFormat.RASTER_LUM: + return ImageDecoder.lum8(raster, width, height); + case RasterFormat.RASTER_8888: + return ImageDecoder.bgra8888(raster, width, height); + case RasterFormat.RASTER_888: + return ImageDecoder.bgra888(raster, width, height); + case RasterFormat.RASTER_555: + return ImageDecoder.bgra555(raster, width, height); + default: + return new Uint8Array(0); + } + } } diff --git a/src/renderware/utils/ImageDecoder.ts b/src/renderware/utils/ImageDecoder.ts new file mode 100644 index 0000000..a09fad5 --- /dev/null +++ b/src/renderware/utils/ImageDecoder.ts @@ -0,0 +1,525 @@ +// Source: https://github.com/Parik27/DragonFF/blob/master/gtaLib/txd.py +export class ImageDecoder { + + static readUInt16LE(buf: Uint8Array, offset: number): number { + return buf[offset] | (buf[offset + 1] << 8); + } + + static readUInt32LE(buf: Uint8Array, offset: number): number { + return ( + buf[offset] | + (buf[offset + 1] << 8) | + (buf[offset + 2] << 16) | + (buf[offset + 3] << 24) + ); + } + + static decode565(bits: number): [number, number, number] { + const r = Math.round(((bits >> 11) & 0b11111) * 255 / 31); + const g = Math.round(((bits >> 5) & 0b111111) * 255 / 63); + const b = Math.round((bits & 0b11111) * 255 / 31); + return [r, g, b]; + } + + static decode555(bits:number): [number, number, number] { + const r = Math.round(((bits >> 10) & 0b11111) * 255 / 31); + const g = Math.round(((bits >> 5) & 0b11111) * 255 / 31); + const b = Math.round((bits & 0b11111) * 255 / 31); + return [r, g, b]; + } + + static decode1555(bits: number): [number, number, number, number] { + const a = Math.round(((bits >> 15) & 0b1) * 255); + const r = Math.round(((bits >> 10) & 0b11111) * 255 / 31); + const g = Math.round(((bits >> 5) & 0b11111) * 255 / 31); + const b = Math.round((bits & 0b11111) * 255 / 31); + return [a, r, g, b]; + } + + static decode4444(bits: number): [number, number, number, number] { + const a = Math.round(((bits >> 12) & 0b1111) * 255 / 15); + const r = Math.round(((bits >> 8) & 0b1111) * 255 / 15); + const g = Math.round(((bits >> 4) & 0b1111) * 255 / 15); + const b = Math.round((bits & 0b1111) * 255 / 15); + return [a, r, g, b]; + } + + // Using if color0 > color1 on bcN + static color2Interpolation(color0:number, color1:number): number { + return (2 * color0 + color1) / 3; + } + + // Using if color0 <= color1 on bcN + static color2Average(color0:number, color1:number): number { + return (color0 + color1) / 2; + } + + // Using if color0 > color1 on bcN + static color3Interpolation(color0:number, color1:number): number { + return (2 * color1 + color0) / 3; + } + + static bc1(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + let offset = 0; + + for (let y = 0; y < height; y += 4) { + for (let x = 0; x < width; x += 4) { + const color0 = ImageDecoder.readUInt16LE(data, offset); + const color1 = ImageDecoder.readUInt16LE(data, offset + 2); + let bits = ImageDecoder.readUInt32LE(data, offset + 4); + offset += 8; + + const [r0, g0, b0] = ImageDecoder.decode565(color0); + const [r1, g1, b1] = ImageDecoder.decode565(color1); + + for (let j = 0; j < 4; j++) { + for (let i = 0; i < 4; i++) { + const control = bits & 3; + bits >>= 2; + + let [r, g, b, a] = [0,0,0,0]; + + switch (control) { + case 0: + [r, g, b, a] = [r0, g0, b0, 0xff]; + break; + case 1: + [r, g, b, a] = [r1, g1, b1, 0xff]; + break; + case 2: + if (color0 > color1) { + r = ImageDecoder.color2Interpolation(r0, r1); + g = ImageDecoder.color2Interpolation(g0, g1); + b = ImageDecoder.color2Interpolation(b0, b1); + a = 0xff; + } else { + r = ImageDecoder.color2Average(r0, r1); + g = ImageDecoder.color2Average(g0, g1); + b = ImageDecoder.color2Average(b0, b1); + a = 0xff; + } + break; + case 3: + if (color0 > color1) { + r = ImageDecoder.color3Interpolation(r0, r1); + g = ImageDecoder.color3Interpolation(g0, g1); + b = ImageDecoder.color3Interpolation(b0, b1); + a = 0xff; + } else { + [r, g, b, a] = [0, 0, 0, 0]; + } + break; + } + + const idx = 4 * ((y + j) * width + (x + i)); + rgba[idx + 0] = r; + rgba[idx + 1] = g; + rgba[idx + 2] = b; + rgba[idx + 3] = 0xff; + } + } + } + } + + return rgba; + } + + static bc2(data: Uint8Array, width: number, height: number, premultiplied: boolean): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + let offset = 0; + + for (let y = 0; y < height; y += 4) { + for (let x = 0; x < width; x += 4) { + const alpha0 = ImageDecoder.readUInt16LE(data, offset); + const alpha1 = ImageDecoder.readUInt16LE(data, offset + 2); + const alpha2 = ImageDecoder.readUInt16LE(data, offset + 4); + const alpha3 = ImageDecoder.readUInt16LE(data, offset + 6); + const color0 = ImageDecoder.readUInt16LE(data, offset + 8); + const color1 = ImageDecoder.readUInt16LE(data, offset + 10); + let bits = ImageDecoder.readUInt32LE(data, offset + 12); + offset += 16; + + const [r0, g0, b0] = ImageDecoder.decode565(color0); + const [r1, g1, b1] = ImageDecoder.decode565(color1); + const alphas = [alpha0, alpha1, alpha2, alpha3]; + + for (let j = 0; j < 4; j++) { + for (let i = 0; i < 4; i++) { + const control = bits & 3; + bits >>= 2; + + let [r, g, b] = [0,0,0]; + + switch (control) { + case 0: + [r, g, b] = [r0, g0, b0]; + break; + case 1: + [r, g, b] = [r1, g1, b1]; + break; + case 2: + if (color0 > color1) { + r = ImageDecoder.color2Interpolation(r0, r1); + g = ImageDecoder.color2Interpolation(g0, g1); + b = ImageDecoder.color2Interpolation(b0, b1); + } else { + r = ImageDecoder.color2Average(r0, r1); + g = ImageDecoder.color2Average(g0, g1); + b = ImageDecoder.color2Average(b0, b1); + } + break; + case 3: + if (color0 > color1) { + r = ImageDecoder.color3Interpolation(r0, r1); + g = ImageDecoder.color3Interpolation(g0, g1); + b = ImageDecoder.color3Interpolation(b0, b1); + } else { + [r, g, b] = [0, 0, 0]; + } + break; + } + + const a = ((alphas[j] >> (i * 4)) & 0xf) * 0x11; + + const idx = 4 * ((y + j) * width + (x + i)); + + if (premultiplied && a > 0) { + r = Math.min(Math.round((r * 255) / a), 255); + g = Math.min(Math.round((g * 255) / a), 255); + b = Math.min(Math.round((b * 255) / a), 255); + } + + rgba[idx + 0] = r; + rgba[idx + 1] = g; + rgba[idx + 2] = b; + rgba[idx + 3] = a; + } + } + } + } + + return rgba; + } + + static bc3(data: Uint8Array, width: number, height: number, premultiplied: boolean): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + let offset = 0; + + for (let y = 0; y < height; y += 4) { + for (let x = 0; x < width; x += 4) { + const alpha0 = data[offset]; + const alpha1 = data[offset + 1]; + const alpha2 = ImageDecoder.readUInt16LE(data, offset + 2); + const alpha3 = ImageDecoder.readUInt16LE(data, offset + 4); + const alpha4 = ImageDecoder.readUInt16LE(data, offset + 6); + const color0 = ImageDecoder.readUInt16LE(data, offset + 8); + const color1 = ImageDecoder.readUInt16LE(data, offset + 10); + let bits = ImageDecoder.readUInt32LE(data, offset + 12); + offset += 16; + + const [r0, g0, b0] = ImageDecoder.decode565(color0); + const [r1, g1, b1] = ImageDecoder.decode565(color1); + + let alphas: number[]; + if (alpha0 > alpha1) { + alphas = [ + alpha0, + alpha1, + Math.round(alpha0 * (6 / 7) + alpha1 * (1 / 7)), + Math.round(alpha0 * (5 / 7) + alpha1 * (2 / 7)), + Math.round(alpha0 * (4 / 7) + alpha1 * (3 / 7)), + Math.round(alpha0 * (3 / 7) + alpha1 * (4 / 7)), + Math.round(alpha0 * (2 / 7) + alpha1 * (5 / 7)), + Math.round(alpha0 * (1 / 7) + alpha1 * (6 / 7)) + ]; + } else { + alphas = [ + alpha0, + alpha1, + Math.round(alpha0 * (4 / 5) + alpha1 * (1 / 5)), + Math.round(alpha0 * (3 / 5) + alpha1 * (2 / 5)), + Math.round(alpha0 * (2 / 5) + alpha1 * (3 / 5)), + Math.round(alpha0 * (1 / 5) + alpha1 * (4 / 5)), + 0, + 255 + ]; + } + + const alphaIndices = [alpha4, alpha3, alpha2]; + + for (let j = 0; j < 4; j++) { + for (let i = 0; i < 4; i++) { + const control = bits & 3; + bits >>= 2; + + let [r, g, b] = [0,0,0]; + + switch (control) { + case 0: + [r, g, b] = [r0, g0, b0]; + break; + case 1: + [r, g, b] = [r1, g1, b1]; + break; + case 2: + if (color0 > color1) { + r = ImageDecoder.color2Interpolation(r0, r1); + g = ImageDecoder.color2Interpolation(g0, g1); + b = ImageDecoder.color2Interpolation(b0, b1); + } else { + r = ImageDecoder.color2Average(r0, r1); + g = ImageDecoder.color2Average(g0, g1); + b = ImageDecoder.color2Average(b0, b1); + } + break; + case 3: + if (color0 > color1) { + r = ImageDecoder.color3Interpolation(r0, r1); + g = ImageDecoder.color3Interpolation(g0, g1); + b = ImageDecoder.color3Interpolation(b0, b1); + } else { + [r, g, b] = [0, 0, 0]; + } + break; + } + + const shift = 3 * (15 - ((3 - i) + j * 4)); + const shiftS = shift % 16; + const rowS = Math.floor(shift / 16); + const rowE = Math.floor((shift + 2) / 16); + + let alphaIndex = (alphaIndices[2 - rowS] >> shiftS) & 0x7; + + if (rowS !== rowE) { + const shift_e = 16 - shiftS; + alphaIndex += (alphaIndices[2 - rowE] & ((1 << (3 - shift_e)) - 1)) << shift_e; + } + + const a = alphas[alphaIndex]; + + const idx = 4 * ((y + j) * width + (x + i)); + + if (premultiplied && a > 0) { + r = Math.min(Math.round((r * 255) / a), 255); + g = Math.min(Math.round((g * 255) / a), 255); + b = Math.min(Math.round((b * 255) / a), 255); + } + + rgba[idx + 0] = r; + rgba[idx + 1] = g; + rgba[idx + 2] = b; + rgba[idx + 3] = a; + } + } + } + } + + return rgba; + } + + static bgra1555(data: Uint8Array, width: number, height: number): Uint8Array { + const rbga = new Uint8Array(4 * width * height); + let offset = 0; + + for (let i = 0; i < data.length; i += 2) { + const color = ImageDecoder.readUInt16LE(data, i); + const [a, r, g, b] = ImageDecoder.decode1555(color); + + rbga[offset++] = r; + rbga[offset++] = g; + rbga[offset++] = b; + rbga[offset++] = a; + } + + return rbga; + } + + static bgra4444(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + let offset = 0; + + for (let i = 0; i < data.length; i += 2) { + const color = ImageDecoder.readUInt16LE(data, i); + const [a, r, g, b] = ImageDecoder.decode4444(color); + + rgba[offset++] = r; + rgba[offset++] = g; + rgba[offset++] = b; + rgba[offset++] = a; + } + + return rgba; + } + + static bgra555(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + let offset = 0; + + for (let i = 0; i < data.length; i += 2) { + const color = ImageDecoder.readUInt16LE(data, i); + const [r, g, b] = ImageDecoder.decode555(color); + + rgba[offset++] = r; + rgba[offset++] = g; + rgba[offset++] = b; + rgba[offset++] = 0xff; + } + + return rgba; + } + + static bgra565(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + let offset = 0; + + for (let i = 0; i < data.length; i += 2) { + const color = ImageDecoder.readUInt16LE(data, i); + const [r, g, b] = ImageDecoder.decode565(color); + + rgba[offset++] = r; + rgba[offset++] = g; + rgba[offset++] = b; + rgba[offset++] = 0xff; + } + + return rgba; + } + + static bgra888(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + for (let i = 0; i < data.length; i += 4) { + rgba[i + 0] = data[i + 2]; + rgba[i + 1] = data[i + 1]; + rgba[i + 2] = data[i + 0]; + rgba[i + 3] = 0xff; + } + + return rgba; + } + + static bgra8888(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + for (let i = 0; i < data.length; i += 4) { + rgba[i + 0] = data[i + 2]; + rgba[i + 1] = data[i + 1]; + rgba[i + 2] = data[i + 0]; + rgba[i + 3] = data[i + 3]; + } + + return rgba; + } + + static lum8(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + + for (let i = 0; i < data.length; i++) { + const offset = i * 4; + const luminance = data[i]; + rgba[offset + 0] = luminance; // R + rgba[offset + 1] = luminance; // G + rgba[offset + 2] = luminance; // B + rgba[offset + 3] = 0xff; + } + + return rgba; + } + + static lum8a8(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + let offset = 0; + + for (let i = 0; i < data.length; i += 2) { + const luminance = data[i]; + const alpha = data[i + 1]; + + rgba[offset++] = luminance; + rgba[offset++] = luminance; + rgba[offset++] = luminance; + rgba[offset++] = alpha; + } + + return rgba; + } + + static pal4(data: Uint8Array, palette: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + let offset = 0; + + for (let i = 0; i < data.length; i++) { + const b = data[i]; + const idx1 = (b >> 4) & 0xf; + const idx2 = b & 0xf; + + // Copying RGBA from the palette for two pixels + rgba[offset++] = palette[idx1 * 4 + 0]; // R + rgba[offset++] = palette[idx1 * 4 + 1]; // G + rgba[offset++] = palette[idx1 * 4 + 2]; // B + rgba[offset++] = palette[idx1 * 4 + 3]; // A + + rgba[offset++] = palette[idx2 * 4 + 0]; // R + rgba[offset++] = palette[idx2 * 4 + 1]; // G + rgba[offset++] = palette[idx2 * 4 + 2]; // B + rgba[offset++] = palette[idx2 * 4 + 3]; // A + } + + return rgba; + } + + static pal4NoAlpha(data: Uint8Array, palette: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + let offset = 0; + + for (let i = 0; i < data.length; i++) { + const b = data[i]; + const colorIndex1 = (b >> 4) & 0xf; + const colorIndex2 = b & 0xf; + + // First pixel + rgba[offset++] = palette[colorIndex1 * 4 + 0]; // R + rgba[offset++] = palette[colorIndex1 * 4 + 1]; // G + rgba[offset++] = palette[colorIndex1 * 4 + 2]; // B + rgba[offset++] = 0xff; + + // Second pixel + rgba[offset++] = palette[colorIndex2 * 4 + 0]; // R + rgba[offset++] = palette[colorIndex2 * 4 + 1]; // G + rgba[offset++] = palette[colorIndex2 * 4 + 2]; // B + rgba[offset++] = 0xff; + } + + return rgba; + } + + static pal8(data: Uint8Array, palette: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + + for (let i = 0; i < data.length; i++) { + const colorIndex = data[i]; + + // Copy RGBA from palette + rgba[i * 4 + 0] = palette[colorIndex * 4 + 0]; // R + rgba[i * 4 + 1] = palette[colorIndex * 4 + 1]; // G + rgba[i * 4 + 2] = palette[colorIndex * 4 + 2]; // B + rgba[i * 4 + 3] = palette[colorIndex * 4 + 3]; // A + } + + return rgba; + } + + static pal8NoAlpha(data: Uint8Array, palette: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + + for (let i = 0; i < data.length; i++) { + const colorIndex = data[i]; + + // Copy RGB from palette + rgba[i * 4 + 0] = palette[colorIndex * 4 + 0]; // R + rgba[i * 4 + 1] = palette[colorIndex * 4 + 1]; // G + rgba[i * 4 + 2] = palette[colorIndex * 4 + 2]; // B + rgba[i * 4 + 3] = 0xff; + } + + return rgba; + } +} \ No newline at end of file diff --git a/src/renderware/utils/ImageFormatEnums.ts b/src/renderware/utils/ImageFormatEnums.ts new file mode 100644 index 0000000..dbb362a --- /dev/null +++ b/src/renderware/utils/ImageFormatEnums.ts @@ -0,0 +1,28 @@ +export enum RasterFormat { + RASTER_1555 = 0x0100, + RASTER_565 = 0x0200, + RASTER_4444 = 0x0300, + RASTER_LUM = 0x0400, + RASTER_8888 = 0x0500, + RASTER_888 = 0x0600, + RASTER_555 = 0x0a00, +} + +export enum D3DFormat { + D3DFMT_A8L8 = "3", + D3D_DXT1 = "DXT1", + D3D_DXT2 = "DXT2", + D3D_DXT3 = "DXT3", + D3D_DXT4 = "DXT4", + D3D_DXT5 = "DXT5", +} + +export enum PaletteType { + PALETTE_NONE = 0, + PALETTE_8 = 1, +} + +export enum PlatformType { + D3D8 = 0x8, + D3D9 = 0x9, +} \ No newline at end of file From 2376c4bab5c67ae626f349a290f5fc0ee0d77d82 Mon Sep 17 00:00:00 2001 From: AnriTool <59344539+AnriTool@users.noreply.github.com> Date: Thu, 12 Jun 2025 00:40:00 +1000 Subject: [PATCH 2/8] Remove dxt.js, added custom decoding, support VC/III formats --- package-lock.json | 11 +++++++++++ package.json | 3 +++ src/renderware/txd/TxdParser.ts | 2 +- src/renderware/utils/ImageDecoder.ts | 4 ++-- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 57e9695..dd18f95 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "rw-parser", "version": "1.4.0", "license": "GPL-3.0", + "dependencies": { + "dxt-js": "0.0.3" + }, "devDependencies": { "@types/jest": "^29.5.12", "@types/node": "^20.11.24", @@ -1632,6 +1635,14 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/dxt-js": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/dxt-js/-/dxt-js-0.0.3.tgz", + "integrity": "sha512-qNBx0i5/ICyNFO7rs5ZothChgfFD408dg/ZBBfWFXDy0xeDQ86t91QUZxj5WqeUzZQ/+PPtjTUC0w3mS+198jg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.690", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.690.tgz", diff --git a/package.json b/package.json index 5aee4ef..b858469 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,9 @@ ], "main": "lib/index.js", "types": "lib/index.d.ts", + "dependencies": { + "dxt-js": "0.0.3" + }, "devDependencies": { "@types/jest": "^29.5.12", "@types/node": "^20.11.24", diff --git a/src/renderware/txd/TxdParser.ts b/src/renderware/txd/TxdParser.ts index 5bd3e35..a171682 100644 --- a/src/renderware/txd/TxdParser.ts +++ b/src/renderware/txd/TxdParser.ts @@ -95,7 +95,7 @@ export class TxdParser extends RwFile { const mipmapCount = this.readUint8(); const rasterType = this.readUint8(); - const compressionFlags = this.readUint8(); //dxtType for III/VC + const compressionFlags = this.readUint8(); // Is "dxtType" for III/VC // SA const alpha = (compressionFlags & (1 << 0)) !== 0; diff --git a/src/renderware/utils/ImageDecoder.ts b/src/renderware/utils/ImageDecoder.ts index a09fad5..2197812 100644 --- a/src/renderware/utils/ImageDecoder.ts +++ b/src/renderware/utils/ImageDecoder.ts @@ -149,7 +149,7 @@ export class ImageDecoder { const control = bits & 3; bits >>= 2; - let [r, g, b] = [0,0,0]; + let [r, g, b] = [0, 0, 0]; switch (control) { case 0: @@ -253,7 +253,7 @@ export class ImageDecoder { const control = bits & 3; bits >>= 2; - let [r, g, b] = [0,0,0]; + let [r, g, b] = [0, 0, 0]; switch (control) { case 0: From c9f71514c5635373db6096dbd10b7d4308ae40aa Mon Sep 17 00:00:00 2001 From: AnriTool <59344539+AnriTool@users.noreply.github.com> Date: Thu, 12 Jun 2025 14:39:20 +1000 Subject: [PATCH 3/8] DXT1 Alpha --- src/renderware/txd/TxdParser.ts | 4 ++-- src/renderware/utils/ImageDecoder.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/renderware/txd/TxdParser.ts b/src/renderware/txd/TxdParser.ts index a171682..d0378ad 100644 --- a/src/renderware/txd/TxdParser.ts +++ b/src/renderware/txd/TxdParser.ts @@ -110,7 +110,7 @@ export class TxdParser extends RwFile { let mipmaps: number[][] = []; - const palette: Uint8Array = (paletteType !== PaletteType.PALETTE_NONE ? this.readPalette(paletteType, depth) : new Uint8Array(0)); + const palette = (paletteType !== PaletteType.PALETTE_NONE ? this.readPalette(paletteType, depth) : new Uint8Array(0)); for (let i = 0; i < mipmapCount; i++) { @@ -121,7 +121,7 @@ export class TxdParser extends RwFile { // Raw RGBA presentation let bitmap: number[]; - if (0 !== palette.length) { + if (palette.length !== 0) { const rasterFormatsWithoutAlpha = [ RasterFormat.RASTER_565, RasterFormat.RASTER_LUM, diff --git a/src/renderware/utils/ImageDecoder.ts b/src/renderware/utils/ImageDecoder.ts index 2197812..5b3b0ac 100644 --- a/src/renderware/utils/ImageDecoder.ts +++ b/src/renderware/utils/ImageDecoder.ts @@ -78,7 +78,7 @@ export class ImageDecoder { const control = bits & 3; bits >>= 2; - let [r, g, b, a] = [0,0,0,0]; + let [r, g, b, a] = [0, 0, 0, 0]; switch (control) { case 0: @@ -116,7 +116,7 @@ export class ImageDecoder { rgba[idx + 0] = r; rgba[idx + 1] = g; rgba[idx + 2] = b; - rgba[idx + 3] = 0xff; + rgba[idx + 3] = a; } } } From 029d01cb8e90d1b37832862f89639a9ca9121107 Mon Sep 17 00:00:00 2001 From: AnriTool <59344539+AnriTool@users.noreply.github.com> Date: Sun, 15 Jun 2025 21:47:22 +1000 Subject: [PATCH 4/8] dxt-decompress optimization and fixes --- src/renderware/utils/ImageDecoder.ts | 502 +++++++++++++++------------ 1 file changed, 273 insertions(+), 229 deletions(-) diff --git a/src/renderware/utils/ImageDecoder.ts b/src/renderware/utils/ImageDecoder.ts index 5b3b0ac..cf81fef 100644 --- a/src/renderware/utils/ImageDecoder.ts +++ b/src/renderware/utils/ImageDecoder.ts @@ -15,10 +15,15 @@ export class ImageDecoder { } static decode565(bits: number): [number, number, number] { - const r = Math.round(((bits >> 11) & 0b11111) * 255 / 31); - const g = Math.round(((bits >> 5) & 0b111111) * 255 / 63); - const b = Math.round((bits & 0b11111) * 255 / 31); - return [r, g, b]; + const r = (bits >> 11) & 0b11111; + const g = (bits >> 5) & 0b111111; + const b = bits & 0b11111; + + return [ + (r << 3) | (r >> 2), + (g << 2) | (g >> 4), + (b << 3) | (b >> 2) + ]; } static decode555(bits:number): [number, number, number] { @@ -44,79 +49,78 @@ export class ImageDecoder { return [a, r, g, b]; } - // Using if color0 > color1 on bcN - static color2Interpolation(color0:number, color1:number): number { - return (2 * color0 + color1) / 3; - } - - // Using if color0 <= color1 on bcN - static color2Average(color0:number, color1:number): number { - return (color0 + color1) / 2; - } - - // Using if color0 > color1 on bcN - static color3Interpolation(color0:number, color1:number): number { - return (2 * color1 + color0) / 3; - } - + /* + bc1 - block compression format, using for DXT1 + compress 4x4 block of pixels + format: + +---------------+ + | color0 | color0 in palette. 16bit (RGB 565 format) + +---------------+ + | color1 | color1 in palette. 16bit (RGB 565 format) + +---+---+---+---+ + | a | b | c | d | a-p color palette index 2bit * 16 + +---+---+---+---+ + | e | f | g | h | + +---+---+---+---+ + | i | j | k | l | + +---+---+---+---+ + | m | n | o | p | total: 8byte in 4x4 colors + +---+---+---+---+ + + color2 and color3 in the palette are calculated by interpolating other colors or choosing the average between them. + color0 > color1 => interpolation, else => average + */ static bc1(data: Uint8Array, width: number, height: number): Uint8Array { const rgba = new Uint8Array(4 * width * height); + const colorPalette = new Uint8Array(16); let offset = 0; for (let y = 0; y < height; y += 4) { for (let x = 0; x < width; x += 4) { const color0 = ImageDecoder.readUInt16LE(data, offset); const color1 = ImageDecoder.readUInt16LE(data, offset + 2); - let bits = ImageDecoder.readUInt32LE(data, offset + 4); + let colorBits = ImageDecoder.readUInt32LE(data, offset + 4); offset += 8; - const [r0, g0, b0] = ImageDecoder.decode565(color0); - const [r1, g1, b1] = ImageDecoder.decode565(color1); - - for (let j = 0; j < 4; j++) { - for (let i = 0; i < 4; i++) { - const control = bits & 3; - bits >>= 2; - - let [r, g, b, a] = [0, 0, 0, 0]; - - switch (control) { - case 0: - [r, g, b, a] = [r0, g0, b0, 0xff]; - break; - case 1: - [r, g, b, a] = [r1, g1, b1, 0xff]; - break; - case 2: - if (color0 > color1) { - r = ImageDecoder.color2Interpolation(r0, r1); - g = ImageDecoder.color2Interpolation(g0, g1); - b = ImageDecoder.color2Interpolation(b0, b1); - a = 0xff; - } else { - r = ImageDecoder.color2Average(r0, r1); - g = ImageDecoder.color2Average(g0, g1); - b = ImageDecoder.color2Average(b0, b1); - a = 0xff; - } - break; - case 3: - if (color0 > color1) { - r = ImageDecoder.color3Interpolation(r0, r1); - g = ImageDecoder.color3Interpolation(g0, g1); - b = ImageDecoder.color3Interpolation(b0, b1); - a = 0xff; - } else { - [r, g, b, a] = [0, 0, 0, 0]; - } - break; - } - - const idx = 4 * ((y + j) * width + (x + i)); - rgba[idx + 0] = r; - rgba[idx + 1] = g; - rgba[idx + 2] = b; - rgba[idx + 3] = a; + let [c0r, c0g, c0b] = ImageDecoder.decode565(color0); + let [c1r, c1g, c1b] = ImageDecoder.decode565(color1); + + if (color0 > color1) { + colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; + colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; + colorPalette[8] = (2 * c0r + c1r + 1) / 3; + colorPalette[9] = (2 * c0g + c1g + 1) / 3; + colorPalette[10] = (2 * c0b + c1b + 1) / 3; + colorPalette[12] = (c0r + 2 * c1r + 1) / 3; + colorPalette[13] = (c0g + 2 * c1g + 1) / 3; + colorPalette[14] = (c0b + 2 * c1b + 1) / 3; + } + else { + colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; + colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; + colorPalette[8] = (c0r + c1r + 1) >> 1; + colorPalette[9] = (c0g + c1g + 1) >> 1; + colorPalette[10] = (c0b + c1b + 1) >> 1; + colorPalette[12] = 0; colorPalette[13] = 0; colorPalette[14] = 0; + } + + const baseIndex = (y * width + x) * 4; + for (let k = 0; k < 16; k++) { + const colorIdx = colorBits & 0x3; + colorBits >>>= 2; + + const j = k >> 2; + const i = k & 3; + const idx = baseIndex + ((j * width + i) << 2); + + rgba[idx + 0] = colorPalette[colorIdx * 4]; + rgba[idx + 1] = colorPalette[colorIdx * 4 + 1]; + rgba[idx + 2] = colorPalette[colorIdx * 4 + 2]; + + if (color0 <= color1 && colorIdx === 3) { + rgba[idx + 3] = 0; + } else { + rgba[idx + 3] = 255; } } } @@ -125,76 +129,100 @@ export class ImageDecoder { return rgba; } + /* + bc2 - block compression format, using for DXT2 and DXT3 + compress 4x4 block of pixels with 4x4 4bit alpha + format: + +---+---+---+---+ + | a | b | c | d | a-p pixel alpha. 4bit * 16 + +---+---+---+---+ + | e | f | g | h | + +---+---+---+---+ + | i | j | k | l | + +---+---+---+---+ + | m | n | o | p | + +---+---+---+---+ + | | bc1 collor compression. 8byte + | bc1 block | + | | total: 16byte in 4x4 colors + +---------------+ + + in DXT2, the color data is interpreted as being premultiplied by alpha + */ static bc2(data: Uint8Array, width: number, height: number, premultiplied: boolean): Uint8Array { const rgba = new Uint8Array(4 * width * height); + const colorPalette = new Uint8Array(16); + + const alphaTable = new Uint8Array(16); + for (let i = 0; i < 16; i++) { + alphaTable[i] = (i * 255 + 7.5) / 15 | 0; + } + let offset = 0; for (let y = 0; y < height; y += 4) { for (let x = 0; x < width; x += 4) { - const alpha0 = ImageDecoder.readUInt16LE(data, offset); - const alpha1 = ImageDecoder.readUInt16LE(data, offset + 2); - const alpha2 = ImageDecoder.readUInt16LE(data, offset + 4); - const alpha3 = ImageDecoder.readUInt16LE(data, offset + 6); - const color0 = ImageDecoder.readUInt16LE(data, offset + 8); - const color1 = ImageDecoder.readUInt16LE(data, offset + 10); - let bits = ImageDecoder.readUInt32LE(data, offset + 12); - offset += 16; - - const [r0, g0, b0] = ImageDecoder.decode565(color0); - const [r1, g1, b1] = ImageDecoder.decode565(color1); - const alphas = [alpha0, alpha1, alpha2, alpha3]; - - for (let j = 0; j < 4; j++) { - for (let i = 0; i < 4; i++) { - const control = bits & 3; - bits >>= 2; - - let [r, g, b] = [0, 0, 0]; - - switch (control) { - case 0: - [r, g, b] = [r0, g0, b0]; - break; - case 1: - [r, g, b] = [r1, g1, b1]; - break; - case 2: - if (color0 > color1) { - r = ImageDecoder.color2Interpolation(r0, r1); - g = ImageDecoder.color2Interpolation(g0, g1); - b = ImageDecoder.color2Interpolation(b0, b1); - } else { - r = ImageDecoder.color2Average(r0, r1); - g = ImageDecoder.color2Average(g0, g1); - b = ImageDecoder.color2Average(b0, b1); - } - break; - case 3: - if (color0 > color1) { - r = ImageDecoder.color3Interpolation(r0, r1); - g = ImageDecoder.color3Interpolation(g0, g1); - b = ImageDecoder.color3Interpolation(b0, b1); - } else { - [r, g, b] = [0, 0, 0]; - } - break; - } - - const a = ((alphas[j] >> (i * 4)) & 0xf) * 0x11; - - const idx = 4 * ((y + j) * width + (x + i)); - - if (premultiplied && a > 0) { - r = Math.min(Math.round((r * 255) / a), 255); - g = Math.min(Math.round((g * 255) / a), 255); - b = Math.min(Math.round((b * 255) / a), 255); - } - - rgba[idx + 0] = r; - rgba[idx + 1] = g; - rgba[idx + 2] = b; - rgba[idx + 3] = a; + const alpha0 = ImageDecoder.readUInt32LE(data, offset); + const alpha1 = ImageDecoder.readUInt32LE(data, offset + 4); + offset += 8; + + const color0 = ImageDecoder.readUInt16LE(data, offset); + const color1 = ImageDecoder.readUInt16LE(data, offset + 2); + let colorBits = ImageDecoder.readUInt32LE(data, offset + 4); + offset += 8; + + let [c0r, c0g, c0b] = ImageDecoder.decode565(color0); + let [c1r, c1g, c1b] = ImageDecoder.decode565(color1); + + if (color0 > color1) { + colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; + colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; + colorPalette[8] = (2 * c0r + c1r + 1) / 3; + colorPalette[9] = (2 * c0g + c1g + 1) / 3; + colorPalette[10] = (2 * c0b + c1b + 1) / 3; + colorPalette[12] = (c0r + 2 * c1r + 1) / 3; + colorPalette[13] = (c0g + 2 * c1g + 1) / 3; + colorPalette[14] = (c0b + 2 * c1b + 1) / 3; + } + else { + colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; + colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; + colorPalette[8] = (c0r + c1r + 1) >> 1; + colorPalette[9] = (c0g + c1g + 1) >> 1; + colorPalette[10] = (c0b + c1b + 1) >> 1; + colorPalette[12] = 0; colorPalette[13] = 0; colorPalette[14] = 0; + } + + const baseIndex = ((y * width + x) << 2); + + for (let k = 0; k < 16; k++) { + const j = k >> 2; + const i = k & 3; + + const idx = baseIndex + ((((j * width + i) << 2))); + + const colorIdx = colorBits & 0x3; + colorBits >>>= 2; + + rgba[idx + 0] = colorPalette[colorIdx * 4]; + rgba[idx + 1] = colorPalette[colorIdx * 4 + 1]; + rgba[idx + 2] = colorPalette[colorIdx * 4 + 2]; + + const bitPos = (j << 2) + i; + const byteIndex = bitPos >> 3; + const shift = (bitPos & 7) << 2; + + const alpha4 = ((byteIndex === 0 ? alpha0 : alpha1) >>> shift) & 0xF; + const alpha = alphaTable[alpha4]; + + if (premultiplied && alpha > 0 && alpha < 255) { + const factor = 255 / alpha; + rgba[idx + 0] = Math.min(255, Math.round(rgba[idx + 0] * factor)); + rgba[idx + 1] = Math.min(255, Math.round(rgba[idx + 1] * factor)); + rgba[idx + 2] = Math.min(255, Math.round(rgba[idx + 2] * factor)); } + + rgba[idx + 3] = alpha; } } } @@ -202,114 +230,130 @@ export class ImageDecoder { return rgba; } + /* + bc3 - block compression format, using for DXT4 and DXT5 + compress 4x4 block of pixels with alpha + format: + +---------------+ + | alpha0 | min alpha value. 8bit + +---------------+ + | alpha1 | max alpha value. 8bit + +---+---+---+---+ + | a | b | c | d | bc1-like alpha block but 3bit * 16 (index in alpha palette) + +---+---+---+---+ + | e | f | g | h | + +---+---+---+---+ + | i | j | k | l | + +---+---+---+---+ + | m | n | o | p | + +---+---+---+---+ + | | bc1 color compression. 8byte + | bc1 block | + | | total: 16byte in 4x4 colors + +---------------+ + + in DXT4, the color data is interpreted as being premultiplied by alpha + */ static bc3(data: Uint8Array, width: number, height: number, premultiplied: boolean): Uint8Array { const rgba = new Uint8Array(4 * width * height); + const alphaPalette = new Uint8Array(8); + const colorPalette = new Uint8Array(16); + const alphaIndices = new Uint8Array(16); let offset = 0; for (let y = 0; y < height; y += 4) { for (let x = 0; x < width; x += 4) { - const alpha0 = data[offset]; - const alpha1 = data[offset + 1]; - const alpha2 = ImageDecoder.readUInt16LE(data, offset + 2); - const alpha3 = ImageDecoder.readUInt16LE(data, offset + 4); - const alpha4 = ImageDecoder.readUInt16LE(data, offset + 6); - const color0 = ImageDecoder.readUInt16LE(data, offset + 8); - const color1 = ImageDecoder.readUInt16LE(data, offset + 10); - let bits = ImageDecoder.readUInt32LE(data, offset + 12); - offset += 16; - - const [r0, g0, b0] = ImageDecoder.decode565(color0); - const [r1, g1, b1] = ImageDecoder.decode565(color1); - - let alphas: number[]; + const alpha0 = data[offset++]; + const alpha1 = data[offset++]; + + const alphaBits = data.subarray(offset, offset + 6); + offset += 6; + + const color0 = ImageDecoder.readUInt16LE(data, offset); + const color1 = ImageDecoder.readUInt16LE(data, offset + 2); + let colorBits = ImageDecoder.readUInt32LE(data, offset + 4); + offset += 8; + + let [c0r, c0g, c0b] = ImageDecoder.decode565(color0); + let [c1r, c1g, c1b] = ImageDecoder.decode565(color1); + + if (color0 > color1) { + colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; + colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; + colorPalette[8] = (2 * c0r + c1r + 1) / 3; + colorPalette[9] = (2 * c0g + c1g + 1) / 3; + colorPalette[10] = (2 * c0b + c1b + 1) / 3; + colorPalette[12] = (c0r + 2 * c1r + 1) / 3; + colorPalette[13] = (c0g + 2 * c1g + 1) / 3; + colorPalette[14] = (c0b + 2 * c1b + 1) / 3; + } + else { + colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; + colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; + colorPalette[8] = (c0r + c1r + 1) >> 1; + colorPalette[9] = (c0g + c1g + 1) >> 1; + colorPalette[10] = (c0b + c1b + 1) >> 1; + colorPalette[12] = 0; colorPalette[13] = 0; colorPalette[14] = 0; + } + if (alpha0 > alpha1) { - alphas = [ - alpha0, - alpha1, - Math.round(alpha0 * (6 / 7) + alpha1 * (1 / 7)), - Math.round(alpha0 * (5 / 7) + alpha1 * (2 / 7)), - Math.round(alpha0 * (4 / 7) + alpha1 * (3 / 7)), - Math.round(alpha0 * (3 / 7) + alpha1 * (4 / 7)), - Math.round(alpha0 * (2 / 7) + alpha1 * (5 / 7)), - Math.round(alpha0 * (1 / 7) + alpha1 * (6 / 7)) - ]; - } else { - alphas = [ - alpha0, - alpha1, - Math.round(alpha0 * (4 / 5) + alpha1 * (1 / 5)), - Math.round(alpha0 * (3 / 5) + alpha1 * (2 / 5)), - Math.round(alpha0 * (2 / 5) + alpha1 * (3 / 5)), - Math.round(alpha0 * (1 / 5) + alpha1 * (4 / 5)), - 0, - 255 - ]; + alphaPalette[0] = alpha0; + alphaPalette[1] = alpha1; + alphaPalette[2] = (alpha0 * 6 + alpha1 * 1 + 3) / 7; + alphaPalette[3] = (alpha0 * 5 + alpha1 * 2 + 3) / 7; + alphaPalette[4] = (alpha0 * 4 + alpha1 * 3 + 3) / 7; + alphaPalette[5] = (alpha0 * 3 + alpha1 * 4 + 3) / 7; + alphaPalette[6] = (alpha0 * 2 + alpha1 * 5 + 3) / 7; + alphaPalette[7] = (alpha0 * 1 + alpha1 * 6 + 3) / 7; + } + else { + alphaPalette[0] = alpha0; + alphaPalette[1] = alpha1; + alphaPalette[2] = (alpha0 * 4 + alpha1 * 1 + 2) / 5; + alphaPalette[3] = (alpha0 * 3 + alpha1 * 2 + 2) / 5; + alphaPalette[4] = (alpha0 * 2 + alpha1 * 3 + 2) / 5; + alphaPalette[5] = (alpha0 * 1 + alpha1 * 4 + 2) / 5; + alphaPalette[6] = 0; + alphaPalette[7] = 255; + } + + for (let k = 0; k < 16; k++) { + const bitOffset = k * 3; + const byteOffset = bitOffset >> 3; + const shift = bitOffset & 7; + + if (shift <= 5) { + alphaIndices[k] = (alphaBits[byteOffset] >> shift) & 0x7; + } else { + const part1 = (alphaBits[byteOffset] >> shift) & 0x7; + const part2 = (alphaBits[byteOffset + 1] << (8 - shift)) & 0x7; + alphaIndices[k] = part1 | part2; + } } - const alphaIndices = [alpha4, alpha3, alpha2]; - - for (let j = 0; j < 4; j++) { - for (let i = 0; i < 4; i++) { - const control = bits & 3; - bits >>= 2; - - let [r, g, b] = [0, 0, 0]; - - switch (control) { - case 0: - [r, g, b] = [r0, g0, b0]; - break; - case 1: - [r, g, b] = [r1, g1, b1]; - break; - case 2: - if (color0 > color1) { - r = ImageDecoder.color2Interpolation(r0, r1); - g = ImageDecoder.color2Interpolation(g0, g1); - b = ImageDecoder.color2Interpolation(b0, b1); - } else { - r = ImageDecoder.color2Average(r0, r1); - g = ImageDecoder.color2Average(g0, g1); - b = ImageDecoder.color2Average(b0, b1); - } - break; - case 3: - if (color0 > color1) { - r = ImageDecoder.color3Interpolation(r0, r1); - g = ImageDecoder.color3Interpolation(g0, g1); - b = ImageDecoder.color3Interpolation(b0, b1); - } else { - [r, g, b] = [0, 0, 0]; - } - break; - } - - const shift = 3 * (15 - ((3 - i) + j * 4)); - const shiftS = shift % 16; - const rowS = Math.floor(shift / 16); - const rowE = Math.floor((shift + 2) / 16); - - let alphaIndex = (alphaIndices[2 - rowS] >> shiftS) & 0x7; - - if (rowS !== rowE) { - const shift_e = 16 - shiftS; - alphaIndex += (alphaIndices[2 - rowE] & ((1 << (3 - shift_e)) - 1)) << shift_e; - } - - const a = alphas[alphaIndex]; - - const idx = 4 * ((y + j) * width + (x + i)); - - if (premultiplied && a > 0) { - r = Math.min(Math.round((r * 255) / a), 255); - g = Math.min(Math.round((g * 255) / a), 255); - b = Math.min(Math.round((b * 255) / a), 255); - } - - rgba[idx + 0] = r; - rgba[idx + 1] = g; - rgba[idx + 2] = b; - rgba[idx + 3] = a; + const baseIndex = (y * width + x) << 2; + let bits = colorBits; + + for (let k = 0; k < 16; k++) { + const j = k >> 2; + const i = k & 3; + + const idx = baseIndex + ((((j * width + i) << 2))); + const colorIdx = bits & 0x3; + bits >>>= 2; + + const alpha = alphaPalette[alphaIndices[k] & 0x7]; + + rgba[idx + 0] = colorPalette[colorIdx * 4]; + rgba[idx + 1] = colorPalette[colorIdx * 4 + 1]; + rgba[idx + 2] = colorPalette[colorIdx * 4 + 2]; + rgba[idx + 3] = alpha; + + if (premultiplied && alpha > 0 && alpha < 255) { + const factor = 255 / alpha; + rgba[idx] = Math.min(255, Math.round(rgba[idx] * factor)); + rgba[idx + 1] = Math.min(255, Math.round(rgba[idx + 1] * factor)); + rgba[idx + 2] = Math.min(255, Math.round(rgba[idx + 2] * factor)); } } } From 896ec2c8baefce9fcec4c4746047831e69bafdfc Mon Sep 17 00:00:00 2001 From: AnriTool <59344539+AnriTool@users.noreply.github.com> Date: Sun, 15 Jun 2025 22:00:05 +1000 Subject: [PATCH 5/8] dxt-decompress optimization and fixes. Some refactor --- src/renderware/utils/ImageDecoder.ts | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/renderware/utils/ImageDecoder.ts b/src/renderware/utils/ImageDecoder.ts index cf81fef..3954c06 100644 --- a/src/renderware/utils/ImageDecoder.ts +++ b/src/renderware/utils/ImageDecoder.ts @@ -119,7 +119,8 @@ export class ImageDecoder { if (color0 <= color1 && colorIdx === 3) { rgba[idx + 3] = 0; - } else { + } + else { rgba[idx + 3] = 255; } } @@ -142,7 +143,7 @@ export class ImageDecoder { +---+---+---+---+ | m | n | o | p | +---+---+---+---+ - | | bc1 collor compression. 8byte + | | bc1 color compression. 8byte | bc1 block | | | total: 16byte in 4x4 colors +---------------+ @@ -204,10 +205,6 @@ export class ImageDecoder { const colorIdx = colorBits & 0x3; colorBits >>>= 2; - rgba[idx + 0] = colorPalette[colorIdx * 4]; - rgba[idx + 1] = colorPalette[colorIdx * 4 + 1]; - rgba[idx + 2] = colorPalette[colorIdx * 4 + 2]; - const bitPos = (j << 2) + i; const byteIndex = bitPos >> 3; const shift = (bitPos & 7) << 2; @@ -215,14 +212,18 @@ export class ImageDecoder { const alpha4 = ((byteIndex === 0 ? alpha0 : alpha1) >>> shift) & 0xF; const alpha = alphaTable[alpha4]; + rgba[idx + 0] = colorPalette[colorIdx * 4]; + rgba[idx + 1] = colorPalette[colorIdx * 4 + 1]; + rgba[idx + 2] = colorPalette[colorIdx * 4 + 2]; + rgba[idx + 3] = alpha; + + if (premultiplied && alpha > 0 && alpha < 255) { const factor = 255 / alpha; rgba[idx + 0] = Math.min(255, Math.round(rgba[idx + 0] * factor)); rgba[idx + 1] = Math.min(255, Math.round(rgba[idx + 1] * factor)); rgba[idx + 2] = Math.min(255, Math.round(rgba[idx + 2] * factor)); } - - rgba[idx + 3] = alpha; } } } @@ -324,7 +325,8 @@ export class ImageDecoder { if (shift <= 5) { alphaIndices[k] = (alphaBits[byteOffset] >> shift) & 0x7; - } else { + } + else { const part1 = (alphaBits[byteOffset] >> shift) & 0x7; const part2 = (alphaBits[byteOffset + 1] << (8 - shift)) & 0x7; alphaIndices[k] = part1 | part2; From d834e66a86bc400d3597aa0fb4e676edb5a6cffe Mon Sep 17 00:00:00 2001 From: AnriTool <59344539+AnriTool@users.noreply.github.com> Date: Sun, 15 Jun 2025 22:22:47 +1000 Subject: [PATCH 6/8] dxt-decompress optimization and fixes. Pixel mismatch --- src/renderware/utils/ImageDecoder.ts | 54 ++++++++++++++-------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/renderware/utils/ImageDecoder.ts b/src/renderware/utils/ImageDecoder.ts index 3954c06..9c03e4e 100644 --- a/src/renderware/utils/ImageDecoder.ts +++ b/src/renderware/utils/ImageDecoder.ts @@ -88,19 +88,19 @@ export class ImageDecoder { if (color0 > color1) { colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; - colorPalette[8] = (2 * c0r + c1r + 1) / 3; - colorPalette[9] = (2 * c0g + c1g + 1) / 3; - colorPalette[10] = (2 * c0b + c1b + 1) / 3; - colorPalette[12] = (c0r + 2 * c1r + 1) / 3; - colorPalette[13] = (c0g + 2 * c1g + 1) / 3; - colorPalette[14] = (c0b + 2 * c1b + 1) / 3; + colorPalette[8] = (2 * c0r + c1r) / 3; + colorPalette[9] = (2 * c0g + c1g) / 3; + colorPalette[10] = (2 * c0b + c1b) / 3; + colorPalette[12] = (c0r + 2 * c1r) / 3; + colorPalette[13] = (c0g + 2 * c1g) / 3; + colorPalette[14] = (c0b + 2 * c1b) / 3; } else { colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; - colorPalette[8] = (c0r + c1r + 1) >> 1; - colorPalette[9] = (c0g + c1g + 1) >> 1; - colorPalette[10] = (c0b + c1b + 1) >> 1; + colorPalette[8] = (c0r + c1r) >> 1; + colorPalette[9] = (c0g + c1g) >> 1; + colorPalette[10] = (c0b + c1b) >> 1; colorPalette[12] = 0; colorPalette[13] = 0; colorPalette[14] = 0; } @@ -178,19 +178,19 @@ export class ImageDecoder { if (color0 > color1) { colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; - colorPalette[8] = (2 * c0r + c1r + 1) / 3; - colorPalette[9] = (2 * c0g + c1g + 1) / 3; - colorPalette[10] = (2 * c0b + c1b + 1) / 3; - colorPalette[12] = (c0r + 2 * c1r + 1) / 3; - colorPalette[13] = (c0g + 2 * c1g + 1) / 3; - colorPalette[14] = (c0b + 2 * c1b + 1) / 3; + colorPalette[8] = (2 * c0r + c1r) / 3; + colorPalette[9] = (2 * c0g + c1g) / 3; + colorPalette[10] = (2 * c0b + c1b) / 3; + colorPalette[12] = (c0r + 2 * c1r) / 3; + colorPalette[13] = (c0g + 2 * c1g) / 3; + colorPalette[14] = (c0b + 2 * c1b) / 3; } else { colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; - colorPalette[8] = (c0r + c1r + 1) >> 1; - colorPalette[9] = (c0g + c1g + 1) >> 1; - colorPalette[10] = (c0b + c1b + 1) >> 1; + colorPalette[8] = (c0r + c1r) >> 1; + colorPalette[9] = (c0g + c1g) >> 1; + colorPalette[10] = (c0b + c1b) >> 1; colorPalette[12] = 0; colorPalette[13] = 0; colorPalette[14] = 0; } @@ -281,19 +281,19 @@ export class ImageDecoder { if (color0 > color1) { colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; - colorPalette[8] = (2 * c0r + c1r + 1) / 3; - colorPalette[9] = (2 * c0g + c1g + 1) / 3; - colorPalette[10] = (2 * c0b + c1b + 1) / 3; - colorPalette[12] = (c0r + 2 * c1r + 1) / 3; - colorPalette[13] = (c0g + 2 * c1g + 1) / 3; - colorPalette[14] = (c0b + 2 * c1b + 1) / 3; + colorPalette[8] = (2 * c0r + c1r) / 3; + colorPalette[9] = (2 * c0g + c1g) / 3; + colorPalette[10] = (2 * c0b + c1b) / 3; + colorPalette[12] = (c0r + 2 * c1r) / 3; + colorPalette[13] = (c0g + 2 * c1g) / 3; + colorPalette[14] = (c0b + 2 * c1b) / 3; } else { colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; - colorPalette[8] = (c0r + c1r + 1) >> 1; - colorPalette[9] = (c0g + c1g + 1) >> 1; - colorPalette[10] = (c0b + c1b + 1) >> 1; + colorPalette[8] = (c0r + c1r) >> 1; + colorPalette[9] = (c0g + c1g) >> 1; + colorPalette[10] = (c0b + c1b) >> 1; colorPalette[12] = 0; colorPalette[13] = 0; colorPalette[14] = 0; } From 23cf676f1d5d54a30140d2a03b29ffbe88770e38 Mon Sep 17 00:00:00 2001 From: AnriTool <59344539+AnriTool@users.noreply.github.com> Date: Sun, 15 Jun 2025 22:25:33 +1000 Subject: [PATCH 7/8] dxt-decompress optimization and fixes. Convert tabs to spaces --- src/renderware/utils/ImageDecoder.ts | 1134 +++++++++++----------- src/renderware/utils/ImageFormatEnums.ts | 34 +- 2 files changed, 584 insertions(+), 584 deletions(-) diff --git a/src/renderware/utils/ImageDecoder.ts b/src/renderware/utils/ImageDecoder.ts index 9c03e4e..ab9bd77 100644 --- a/src/renderware/utils/ImageDecoder.ts +++ b/src/renderware/utils/ImageDecoder.ts @@ -1,571 +1,571 @@ // Source: https://github.com/Parik27/DragonFF/blob/master/gtaLib/txd.py export class ImageDecoder { - static readUInt16LE(buf: Uint8Array, offset: number): number { - return buf[offset] | (buf[offset + 1] << 8); - } - - static readUInt32LE(buf: Uint8Array, offset: number): number { - return ( - buf[offset] | - (buf[offset + 1] << 8) | - (buf[offset + 2] << 16) | - (buf[offset + 3] << 24) - ); - } - - static decode565(bits: number): [number, number, number] { - const r = (bits >> 11) & 0b11111; - const g = (bits >> 5) & 0b111111; - const b = bits & 0b11111; - - return [ - (r << 3) | (r >> 2), - (g << 2) | (g >> 4), - (b << 3) | (b >> 2) - ]; - } - - static decode555(bits:number): [number, number, number] { - const r = Math.round(((bits >> 10) & 0b11111) * 255 / 31); - const g = Math.round(((bits >> 5) & 0b11111) * 255 / 31); - const b = Math.round((bits & 0b11111) * 255 / 31); - return [r, g, b]; - } - - static decode1555(bits: number): [number, number, number, number] { - const a = Math.round(((bits >> 15) & 0b1) * 255); - const r = Math.round(((bits >> 10) & 0b11111) * 255 / 31); - const g = Math.round(((bits >> 5) & 0b11111) * 255 / 31); - const b = Math.round((bits & 0b11111) * 255 / 31); - return [a, r, g, b]; - } - - static decode4444(bits: number): [number, number, number, number] { - const a = Math.round(((bits >> 12) & 0b1111) * 255 / 15); - const r = Math.round(((bits >> 8) & 0b1111) * 255 / 15); - const g = Math.round(((bits >> 4) & 0b1111) * 255 / 15); - const b = Math.round((bits & 0b1111) * 255 / 15); - return [a, r, g, b]; - } - - /* - bc1 - block compression format, using for DXT1 - compress 4x4 block of pixels - format: - +---------------+ - | color0 | color0 in palette. 16bit (RGB 565 format) - +---------------+ - | color1 | color1 in palette. 16bit (RGB 565 format) - +---+---+---+---+ - | a | b | c | d | a-p color palette index 2bit * 16 - +---+---+---+---+ - | e | f | g | h | - +---+---+---+---+ - | i | j | k | l | - +---+---+---+---+ - | m | n | o | p | total: 8byte in 4x4 colors - +---+---+---+---+ - - color2 and color3 in the palette are calculated by interpolating other colors or choosing the average between them. - color0 > color1 => interpolation, else => average - */ - static bc1(data: Uint8Array, width: number, height: number): Uint8Array { - const rgba = new Uint8Array(4 * width * height); - const colorPalette = new Uint8Array(16); - let offset = 0; - - for (let y = 0; y < height; y += 4) { - for (let x = 0; x < width; x += 4) { - const color0 = ImageDecoder.readUInt16LE(data, offset); - const color1 = ImageDecoder.readUInt16LE(data, offset + 2); - let colorBits = ImageDecoder.readUInt32LE(data, offset + 4); - offset += 8; - - let [c0r, c0g, c0b] = ImageDecoder.decode565(color0); - let [c1r, c1g, c1b] = ImageDecoder.decode565(color1); - - if (color0 > color1) { - colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; - colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; - colorPalette[8] = (2 * c0r + c1r) / 3; - colorPalette[9] = (2 * c0g + c1g) / 3; - colorPalette[10] = (2 * c0b + c1b) / 3; - colorPalette[12] = (c0r + 2 * c1r) / 3; - colorPalette[13] = (c0g + 2 * c1g) / 3; - colorPalette[14] = (c0b + 2 * c1b) / 3; - } - else { - colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; - colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; - colorPalette[8] = (c0r + c1r) >> 1; - colorPalette[9] = (c0g + c1g) >> 1; - colorPalette[10] = (c0b + c1b) >> 1; - colorPalette[12] = 0; colorPalette[13] = 0; colorPalette[14] = 0; - } - - const baseIndex = (y * width + x) * 4; - for (let k = 0; k < 16; k++) { - const colorIdx = colorBits & 0x3; - colorBits >>>= 2; - - const j = k >> 2; - const i = k & 3; - const idx = baseIndex + ((j * width + i) << 2); - - rgba[idx + 0] = colorPalette[colorIdx * 4]; - rgba[idx + 1] = colorPalette[colorIdx * 4 + 1]; - rgba[idx + 2] = colorPalette[colorIdx * 4 + 2]; - - if (color0 <= color1 && colorIdx === 3) { - rgba[idx + 3] = 0; - } - else { - rgba[idx + 3] = 255; - } - } - } - } - - return rgba; - } - - /* - bc2 - block compression format, using for DXT2 and DXT3 - compress 4x4 block of pixels with 4x4 4bit alpha - format: - +---+---+---+---+ - | a | b | c | d | a-p pixel alpha. 4bit * 16 - +---+---+---+---+ - | e | f | g | h | - +---+---+---+---+ - | i | j | k | l | - +---+---+---+---+ - | m | n | o | p | - +---+---+---+---+ - | | bc1 color compression. 8byte - | bc1 block | - | | total: 16byte in 4x4 colors - +---------------+ - - in DXT2, the color data is interpreted as being premultiplied by alpha - */ - static bc2(data: Uint8Array, width: number, height: number, premultiplied: boolean): Uint8Array { - const rgba = new Uint8Array(4 * width * height); - const colorPalette = new Uint8Array(16); - - const alphaTable = new Uint8Array(16); - for (let i = 0; i < 16; i++) { - alphaTable[i] = (i * 255 + 7.5) / 15 | 0; - } - - let offset = 0; - - for (let y = 0; y < height; y += 4) { - for (let x = 0; x < width; x += 4) { - const alpha0 = ImageDecoder.readUInt32LE(data, offset); - const alpha1 = ImageDecoder.readUInt32LE(data, offset + 4); - offset += 8; - - const color0 = ImageDecoder.readUInt16LE(data, offset); - const color1 = ImageDecoder.readUInt16LE(data, offset + 2); - let colorBits = ImageDecoder.readUInt32LE(data, offset + 4); - offset += 8; - - let [c0r, c0g, c0b] = ImageDecoder.decode565(color0); - let [c1r, c1g, c1b] = ImageDecoder.decode565(color1); - - if (color0 > color1) { - colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; - colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; - colorPalette[8] = (2 * c0r + c1r) / 3; - colorPalette[9] = (2 * c0g + c1g) / 3; - colorPalette[10] = (2 * c0b + c1b) / 3; - colorPalette[12] = (c0r + 2 * c1r) / 3; - colorPalette[13] = (c0g + 2 * c1g) / 3; - colorPalette[14] = (c0b + 2 * c1b) / 3; - } - else { - colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; - colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; - colorPalette[8] = (c0r + c1r) >> 1; - colorPalette[9] = (c0g + c1g) >> 1; - colorPalette[10] = (c0b + c1b) >> 1; - colorPalette[12] = 0; colorPalette[13] = 0; colorPalette[14] = 0; - } - - const baseIndex = ((y * width + x) << 2); - - for (let k = 0; k < 16; k++) { - const j = k >> 2; - const i = k & 3; - - const idx = baseIndex + ((((j * width + i) << 2))); - - const colorIdx = colorBits & 0x3; - colorBits >>>= 2; - - const bitPos = (j << 2) + i; - const byteIndex = bitPos >> 3; - const shift = (bitPos & 7) << 2; - - const alpha4 = ((byteIndex === 0 ? alpha0 : alpha1) >>> shift) & 0xF; - const alpha = alphaTable[alpha4]; - - rgba[idx + 0] = colorPalette[colorIdx * 4]; - rgba[idx + 1] = colorPalette[colorIdx * 4 + 1]; - rgba[idx + 2] = colorPalette[colorIdx * 4 + 2]; - rgba[idx + 3] = alpha; - - - if (premultiplied && alpha > 0 && alpha < 255) { - const factor = 255 / alpha; - rgba[idx + 0] = Math.min(255, Math.round(rgba[idx + 0] * factor)); - rgba[idx + 1] = Math.min(255, Math.round(rgba[idx + 1] * factor)); - rgba[idx + 2] = Math.min(255, Math.round(rgba[idx + 2] * factor)); - } - } - } - } - - return rgba; - } - - /* - bc3 - block compression format, using for DXT4 and DXT5 - compress 4x4 block of pixels with alpha - format: - +---------------+ - | alpha0 | min alpha value. 8bit - +---------------+ - | alpha1 | max alpha value. 8bit - +---+---+---+---+ - | a | b | c | d | bc1-like alpha block but 3bit * 16 (index in alpha palette) - +---+---+---+---+ - | e | f | g | h | - +---+---+---+---+ - | i | j | k | l | - +---+---+---+---+ - | m | n | o | p | - +---+---+---+---+ - | | bc1 color compression. 8byte - | bc1 block | - | | total: 16byte in 4x4 colors - +---------------+ - - in DXT4, the color data is interpreted as being premultiplied by alpha - */ - static bc3(data: Uint8Array, width: number, height: number, premultiplied: boolean): Uint8Array { - const rgba = new Uint8Array(4 * width * height); - const alphaPalette = new Uint8Array(8); - const colorPalette = new Uint8Array(16); - const alphaIndices = new Uint8Array(16); - let offset = 0; - - for (let y = 0; y < height; y += 4) { - for (let x = 0; x < width; x += 4) { - const alpha0 = data[offset++]; - const alpha1 = data[offset++]; - - const alphaBits = data.subarray(offset, offset + 6); - offset += 6; - - const color0 = ImageDecoder.readUInt16LE(data, offset); - const color1 = ImageDecoder.readUInt16LE(data, offset + 2); - let colorBits = ImageDecoder.readUInt32LE(data, offset + 4); - offset += 8; - - let [c0r, c0g, c0b] = ImageDecoder.decode565(color0); - let [c1r, c1g, c1b] = ImageDecoder.decode565(color1); - - if (color0 > color1) { - colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; - colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; - colorPalette[8] = (2 * c0r + c1r) / 3; - colorPalette[9] = (2 * c0g + c1g) / 3; - colorPalette[10] = (2 * c0b + c1b) / 3; - colorPalette[12] = (c0r + 2 * c1r) / 3; - colorPalette[13] = (c0g + 2 * c1g) / 3; - colorPalette[14] = (c0b + 2 * c1b) / 3; - } - else { - colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; - colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; - colorPalette[8] = (c0r + c1r) >> 1; - colorPalette[9] = (c0g + c1g) >> 1; - colorPalette[10] = (c0b + c1b) >> 1; - colorPalette[12] = 0; colorPalette[13] = 0; colorPalette[14] = 0; - } - - if (alpha0 > alpha1) { - alphaPalette[0] = alpha0; - alphaPalette[1] = alpha1; - alphaPalette[2] = (alpha0 * 6 + alpha1 * 1 + 3) / 7; - alphaPalette[3] = (alpha0 * 5 + alpha1 * 2 + 3) / 7; - alphaPalette[4] = (alpha0 * 4 + alpha1 * 3 + 3) / 7; - alphaPalette[5] = (alpha0 * 3 + alpha1 * 4 + 3) / 7; - alphaPalette[6] = (alpha0 * 2 + alpha1 * 5 + 3) / 7; - alphaPalette[7] = (alpha0 * 1 + alpha1 * 6 + 3) / 7; - } - else { - alphaPalette[0] = alpha0; - alphaPalette[1] = alpha1; - alphaPalette[2] = (alpha0 * 4 + alpha1 * 1 + 2) / 5; - alphaPalette[3] = (alpha0 * 3 + alpha1 * 2 + 2) / 5; - alphaPalette[4] = (alpha0 * 2 + alpha1 * 3 + 2) / 5; - alphaPalette[5] = (alpha0 * 1 + alpha1 * 4 + 2) / 5; - alphaPalette[6] = 0; - alphaPalette[7] = 255; - } - - for (let k = 0; k < 16; k++) { - const bitOffset = k * 3; - const byteOffset = bitOffset >> 3; - const shift = bitOffset & 7; - - if (shift <= 5) { - alphaIndices[k] = (alphaBits[byteOffset] >> shift) & 0x7; - } - else { - const part1 = (alphaBits[byteOffset] >> shift) & 0x7; - const part2 = (alphaBits[byteOffset + 1] << (8 - shift)) & 0x7; - alphaIndices[k] = part1 | part2; - } - } - - const baseIndex = (y * width + x) << 2; - let bits = colorBits; - - for (let k = 0; k < 16; k++) { - const j = k >> 2; - const i = k & 3; - - const idx = baseIndex + ((((j * width + i) << 2))); - const colorIdx = bits & 0x3; - bits >>>= 2; - - const alpha = alphaPalette[alphaIndices[k] & 0x7]; - - rgba[idx + 0] = colorPalette[colorIdx * 4]; - rgba[idx + 1] = colorPalette[colorIdx * 4 + 1]; - rgba[idx + 2] = colorPalette[colorIdx * 4 + 2]; - rgba[idx + 3] = alpha; - - if (premultiplied && alpha > 0 && alpha < 255) { - const factor = 255 / alpha; - rgba[idx] = Math.min(255, Math.round(rgba[idx] * factor)); - rgba[idx + 1] = Math.min(255, Math.round(rgba[idx + 1] * factor)); - rgba[idx + 2] = Math.min(255, Math.round(rgba[idx + 2] * factor)); - } - } - } - } - - return rgba; - } - - static bgra1555(data: Uint8Array, width: number, height: number): Uint8Array { - const rbga = new Uint8Array(4 * width * height); - let offset = 0; - - for (let i = 0; i < data.length; i += 2) { - const color = ImageDecoder.readUInt16LE(data, i); - const [a, r, g, b] = ImageDecoder.decode1555(color); - - rbga[offset++] = r; - rbga[offset++] = g; - rbga[offset++] = b; - rbga[offset++] = a; - } - - return rbga; - } - - static bgra4444(data: Uint8Array, width: number, height: number): Uint8Array { - const rgba = new Uint8Array(4 * width * height); - let offset = 0; - - for (let i = 0; i < data.length; i += 2) { - const color = ImageDecoder.readUInt16LE(data, i); - const [a, r, g, b] = ImageDecoder.decode4444(color); - - rgba[offset++] = r; - rgba[offset++] = g; - rgba[offset++] = b; - rgba[offset++] = a; - } - - return rgba; - } - - static bgra555(data: Uint8Array, width: number, height: number): Uint8Array { - const rgba = new Uint8Array(4 * width * height); - let offset = 0; - - for (let i = 0; i < data.length; i += 2) { - const color = ImageDecoder.readUInt16LE(data, i); - const [r, g, b] = ImageDecoder.decode555(color); - - rgba[offset++] = r; - rgba[offset++] = g; - rgba[offset++] = b; - rgba[offset++] = 0xff; - } - - return rgba; - } - - static bgra565(data: Uint8Array, width: number, height: number): Uint8Array { - const rgba = new Uint8Array(4 * width * height); - let offset = 0; - - for (let i = 0; i < data.length; i += 2) { - const color = ImageDecoder.readUInt16LE(data, i); - const [r, g, b] = ImageDecoder.decode565(color); - - rgba[offset++] = r; - rgba[offset++] = g; - rgba[offset++] = b; - rgba[offset++] = 0xff; - } - - return rgba; - } - - static bgra888(data: Uint8Array, width: number, height: number): Uint8Array { - const rgba = new Uint8Array(4 * width * height); - for (let i = 0; i < data.length; i += 4) { - rgba[i + 0] = data[i + 2]; - rgba[i + 1] = data[i + 1]; - rgba[i + 2] = data[i + 0]; - rgba[i + 3] = 0xff; - } - - return rgba; - } - - static bgra8888(data: Uint8Array, width: number, height: number): Uint8Array { - const rgba = new Uint8Array(4 * width * height); - for (let i = 0; i < data.length; i += 4) { - rgba[i + 0] = data[i + 2]; - rgba[i + 1] = data[i + 1]; - rgba[i + 2] = data[i + 0]; - rgba[i + 3] = data[i + 3]; - } - - return rgba; - } - - static lum8(data: Uint8Array, width: number, height: number): Uint8Array { - const rgba = new Uint8Array(4 * width * height); - - for (let i = 0; i < data.length; i++) { - const offset = i * 4; - const luminance = data[i]; - rgba[offset + 0] = luminance; // R - rgba[offset + 1] = luminance; // G - rgba[offset + 2] = luminance; // B - rgba[offset + 3] = 0xff; - } - - return rgba; - } - - static lum8a8(data: Uint8Array, width: number, height: number): Uint8Array { - const rgba = new Uint8Array(4 * width * height); - let offset = 0; - - for (let i = 0; i < data.length; i += 2) { - const luminance = data[i]; - const alpha = data[i + 1]; - - rgba[offset++] = luminance; - rgba[offset++] = luminance; - rgba[offset++] = luminance; - rgba[offset++] = alpha; - } - - return rgba; - } - - static pal4(data: Uint8Array, palette: Uint8Array, width: number, height: number): Uint8Array { - const rgba = new Uint8Array(4 * width * height); - let offset = 0; - - for (let i = 0; i < data.length; i++) { - const b = data[i]; - const idx1 = (b >> 4) & 0xf; - const idx2 = b & 0xf; - - // Copying RGBA from the palette for two pixels - rgba[offset++] = palette[idx1 * 4 + 0]; // R - rgba[offset++] = palette[idx1 * 4 + 1]; // G - rgba[offset++] = palette[idx1 * 4 + 2]; // B - rgba[offset++] = palette[idx1 * 4 + 3]; // A - - rgba[offset++] = palette[idx2 * 4 + 0]; // R - rgba[offset++] = palette[idx2 * 4 + 1]; // G - rgba[offset++] = palette[idx2 * 4 + 2]; // B - rgba[offset++] = palette[idx2 * 4 + 3]; // A - } - - return rgba; - } - - static pal4NoAlpha(data: Uint8Array, palette: Uint8Array, width: number, height: number): Uint8Array { - const rgba = new Uint8Array(4 * width * height); - let offset = 0; - - for (let i = 0; i < data.length; i++) { - const b = data[i]; - const colorIndex1 = (b >> 4) & 0xf; - const colorIndex2 = b & 0xf; - - // First pixel - rgba[offset++] = palette[colorIndex1 * 4 + 0]; // R - rgba[offset++] = palette[colorIndex1 * 4 + 1]; // G - rgba[offset++] = palette[colorIndex1 * 4 + 2]; // B - rgba[offset++] = 0xff; - - // Second pixel - rgba[offset++] = palette[colorIndex2 * 4 + 0]; // R - rgba[offset++] = palette[colorIndex2 * 4 + 1]; // G - rgba[offset++] = palette[colorIndex2 * 4 + 2]; // B - rgba[offset++] = 0xff; - } - - return rgba; - } - - static pal8(data: Uint8Array, palette: Uint8Array, width: number, height: number): Uint8Array { - const rgba = new Uint8Array(4 * width * height); - - for (let i = 0; i < data.length; i++) { - const colorIndex = data[i]; - - // Copy RGBA from palette - rgba[i * 4 + 0] = palette[colorIndex * 4 + 0]; // R - rgba[i * 4 + 1] = palette[colorIndex * 4 + 1]; // G - rgba[i * 4 + 2] = palette[colorIndex * 4 + 2]; // B - rgba[i * 4 + 3] = palette[colorIndex * 4 + 3]; // A - } - - return rgba; - } - - static pal8NoAlpha(data: Uint8Array, palette: Uint8Array, width: number, height: number): Uint8Array { - const rgba = new Uint8Array(4 * width * height); - - for (let i = 0; i < data.length; i++) { - const colorIndex = data[i]; - - // Copy RGB from palette - rgba[i * 4 + 0] = palette[colorIndex * 4 + 0]; // R - rgba[i * 4 + 1] = palette[colorIndex * 4 + 1]; // G - rgba[i * 4 + 2] = palette[colorIndex * 4 + 2]; // B - rgba[i * 4 + 3] = 0xff; - } - - return rgba; - } + static readUInt16LE(buf: Uint8Array, offset: number): number { + return buf[offset] | (buf[offset + 1] << 8); + } + + static readUInt32LE(buf: Uint8Array, offset: number): number { + return ( + buf[offset] | + (buf[offset + 1] << 8) | + (buf[offset + 2] << 16) | + (buf[offset + 3] << 24) + ); + } + + static decode565(bits: number): [number, number, number] { + const r = (bits >> 11) & 0b11111; + const g = (bits >> 5) & 0b111111; + const b = bits & 0b11111; + + return [ + (r << 3) | (r >> 2), + (g << 2) | (g >> 4), + (b << 3) | (b >> 2) + ]; + } + + static decode555(bits:number): [number, number, number] { + const r = Math.round(((bits >> 10) & 0b11111) * 255 / 31); + const g = Math.round(((bits >> 5) & 0b11111) * 255 / 31); + const b = Math.round((bits & 0b11111) * 255 / 31); + return [r, g, b]; + } + + static decode1555(bits: number): [number, number, number, number] { + const a = Math.round(((bits >> 15) & 0b1) * 255); + const r = Math.round(((bits >> 10) & 0b11111) * 255 / 31); + const g = Math.round(((bits >> 5) & 0b11111) * 255 / 31); + const b = Math.round((bits & 0b11111) * 255 / 31); + return [a, r, g, b]; + } + + static decode4444(bits: number): [number, number, number, number] { + const a = Math.round(((bits >> 12) & 0b1111) * 255 / 15); + const r = Math.round(((bits >> 8) & 0b1111) * 255 / 15); + const g = Math.round(((bits >> 4) & 0b1111) * 255 / 15); + const b = Math.round((bits & 0b1111) * 255 / 15); + return [a, r, g, b]; + } + + /* + bc1 - block compression format, using for DXT1 + compress 4x4 block of pixels + format: + +---------------+ + | color0 | color0 in palette. 16bit (RGB 565 format) + +---------------+ + | color1 | color1 in palette. 16bit (RGB 565 format) + +---+---+---+---+ + | a | b | c | d | a-p color palette index 2bit * 16 + +---+---+---+---+ + | e | f | g | h | + +---+---+---+---+ + | i | j | k | l | + +---+---+---+---+ + | m | n | o | p | total: 8byte in 4x4 colors + +---+---+---+---+ + + color2 and color3 in the palette are calculated by interpolating other colors or choosing the average between them. + color0 > color1 => interpolation, else => average + */ + static bc1(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + const colorPalette = new Uint8Array(16); + let offset = 0; + + for (let y = 0; y < height; y += 4) { + for (let x = 0; x < width; x += 4) { + const color0 = ImageDecoder.readUInt16LE(data, offset); + const color1 = ImageDecoder.readUInt16LE(data, offset + 2); + let colorBits = ImageDecoder.readUInt32LE(data, offset + 4); + offset += 8; + + let [c0r, c0g, c0b] = ImageDecoder.decode565(color0); + let [c1r, c1g, c1b] = ImageDecoder.decode565(color1); + + if (color0 > color1) { + colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; + colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; + colorPalette[8] = (2 * c0r + c1r) / 3; + colorPalette[9] = (2 * c0g + c1g) / 3; + colorPalette[10] = (2 * c0b + c1b) / 3; + colorPalette[12] = (c0r + 2 * c1r) / 3; + colorPalette[13] = (c0g + 2 * c1g) / 3; + colorPalette[14] = (c0b + 2 * c1b) / 3; + } + else { + colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; + colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; + colorPalette[8] = (c0r + c1r) >> 1; + colorPalette[9] = (c0g + c1g) >> 1; + colorPalette[10] = (c0b + c1b) >> 1; + colorPalette[12] = 0; colorPalette[13] = 0; colorPalette[14] = 0; + } + + const baseIndex = (y * width + x) * 4; + for (let k = 0; k < 16; k++) { + const colorIdx = colorBits & 0x3; + colorBits >>>= 2; + + const j = k >> 2; + const i = k & 3; + const idx = baseIndex + ((j * width + i) << 2); + + rgba[idx + 0] = colorPalette[colorIdx * 4]; + rgba[idx + 1] = colorPalette[colorIdx * 4 + 1]; + rgba[idx + 2] = colorPalette[colorIdx * 4 + 2]; + + if (color0 <= color1 && colorIdx === 3) { + rgba[idx + 3] = 0; + } + else { + rgba[idx + 3] = 255; + } + } + } + } + + return rgba; + } + + /* + bc2 - block compression format, using for DXT2 and DXT3 + compress 4x4 block of pixels with 4x4 4bit alpha + format: + +---+---+---+---+ + | a | b | c | d | a-p pixel alpha. 4bit * 16 + +---+---+---+---+ + | e | f | g | h | + +---+---+---+---+ + | i | j | k | l | + +---+---+---+---+ + | m | n | o | p | + +---+---+---+---+ + | | bc1 color compression. 8byte + | bc1 block | + | | total: 16byte in 4x4 colors + +---------------+ + + in DXT2, the color data is interpreted as being premultiplied by alpha + */ + static bc2(data: Uint8Array, width: number, height: number, premultiplied: boolean): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + const colorPalette = new Uint8Array(16); + + const alphaTable = new Uint8Array(16); + for (let i = 0; i < 16; i++) { + alphaTable[i] = (i * 255 + 7.5) / 15 | 0; + } + + let offset = 0; + + for (let y = 0; y < height; y += 4) { + for (let x = 0; x < width; x += 4) { + const alpha0 = ImageDecoder.readUInt32LE(data, offset); + const alpha1 = ImageDecoder.readUInt32LE(data, offset + 4); + offset += 8; + + const color0 = ImageDecoder.readUInt16LE(data, offset); + const color1 = ImageDecoder.readUInt16LE(data, offset + 2); + let colorBits = ImageDecoder.readUInt32LE(data, offset + 4); + offset += 8; + + let [c0r, c0g, c0b] = ImageDecoder.decode565(color0); + let [c1r, c1g, c1b] = ImageDecoder.decode565(color1); + + if (color0 > color1) { + colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; + colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; + colorPalette[8] = (2 * c0r + c1r) / 3; + colorPalette[9] = (2 * c0g + c1g) / 3; + colorPalette[10] = (2 * c0b + c1b) / 3; + colorPalette[12] = (c0r + 2 * c1r) / 3; + colorPalette[13] = (c0g + 2 * c1g) / 3; + colorPalette[14] = (c0b + 2 * c1b) / 3; + } + else { + colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; + colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; + colorPalette[8] = (c0r + c1r) >> 1; + colorPalette[9] = (c0g + c1g) >> 1; + colorPalette[10] = (c0b + c1b) >> 1; + colorPalette[12] = 0; colorPalette[13] = 0; colorPalette[14] = 0; + } + + const baseIndex = ((y * width + x) << 2); + + for (let k = 0; k < 16; k++) { + const j = k >> 2; + const i = k & 3; + + const idx = baseIndex + ((((j * width + i) << 2))); + + const colorIdx = colorBits & 0x3; + colorBits >>>= 2; + + const bitPos = (j << 2) + i; + const byteIndex = bitPos >> 3; + const shift = (bitPos & 7) << 2; + + const alpha4 = ((byteIndex === 0 ? alpha0 : alpha1) >>> shift) & 0xF; + const alpha = alphaTable[alpha4]; + + rgba[idx + 0] = colorPalette[colorIdx * 4]; + rgba[idx + 1] = colorPalette[colorIdx * 4 + 1]; + rgba[idx + 2] = colorPalette[colorIdx * 4 + 2]; + rgba[idx + 3] = alpha; + + + if (premultiplied && alpha > 0 && alpha < 255) { + const factor = 255 / alpha; + rgba[idx + 0] = Math.min(255, Math.round(rgba[idx + 0] * factor)); + rgba[idx + 1] = Math.min(255, Math.round(rgba[idx + 1] * factor)); + rgba[idx + 2] = Math.min(255, Math.round(rgba[idx + 2] * factor)); + } + } + } + } + + return rgba; + } + + /* + bc3 - block compression format, using for DXT4 and DXT5 + compress 4x4 block of pixels with alpha + format: + +---------------+ + | alpha0 | min alpha value. 8bit + +---------------+ + | alpha1 | max alpha value. 8bit + +---+---+---+---+ + | a | b | c | d | bc1-like alpha block but 3bit * 16 (index in alpha palette) + +---+---+---+---+ + | e | f | g | h | + +---+---+---+---+ + | i | j | k | l | + +---+---+---+---+ + | m | n | o | p | + +---+---+---+---+ + | | bc1 color compression. 8byte + | bc1 block | + | | total: 16byte in 4x4 colors + +---------------+ + + in DXT4, the color data is interpreted as being premultiplied by alpha + */ + static bc3(data: Uint8Array, width: number, height: number, premultiplied: boolean): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + const alphaPalette = new Uint8Array(8); + const colorPalette = new Uint8Array(16); + const alphaIndices = new Uint8Array(16); + let offset = 0; + + for (let y = 0; y < height; y += 4) { + for (let x = 0; x < width; x += 4) { + const alpha0 = data[offset++]; + const alpha1 = data[offset++]; + + const alphaBits = data.subarray(offset, offset + 6); + offset += 6; + + const color0 = ImageDecoder.readUInt16LE(data, offset); + const color1 = ImageDecoder.readUInt16LE(data, offset + 2); + let colorBits = ImageDecoder.readUInt32LE(data, offset + 4); + offset += 8; + + let [c0r, c0g, c0b] = ImageDecoder.decode565(color0); + let [c1r, c1g, c1b] = ImageDecoder.decode565(color1); + + if (color0 > color1) { + colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; + colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; + colorPalette[8] = (2 * c0r + c1r) / 3; + colorPalette[9] = (2 * c0g + c1g) / 3; + colorPalette[10] = (2 * c0b + c1b) / 3; + colorPalette[12] = (c0r + 2 * c1r) / 3; + colorPalette[13] = (c0g + 2 * c1g) / 3; + colorPalette[14] = (c0b + 2 * c1b) / 3; + } + else { + colorPalette[0] = c0r; colorPalette[1] = c0g; colorPalette[2] = c0b; + colorPalette[4] = c1r; colorPalette[5] = c1g; colorPalette[6] = c1b; + colorPalette[8] = (c0r + c1r) >> 1; + colorPalette[9] = (c0g + c1g) >> 1; + colorPalette[10] = (c0b + c1b) >> 1; + colorPalette[12] = 0; colorPalette[13] = 0; colorPalette[14] = 0; + } + + if (alpha0 > alpha1) { + alphaPalette[0] = alpha0; + alphaPalette[1] = alpha1; + alphaPalette[2] = (alpha0 * 6 + alpha1 * 1 + 3) / 7; + alphaPalette[3] = (alpha0 * 5 + alpha1 * 2 + 3) / 7; + alphaPalette[4] = (alpha0 * 4 + alpha1 * 3 + 3) / 7; + alphaPalette[5] = (alpha0 * 3 + alpha1 * 4 + 3) / 7; + alphaPalette[6] = (alpha0 * 2 + alpha1 * 5 + 3) / 7; + alphaPalette[7] = (alpha0 * 1 + alpha1 * 6 + 3) / 7; + } + else { + alphaPalette[0] = alpha0; + alphaPalette[1] = alpha1; + alphaPalette[2] = (alpha0 * 4 + alpha1 * 1 + 2) / 5; + alphaPalette[3] = (alpha0 * 3 + alpha1 * 2 + 2) / 5; + alphaPalette[4] = (alpha0 * 2 + alpha1 * 3 + 2) / 5; + alphaPalette[5] = (alpha0 * 1 + alpha1 * 4 + 2) / 5; + alphaPalette[6] = 0; + alphaPalette[7] = 255; + } + + for (let k = 0; k < 16; k++) { + const bitOffset = k * 3; + const byteOffset = bitOffset >> 3; + const shift = bitOffset & 7; + + if (shift <= 5) { + alphaIndices[k] = (alphaBits[byteOffset] >> shift) & 0x7; + } + else { + const part1 = (alphaBits[byteOffset] >> shift) & 0x7; + const part2 = (alphaBits[byteOffset + 1] << (8 - shift)) & 0x7; + alphaIndices[k] = part1 | part2; + } + } + + const baseIndex = (y * width + x) << 2; + let bits = colorBits; + + for (let k = 0; k < 16; k++) { + const j = k >> 2; + const i = k & 3; + + const idx = baseIndex + ((((j * width + i) << 2))); + const colorIdx = bits & 0x3; + bits >>>= 2; + + const alpha = alphaPalette[alphaIndices[k] & 0x7]; + + rgba[idx + 0] = colorPalette[colorIdx * 4]; + rgba[idx + 1] = colorPalette[colorIdx * 4 + 1]; + rgba[idx + 2] = colorPalette[colorIdx * 4 + 2]; + rgba[idx + 3] = alpha; + + if (premultiplied && alpha > 0 && alpha < 255) { + const factor = 255 / alpha; + rgba[idx] = Math.min(255, Math.round(rgba[idx] * factor)); + rgba[idx + 1] = Math.min(255, Math.round(rgba[idx + 1] * factor)); + rgba[idx + 2] = Math.min(255, Math.round(rgba[idx + 2] * factor)); + } + } + } + } + + return rgba; + } + + static bgra1555(data: Uint8Array, width: number, height: number): Uint8Array { + const rbga = new Uint8Array(4 * width * height); + let offset = 0; + + for (let i = 0; i < data.length; i += 2) { + const color = ImageDecoder.readUInt16LE(data, i); + const [a, r, g, b] = ImageDecoder.decode1555(color); + + rbga[offset++] = r; + rbga[offset++] = g; + rbga[offset++] = b; + rbga[offset++] = a; + } + + return rbga; + } + + static bgra4444(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + let offset = 0; + + for (let i = 0; i < data.length; i += 2) { + const color = ImageDecoder.readUInt16LE(data, i); + const [a, r, g, b] = ImageDecoder.decode4444(color); + + rgba[offset++] = r; + rgba[offset++] = g; + rgba[offset++] = b; + rgba[offset++] = a; + } + + return rgba; + } + + static bgra555(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + let offset = 0; + + for (let i = 0; i < data.length; i += 2) { + const color = ImageDecoder.readUInt16LE(data, i); + const [r, g, b] = ImageDecoder.decode555(color); + + rgba[offset++] = r; + rgba[offset++] = g; + rgba[offset++] = b; + rgba[offset++] = 0xff; + } + + return rgba; + } + + static bgra565(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + let offset = 0; + + for (let i = 0; i < data.length; i += 2) { + const color = ImageDecoder.readUInt16LE(data, i); + const [r, g, b] = ImageDecoder.decode565(color); + + rgba[offset++] = r; + rgba[offset++] = g; + rgba[offset++] = b; + rgba[offset++] = 0xff; + } + + return rgba; + } + + static bgra888(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + for (let i = 0; i < data.length; i += 4) { + rgba[i + 0] = data[i + 2]; + rgba[i + 1] = data[i + 1]; + rgba[i + 2] = data[i + 0]; + rgba[i + 3] = 0xff; + } + + return rgba; + } + + static bgra8888(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + for (let i = 0; i < data.length; i += 4) { + rgba[i + 0] = data[i + 2]; + rgba[i + 1] = data[i + 1]; + rgba[i + 2] = data[i + 0]; + rgba[i + 3] = data[i + 3]; + } + + return rgba; + } + + static lum8(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + + for (let i = 0; i < data.length; i++) { + const offset = i * 4; + const luminance = data[i]; + rgba[offset + 0] = luminance; // R + rgba[offset + 1] = luminance; // G + rgba[offset + 2] = luminance; // B + rgba[offset + 3] = 0xff; + } + + return rgba; + } + + static lum8a8(data: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + let offset = 0; + + for (let i = 0; i < data.length; i += 2) { + const luminance = data[i]; + const alpha = data[i + 1]; + + rgba[offset++] = luminance; + rgba[offset++] = luminance; + rgba[offset++] = luminance; + rgba[offset++] = alpha; + } + + return rgba; + } + + static pal4(data: Uint8Array, palette: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + let offset = 0; + + for (let i = 0; i < data.length; i++) { + const b = data[i]; + const idx1 = (b >> 4) & 0xf; + const idx2 = b & 0xf; + + // Copying RGBA from the palette for two pixels + rgba[offset++] = palette[idx1 * 4 + 0]; // R + rgba[offset++] = palette[idx1 * 4 + 1]; // G + rgba[offset++] = palette[idx1 * 4 + 2]; // B + rgba[offset++] = palette[idx1 * 4 + 3]; // A + + rgba[offset++] = palette[idx2 * 4 + 0]; // R + rgba[offset++] = palette[idx2 * 4 + 1]; // G + rgba[offset++] = palette[idx2 * 4 + 2]; // B + rgba[offset++] = palette[idx2 * 4 + 3]; // A + } + + return rgba; + } + + static pal4NoAlpha(data: Uint8Array, palette: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + let offset = 0; + + for (let i = 0; i < data.length; i++) { + const b = data[i]; + const colorIndex1 = (b >> 4) & 0xf; + const colorIndex2 = b & 0xf; + + // First pixel + rgba[offset++] = palette[colorIndex1 * 4 + 0]; // R + rgba[offset++] = palette[colorIndex1 * 4 + 1]; // G + rgba[offset++] = palette[colorIndex1 * 4 + 2]; // B + rgba[offset++] = 0xff; + + // Second pixel + rgba[offset++] = palette[colorIndex2 * 4 + 0]; // R + rgba[offset++] = palette[colorIndex2 * 4 + 1]; // G + rgba[offset++] = palette[colorIndex2 * 4 + 2]; // B + rgba[offset++] = 0xff; + } + + return rgba; + } + + static pal8(data: Uint8Array, palette: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + + for (let i = 0; i < data.length; i++) { + const colorIndex = data[i]; + + // Copy RGBA from palette + rgba[i * 4 + 0] = palette[colorIndex * 4 + 0]; // R + rgba[i * 4 + 1] = palette[colorIndex * 4 + 1]; // G + rgba[i * 4 + 2] = palette[colorIndex * 4 + 2]; // B + rgba[i * 4 + 3] = palette[colorIndex * 4 + 3]; // A + } + + return rgba; + } + + static pal8NoAlpha(data: Uint8Array, palette: Uint8Array, width: number, height: number): Uint8Array { + const rgba = new Uint8Array(4 * width * height); + + for (let i = 0; i < data.length; i++) { + const colorIndex = data[i]; + + // Copy RGB from palette + rgba[i * 4 + 0] = palette[colorIndex * 4 + 0]; // R + rgba[i * 4 + 1] = palette[colorIndex * 4 + 1]; // G + rgba[i * 4 + 2] = palette[colorIndex * 4 + 2]; // B + rgba[i * 4 + 3] = 0xff; + } + + return rgba; + } } \ No newline at end of file diff --git a/src/renderware/utils/ImageFormatEnums.ts b/src/renderware/utils/ImageFormatEnums.ts index dbb362a..c2c983e 100644 --- a/src/renderware/utils/ImageFormatEnums.ts +++ b/src/renderware/utils/ImageFormatEnums.ts @@ -1,28 +1,28 @@ export enum RasterFormat { - RASTER_1555 = 0x0100, - RASTER_565 = 0x0200, - RASTER_4444 = 0x0300, - RASTER_LUM = 0x0400, - RASTER_8888 = 0x0500, - RASTER_888 = 0x0600, - RASTER_555 = 0x0a00, + RASTER_1555 = 0x0100, + RASTER_565 = 0x0200, + RASTER_4444 = 0x0300, + RASTER_LUM = 0x0400, + RASTER_8888 = 0x0500, + RASTER_888 = 0x0600, + RASTER_555 = 0x0a00, } export enum D3DFormat { - D3DFMT_A8L8 = "3", - D3D_DXT1 = "DXT1", - D3D_DXT2 = "DXT2", - D3D_DXT3 = "DXT3", - D3D_DXT4 = "DXT4", - D3D_DXT5 = "DXT5", + D3DFMT_A8L8 = "3", + D3D_DXT1 = "DXT1", + D3D_DXT2 = "DXT2", + D3D_DXT3 = "DXT3", + D3D_DXT4 = "DXT4", + D3D_DXT5 = "DXT5", } export enum PaletteType { - PALETTE_NONE = 0, - PALETTE_8 = 1, + PALETTE_NONE = 0, + PALETTE_8 = 1, } export enum PlatformType { - D3D8 = 0x8, - D3D9 = 0x9, + D3D8 = 0x8, + D3D9 = 0x9, } \ No newline at end of file From bdcfd7bb0d1389eefa70bef787909f85f555dc6a Mon Sep 17 00:00:00 2001 From: AnriTool <59344539+AnriTool@users.noreply.github.com> Date: Wed, 18 Jun 2025 00:47:46 +1000 Subject: [PATCH 8/8] dxt-decompress jest tests --- src/renderware/txd/TxdParser.ts | 4 +- tests/assets/dxtDecoding.dxt-js.json | 1 + tests/assets/dxtDecoding.txd | Bin 0 -> 10664 bytes tests/txd/dxtDecoding.ts.test.ts | 57 +++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 tests/assets/dxtDecoding.dxt-js.json create mode 100644 tests/assets/dxtDecoding.txd create mode 100644 tests/txd/dxtDecoding.ts.test.ts diff --git a/src/renderware/txd/TxdParser.ts b/src/renderware/txd/TxdParser.ts index d0378ad..e7031ba 100644 --- a/src/renderware/txd/TxdParser.ts +++ b/src/renderware/txd/TxdParser.ts @@ -1,11 +1,11 @@ import { RwFile } from '../RwFile'; -import { ImageDecoder } from '../utils/ImageDecoder' +import { ImageDecoder } from '../utils/ImageDecoder'; import { D3DFormat, PaletteType, PlatformType, RasterFormat -} from '../utils/ImageFormatEnums' +} from '../utils/ImageFormatEnums'; export interface RwTxd { textureDictionary: RwTextureDictionary, diff --git a/tests/assets/dxtDecoding.dxt-js.json b/tests/assets/dxtDecoding.dxt-js.json new file mode 100644 index 0000000..67278dd --- /dev/null +++ b/tests/assets/dxtDecoding.dxt-js.json @@ -0,0 +1 @@ +{"DXT1":[0,0,0,0,255,0,0,255,255,0,0,255,255,65,0,255,255,223,0,255,255,223,0,255,197,221,8,255,82,219,24,255,8,178,49,255,5,194,106,255,0,227,222,255,0,227,222,255,0,97,189,255,54,32,167,255,82,0,156,255,82,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,154,148,255,0,227,231,255,0,227,231,255,0,154,148,255,8,186,49,255,90,209,32,255,172,232,16,255,255,255,0,255,255,178,0,255,255,62,0,255,255,4,0,255,255,4,0,255,255,0,0,255,255,0,0,255,255,0,0,255,255,65,0,255,255,223,0,255,255,223,0,255,197,221,8,255,82,219,24,255,8,178,49,255,5,194,106,255,0,227,222,255,0,227,222,255,0,97,189,255,54,32,167,255,82,0,156,255,82,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,154,148,255,0,227,231,255,0,227,231,255,0,154,148,255,8,186,49,255,90,209,32,255,172,232,16,255,255,255,0,255,255,178,0,255,255,62,0,255,255,4,0,255,255,4,0,255,255,0,0,255,255,0,0,255,255,0,0,255,255,65,0,255,255,223,0,255,255,223,0,255,197,221,8,255,82,219,24,255,8,178,49,255,5,194,106,255,0,227,222,255,0,227,222,255,0,97,189,255,54,32,167,255,82,0,156,255,82,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,154,148,255,0,227,231,255,0,227,231,255,0,154,148,255,8,186,49,255,90,209,32,255,172,232,16,255,255,255,0,255,255,178,0,255,255,62,0,255,255,4,0,255,255,4,0,255,255,65,0,255,255,65,0,255,255,65,0,255,255,65,0,255,255,223,0,255,255,223,0,255,197,221,8,255,82,219,24,255,8,178,49,255,5,194,106,255,0,227,222,255,0,227,222,255,0,97,189,255,54,32,167,255,82,0,156,255,82,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,154,148,255,0,227,231,255,0,227,231,255,0,154,148,255,8,186,49,255,90,209,32,255,172,232,16,255,255,255,0,255,255,178,0,255,255,62,0,255,255,62,0,255,255,62,0,255,255,231,0,255,255,231,0,255,255,231,0,255,255,231,0,255,197,235,8,255,255,247,0,255,197,235,8,255,82,211,24,255,0,178,49,255,0,194,109,255,0,227,231,255,0,227,231,255,0,97,189,255,49,32,167,255,74,0,156,255,74,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,139,6,173,255,24,12,148,255,24,12,148,255,0,148,152,255,0,227,222,255,0,227,222,255,0,148,152,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,227,0,255,255,227,0,255,255,227,0,255,255,227,0,255,255,231,0,255,255,231,0,255,255,231,0,255,255,231,0,255,255,247,0,255,255,247,0,255,197,235,8,255,82,211,24,255,0,178,49,255,0,194,109,255,0,227,231,255,0,227,231,255,0,97,189,255,49,32,167,255,74,0,156,255,74,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,139,6,173,255,24,12,148,255,24,12,148,255,0,148,152,255,0,227,222,255,0,227,222,255,0,148,152,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,227,0,255,255,227,0,255,255,227,0,255,255,227,0,255,197,228,8,255,197,228,8,255,197,228,8,255,197,228,8,255,197,235,8,255,197,235,8,255,197,235,8,255,82,211,24,255,0,178,49,255,0,194,109,255,0,227,231,255,0,227,231,255,0,97,189,255,49,32,167,255,74,0,156,255,74,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,139,6,173,255,24,12,148,255,24,12,148,255,0,148,152,255,0,227,222,255,0,227,222,255,0,148,152,255,8,182,49,255,90,206,32,255,172,230,16,255,172,230,16,255,197,224,8,255,197,224,8,255,197,224,8,255,197,224,8,255,82,223,24,255,82,223,24,255,82,223,24,255,82,223,24,255,82,211,24,255,82,211,24,255,82,211,24,255,82,211,24,255,0,178,49,255,0,194,109,255,0,227,231,255,0,227,231,255,0,97,189,255,49,32,167,255,74,0,156,255,74,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,234,0,193,255,144,0,169,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,139,6,173,255,24,12,148,255,24,12,148,255,0,148,152,255,0,227,222,255,0,227,222,255,0,148,152,255,8,182,49,255,90,206,32,255,90,206,32,255,90,206,32,255,82,219,24,255,82,219,24,255,82,219,24,255,82,219,24,255,8,178,57,255,8,178,57,255,8,178,57,255,8,178,57,255,0,178,49,255,0,178,49,255,0,178,49,255,0,178,49,255,0,178,57,255,0,194,112,255,0,227,222,255,0,227,222,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,0,189,255,239,0,189,255,239,0,189,255,159,1,172,255,77,8,161,255,154,4,175,255,231,0,189,255,231,0,189,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,148,152,255,0,227,222,255,0,227,222,255,0,148,152,255,0,178,49,255,0,178,49,255,0,178,49,255,0,178,49,255,8,182,57,255,8,182,57,255,8,182,57,255,8,182,57,255,5,194,112,255,5,194,112,255,5,194,112,255,5,194,112,255,0,194,106,255,0,194,106,255,0,194,106,255,0,194,106,255,0,194,112,255,0,194,112,255,0,227,222,255,0,227,222,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,239,0,189,255,239,0,189,255,159,1,172,255,79,2,156,255,0,12,148,255,77,8,161,255,154,4,175,255,231,0,189,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,148,152,255,0,227,222,255,0,227,222,255,0,148,152,255,0,194,106,255,0,194,106,255,0,194,106,255,0,194,106,255,5,197,112,255,5,197,112,255,5,197,112,255,5,197,112,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,239,0,189,255,159,1,172,255,79,2,156,255,0,4,140,255,0,12,148,255,0,12,148,255,77,8,161,255,154,4,175,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,148,152,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,234,0,193,255,159,1,172,255,79,2,156,255,0,4,140,255,0,4,140,255,0,12,148,255,0,12,148,255,0,12,148,255,77,8,161,255,144,0,169,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,148,152,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,36,156,255,0,36,156,255,46,24,159,255,140,0,165,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,0,189,255,231,0,189,255,231,0,189,255,154,1,172,255,16,4,148,255,16,4,148,255,16,4,148,255,10,81,183,255,0,101,189,255,0,32,156,255,0,32,156,255,0,32,156,255,77,8,161,255,154,4,175,255,231,0,189,255,231,0,189,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,139,4,173,255,24,8,148,255,24,8,148,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,49,32,167,255,49,32,167,255,49,32,167,255,49,32,167,255,44,32,161,255,44,32,161,255,44,32,161,255,44,32,161,255,44,33,161,255,44,33,161,255,44,33,161,255,44,33,161,255,0,36,156,255,0,36,156,255,46,24,159,255,140,0,165,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,231,0,189,255,231,0,189,255,154,1,172,255,77,2,156,255,16,4,148,255,16,4,148,255,10,81,183,255,10,81,183,255,0,170,222,255,0,101,189,255,0,32,156,255,0,32,156,255,0,12,148,255,77,8,161,255,154,4,175,255,231,0,189,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,139,4,173,255,24,8,148,255,24,8,148,255,49,33,167,255,49,33,167,255,49,33,167,255,49,33,167,255,49,33,167,255,49,33,167,255,49,33,167,255,49,33,167,255,49,32,167,255,49,32,167,255,49,32,167,255,49,32,167,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,46,24,159,255,46,24,159,255,46,24,159,255,140,0,165,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,231,0,189,255,154,1,172,255,77,2,156,255,0,4,140,255,16,4,148,255,10,81,183,255,10,81,183,255,5,158,219,255,0,239,255,255,0,170,222,255,0,101,189,255,0,32,156,255,0,12,148,255,0,12,148,255,77,8,161,255,154,4,175,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,139,4,173,255,24,8,148,255,24,8,148,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,140,0,165,255,140,0,165,255,140,0,165,255,140,0,165,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,234,0,193,255,154,1,172,255,77,2,156,255,0,4,140,255,0,4,140,255,10,81,183,255,10,81,183,255,5,158,219,255,0,235,255,255,0,239,255,255,0,239,255,255,0,170,222,255,0,101,189,255,0,12,148,255,0,12,148,255,0,12,148,255,77,8,161,255,144,0,169,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,139,4,173,255,139,4,173,255,139,4,173,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,239,0,189,255,239,0,189,255,239,0,189,255,159,1,172,255,16,4,148,255,16,4,148,255,16,4,148,255,10,82,183,255,0,182,140,255,0,214,216,255,0,231,255,255,0,214,216,255,2,209,173,255,0,223,231,255,0,223,231,255,0,223,231,255,0,101,195,255,0,32,165,255,0,32,165,255,0,32,165,255,77,10,161,255,154,5,175,255,231,0,189,255,231,0,189,255,247,0,198,255,0,0,0,0,0,0,0,0,247,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,0,0,0,0,255,0,198,255,239,0,189,255,239,0,189,255,159,1,172,255,79,2,156,255,16,4,148,255,16,4,148,255,10,82,183,255,10,82,183,255,0,214,216,255,0,231,255,255,0,214,216,255,0,182,140,255,5,195,115,255,2,209,173,255,0,223,231,255,0,223,231,255,0,170,225,255,0,101,195,255,0,32,165,255,0,32,165,255,0,16,148,255,77,10,161,255,154,5,175,255,231,0,189,255,247,0,198,255,247,0,198,255,0,0,0,0,247,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,239,0,189,255,159,1,172,255,79,2,156,255,0,4,140,255,16,4,148,255,10,82,183,255,10,82,183,255,5,160,219,255,0,231,255,255,0,214,216,255,0,182,140,255,0,182,140,255,8,182,57,255,5,195,115,255,2,209,173,255,0,223,231,255,0,239,255,255,0,170,225,255,0,101,195,255,0,32,165,255,0,16,148,255,0,16,148,255,77,10,161,255,154,5,175,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,234,0,193,255,159,1,172,255,79,2,156,255,0,4,140,255,0,4,140,255,10,82,183,255,10,82,183,255,5,160,219,255,0,239,255,255,0,214,216,255,0,182,140,255,0,182,140,255,0,182,140,255,8,182,57,255,8,182,57,255,5,195,115,255,2,209,173,255,0,239,255,255,0,239,255,255,0,170,225,255,0,101,195,255,0,16,148,255,0,16,148,255,0,16,148,255,77,10,161,255,144,0,169,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,0,189,255,239,0,189,255,239,0,189,255,159,1,172,255,16,0,140,255,16,0,140,255,16,0,140,255,10,60,173,255,0,186,140,255,0,216,216,255,0,231,255,255,0,216,216,255,8,186,74,255,8,186,74,255,8,186,74,255,8,186,74,255,71,203,38,255,8,182,57,255,8,182,57,255,8,182,57,255,2,209,173,255,0,223,231,255,0,223,231,255,0,223,231,255,0,101,186,255,0,32,156,255,0,32,156,255,0,32,156,255,82,8,161,255,156,4,175,255,231,0,189,255,231,0,189,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,239,0,189,255,239,0,189,255,159,1,172,255,79,2,156,255,16,0,140,255,16,0,140,255,10,60,173,255,5,121,206,255,0,216,216,255,0,231,255,255,0,216,216,255,0,186,140,255,8,186,74,255,8,186,74,255,8,186,74,255,65,206,49,255,134,225,19,255,71,203,38,255,8,182,57,255,8,182,57,255,5,195,115,255,2,209,173,255,0,223,231,255,0,223,231,255,0,170,216,255,0,101,186,255,0,32,156,255,0,32,156,255,8,12,148,255,82,8,161,255,156,4,175,255,231,0,189,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,239,0,189,255,159,1,172,255,79,2,156,255,0,4,140,255,16,0,140,255,10,60,173,255,5,121,206,255,0,182,239,255,0,231,255,255,0,216,216,255,0,186,140,255,0,186,140,255,8,186,74,255,8,186,74,255,65,206,49,255,123,226,24,255,198,247,0,255,134,225,19,255,71,203,38,255,8,182,57,255,8,182,57,255,5,195,115,255,2,209,173,255,0,223,231,255,0,239,247,255,0,170,216,255,0,101,186,255,0,32,156,255,8,12,148,255,8,12,148,255,82,8,161,255,156,4,175,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,234,0,193,255,159,1,172,255,79,2,156,255,0,4,140,255,0,4,140,255,10,60,173,255,5,121,206,255,0,182,239,255,0,182,239,255,0,216,216,255,0,186,140,255,0,186,140,255,0,186,140,255,8,186,74,255,65,206,49,255,123,226,24,255,181,247,0,255,198,247,0,255,198,247,0,255,134,225,19,255,71,203,38,255,8,182,57,255,8,182,57,255,5,195,115,255,2,209,173,255,0,239,247,255,0,239,247,255,0,170,216,255,0,101,186,255,8,12,148,255,8,12,148,255,8,12,148,255,82,8,161,255,144,0,169,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,0,189,255,239,0,189,255,239,0,189,255,162,1,172,255,16,0,140,255,16,0,140,255,16,0,140,255,10,60,173,255,0,182,140,255,0,212,216,255,0,227,255,255,0,212,216,255,8,186,74,255,8,186,74,255,8,186,74,255,8,186,74,255,189,239,8,255,189,239,8,255,189,239,8,255,189,239,8,255,222,247,8,255,222,247,8,255,222,247,8,255,222,247,8,255,71,203,38,255,8,182,57,255,8,182,57,255,8,182,57,255,0,209,173,255,0,223,231,255,0,223,231,255,0,223,231,255,0,101,195,255,0,32,165,255,0,32,165,255,0,32,165,255,77,10,161,255,154,5,175,255,231,0,189,255,231,0,189,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,239,0,189,255,239,0,189,255,162,1,172,255,85,2,156,255,16,0,140,255,16,0,140,255,10,60,173,255,5,121,206,255,0,212,216,255,0,227,255,255,0,212,216,255,0,182,140,255,8,186,74,255,8,186,74,255,8,186,74,255,65,206,49,255,189,239,8,255,189,239,8,255,189,239,8,255,189,239,8,255,233,189,5,255,222,247,8,255,222,247,8,255,222,247,8,255,134,225,19,255,71,203,38,255,8,182,57,255,8,182,57,255,0,195,115,255,0,209,173,255,0,223,231,255,0,223,231,255,0,170,225,255,0,101,195,255,0,32,165,255,0,32,165,255,0,16,148,255,77,10,161,255,154,5,175,255,231,0,189,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,239,0,189,255,162,1,172,255,85,2,156,255,8,4,140,255,16,0,140,255,10,60,173,255,5,121,206,255,0,182,239,255,0,227,255,255,0,212,216,255,0,182,140,255,0,182,140,255,8,186,74,255,8,186,74,255,65,206,49,255,123,226,24,255,189,239,8,255,189,239,8,255,189,239,8,255,222,188,4,255,244,131,2,255,233,189,5,255,222,247,8,255,222,247,8,255,198,247,0,255,134,225,19,255,71,203,38,255,8,182,57,255,0,182,57,255,0,195,115,255,0,209,173,255,0,223,231,255,0,239,255,255,0,170,225,255,0,101,195,255,0,32,165,255,0,16,148,255,0,16,148,255,77,10,161,255,154,5,175,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,234,0,193,255,162,1,172,255,85,2,156,255,8,4,140,255,8,4,140,255,10,60,173,255,5,121,206,255,0,182,239,255,0,182,239,255,0,212,216,255,0,182,140,255,0,182,140,255,0,182,140,255,8,186,74,255,65,206,49,255,123,226,24,255,181,247,0,255,189,239,8,255,189,239,8,255,222,188,4,255,255,138,0,255,255,73,0,255,244,131,2,255,233,189,5,255,222,247,8,255,198,247,0,255,198,247,0,255,134,225,19,255,71,203,38,255,0,182,57,255,0,182,57,255,0,195,115,255,0,209,173,255,0,239,255,255,0,239,255,255,0,170,225,255,0,101,195,255,0,16,148,255,0,16,148,255,0,16,148,255,77,10,161,255,144,0,169,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,0,189,255,239,0,189,255,239,0,189,255,159,1,172,255,16,0,140,255,16,0,140,255,16,0,140,255,10,62,173,255,0,182,140,255,0,214,216,255,0,231,255,255,0,214,216,255,8,186,74,255,8,186,74,255,8,186,74,255,8,186,74,255,189,239,8,255,189,239,8,255,189,239,8,255,189,239,8,255,255,207,0,255,255,207,0,255,255,138,0,255,255,69,0,255,255,4,0,255,255,77,0,255,255,150,0,255,255,150,0,255,222,247,8,255,222,247,8,255,222,247,8,255,222,247,8,255,71,205,38,255,8,182,57,255,8,182,57,255,8,182,57,255,0,209,173,255,0,223,231,255,0,223,231,255,0,223,231,255,0,101,195,255,0,32,165,255,0,32,165,255,0,32,165,255,77,8,161,255,154,4,175,255,231,0,189,255,231,0,189,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,239,0,189,255,239,0,189,255,159,1,172,255,79,2,156,255,16,0,140,255,16,0,140,255,10,62,173,255,5,124,206,255,0,214,216,255,0,231,255,255,0,214,216,255,0,182,140,255,8,186,74,255,8,186,74,255,8,186,74,255,65,206,49,255,189,239,8,255,189,239,8,255,189,239,8,255,189,239,8,255,255,207,0,255,255,138,0,255,255,69,0,255,255,0,0,255,255,4,0,255,255,4,0,255,255,77,0,255,255,150,0,255,233,189,5,255,222,247,8,255,222,247,8,255,222,247,8,255,134,228,19,255,71,205,38,255,8,182,57,255,8,182,57,255,0,195,115,255,0,209,173,255,0,223,231,255,0,223,231,255,0,170,225,255,0,101,195,255,0,32,165,255,0,32,165,255,0,12,148,255,77,8,161,255,154,4,175,255,231,0,189,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,239,0,189,255,159,1,172,255,79,2,156,255,0,4,140,255,16,0,140,255,10,62,173,255,5,124,206,255,0,186,239,255,0,231,255,255,0,214,216,255,0,182,140,255,0,182,140,255,8,186,74,255,8,186,74,255,65,206,49,255,123,226,24,255,189,239,8,255,189,239,8,255,189,239,8,255,222,186,4,255,255,138,0,255,255,69,0,255,255,0,0,255,255,0,0,255,255,4,0,255,255,4,0,255,255,4,0,255,255,77,0,255,244,131,2,255,233,189,5,255,222,247,8,255,222,247,8,255,198,251,0,255,134,228,19,255,71,205,38,255,8,182,57,255,0,182,57,255,0,195,115,255,0,209,173,255,0,223,231,255,0,239,255,255,0,170,225,255,0,101,195,255,0,32,165,255,0,12,148,255,0,12,148,255,77,8,161,255,154,4,175,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,234,0,193,255,159,1,172,255,79,2,156,255,0,4,140,255,0,4,140,255,10,62,173,255,5,124,206,255,0,186,239,255,0,186,239,255,0,214,216,255,0,182,140,255,0,182,140,255,0,182,140,255,8,186,74,255,65,206,49,255,123,226,24,255,181,247,0,255,189,239,8,255,189,239,8,255,222,186,4,255,255,134,0,255,255,69,0,255,255,0,0,255,255,0,0,255,255,0,0,255,0,0,0,0,255,4,0,255,255,4,0,255,255,4,0,255,255,73,0,255,244,131,2,255,233,189,5,255,222,247,8,255,198,251,0,255,198,251,0,255,134,228,19,255,71,205,38,255,0,182,57,255,0,182,57,255,0,195,115,255,0,209,173,255,0,239,255,255,0,239,255,255,0,170,225,255,0,101,195,255,0,12,148,255,0,12,148,255,0,12,148,255,77,8,161,255,144,0,169,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,247,0,198,255,144,0,169,255,82,8,161,255,8,12,148,255,8,12,148,255,8,12,148,255,0,101,195,255,0,170,225,255,0,239,255,255,0,239,255,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,198,247,0,255,222,247,8,255,233,189,5,255,244,131,2,255,255,73,0,255,255,4,0,255,255,4,0,255,255,4,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,4,0,255,255,4,0,255,255,52,0,255,255,52,0,255,249,118,0,255,244,184,0,255,206,247,0,255,206,247,0,255,206,247,0,255,137,225,16,255,16,186,49,255,16,186,49,255,16,186,49,255,10,201,109,255,0,231,231,255,0,231,231,255,0,231,231,255,0,167,211,255,0,32,156,255,0,32,156,255,0,32,156,255,0,32,156,255,66,0,148,255,152,0,173,255,239,0,198,255,239,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,247,0,198,255,156,4,175,255,82,8,161,255,8,12,148,255,8,12,148,255,0,32,165,255,0,101,195,255,0,170,225,255,0,239,255,255,0,223,231,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,222,247,8,255,222,247,8,255,233,189,5,255,244,131,2,255,255,77,0,255,255,4,0,255,255,4,0,255,255,4,0,255,0,0,0,0,255,4,0,255,255,4,0,255,255,4,0,255,255,52,0,255,249,118,0,255,244,184,0,255,239,251,0,255,206,247,0,255,206,247,0,255,137,225,16,255,68,203,32,255,16,186,49,255,16,186,49,255,10,201,109,255,5,216,170,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,0,32,156,255,0,32,156,255,0,32,156,255,74,21,164,255,152,0,173,255,239,0,198,255,239,0,198,255,239,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,231,0,189,255,156,4,175,255,82,8,161,255,8,12,148,255,0,32,165,255,0,32,165,255,0,101,195,255,0,170,225,255,0,223,231,255,0,223,231,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,222,247,8,255,222,247,8,255,222,247,8,255,233,189,5,255,255,150,0,255,255,77,0,255,255,4,0,255,255,4,0,255,255,4,0,255,255,4,0,255,255,4,0,255,255,67,0,255,249,118,0,255,244,184,0,255,239,251,0,255,239,251,0,255,206,247,0,255,137,225,16,255,68,203,32,255,0,182,49,255,16,186,49,255,10,201,109,255,5,216,170,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,0,32,156,255,0,32,156,255,74,21,164,255,148,10,172,255,239,0,198,255,239,0,198,255,239,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,231,0,189,255,231,0,189,255,156,4,175,255,82,8,161,255,0,32,165,255,0,32,165,255,0,32,165,255,0,101,195,255,0,223,231,255,0,223,231,255,0,223,231,255,2,209,173,255,8,182,57,255,8,182,57,255,8,182,57,255,71,203,38,255,222,247,8,255,222,247,8,255,222,247,8,255,222,247,8,255,255,150,0,255,255,150,0,255,255,77,0,255,255,4,0,255,255,4,0,255,255,4,0,255,255,67,0,255,255,130,0,255,244,184,0,255,239,251,0,255,239,251,0,255,239,251,0,255,137,225,16,255,68,203,32,255,0,182,49,255,0,182,49,255,10,201,109,255,5,216,170,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,0,40,173,255,0,32,156,255,74,21,164,255,148,10,172,255,222,0,181,255,239,0,198,255,239,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,247,0,198,255,144,0,169,255,77,10,161,255,0,16,148,255,0,16,148,255,0,16,148,255,0,101,186,255,0,170,216,255,0,239,247,255,0,239,247,255,0,209,173,255,0,195,115,255,0,182,57,255,0,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,198,247,0,255,222,247,8,255,233,187,5,255,244,128,2,255,255,69,0,255,255,52,0,255,255,52,0,255,249,118,0,255,244,184,0,255,206,247,0,255,206,247,0,255,206,247,0,255,137,225,16,255,16,182,49,255,16,182,49,255,16,182,49,255,10,198,106,255,0,231,231,255,0,231,231,255,0,231,231,255,0,167,211,255,8,24,156,255,8,24,156,255,8,24,156,255,8,24,156,255,66,0,148,255,156,0,173,255,247,0,198,255,247,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,247,0,198,255,154,5,175,255,77,10,161,255,0,16,148,255,0,16,148,255,0,32,156,255,0,101,186,255,0,170,216,255,0,239,247,255,0,223,231,255,0,209,173,255,0,195,115,255,0,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,222,247,8,255,222,247,8,255,233,187,5,255,244,128,2,255,255,52,0,255,249,118,0,255,244,184,0,255,239,251,0,255,206,247,0,255,206,247,0,255,137,225,16,255,68,203,32,255,16,182,49,255,16,182,49,255,10,198,106,255,5,214,164,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,8,24,156,255,8,24,156,255,8,24,156,255,79,16,164,255,156,0,173,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,231,0,189,255,154,5,175,255,77,10,161,255,0,16,148,255,0,32,156,255,0,32,156,255,0,101,186,255,0,170,216,255,0,223,231,255,0,223,231,255,0,209,173,255,0,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,222,247,8,255,222,247,8,255,222,247,8,255,233,187,5,255,249,118,0,255,244,184,0,255,239,251,0,255,239,251,0,255,206,247,0,255,137,225,16,255,68,203,32,255,0,182,49,255,16,182,49,255,10,198,106,255,5,214,164,255,0,231,222,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,8,24,156,255,8,24,156,255,79,16,164,255,150,8,172,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,231,0,189,255,231,0,189,255,154,5,175,255,77,10,161,255,0,32,156,255,0,32,156,255,0,32,156,255,0,101,186,255,0,223,231,255,0,223,231,255,0,223,231,255,0,209,173,255,8,182,57,255,8,182,57,255,8,182,57,255,71,203,38,255,222,247,8,255,222,247,8,255,222,247,8,255,222,247,8,255,244,184,0,255,239,251,0,255,239,251,0,255,239,251,0,255,137,225,16,255,68,203,32,255,0,182,49,255,0,182,49,255,10,198,106,255,5,214,164,255,0,231,222,255,0,231,222,255,0,167,211,255,0,103,192,255,0,40,173,255,0,40,173,255,8,24,156,255,79,16,164,255,150,8,172,255,222,0,181,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,247,0,198,255,144,0,169,255,82,8,161,255,8,12,148,255,8,12,148,255,8,12,148,255,0,101,195,255,0,170,225,255,0,239,255,255,0,239,255,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,198,247,0,255,206,247,0,255,206,247,0,255,206,247,0,255,137,225,16,255,16,182,57,255,16,182,57,255,16,182,57,255,10,198,112,255,0,231,231,255,0,231,231,255,0,231,231,255,0,167,211,255,0,32,156,255,0,32,156,255,0,32,156,255,0,32,156,255,66,0,148,255,156,0,173,255,247,0,198,255,247,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,247,0,198,255,156,4,175,255,82,8,161,255,8,12,148,255,8,12,148,255,0,32,165,255,0,101,195,255,0,170,225,255,0,239,255,255,0,223,231,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,206,247,0,255,206,247,0,255,137,225,16,255,68,203,32,255,16,182,57,255,16,182,57,255,10,198,112,255,5,214,167,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,0,32,156,255,0,32,156,255,0,32,156,255,74,21,164,255,156,0,173,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,231,0,189,255,156,4,175,255,82,8,161,255,8,12,148,255,0,32,165,255,0,32,165,255,0,101,195,255,0,170,225,255,0,223,231,255,0,223,231,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,206,247,0,255,137,225,16,255,68,203,32,255,0,182,49,255,16,182,57,255,10,198,112,255,5,214,167,255,0,231,222,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,0,32,156,255,0,32,156,255,74,21,164,255,148,10,172,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,231,0,189,255,231,0,189,255,156,4,175,255,82,8,161,255,0,32,165,255,0,32,165,255,0,32,165,255,0,101,195,255,0,223,231,255,0,223,231,255,0,223,231,255,2,209,173,255,8,182,57,255,8,182,57,255,8,182,57,255,71,203,38,255,137,225,16,255,68,203,32,255,0,182,49,255,0,182,49,255,10,198,112,255,5,214,167,255,0,231,222,255,0,231,222,255,0,167,211,255,0,103,192,255,0,40,173,255,0,40,173,255,0,32,156,255,74,21,164,255,148,10,172,255,222,0,181,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,247,0,198,255,144,0,169,255,77,8,161,255,0,12,148,255,0,12,148,255,0,12,148,255,0,101,186,255,0,170,216,255,0,239,247,255,0,239,247,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,16,182,49,255,16,182,49,255,16,182,49,255,10,198,106,255,0,231,231,255,0,231,231,255,0,231,231,255,0,167,211,255,8,28,156,255,8,28,156,255,8,28,156,255,8,28,156,255,66,0,148,255,152,0,173,255,239,0,198,255,239,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,247,0,198,255,154,4,175,255,77,8,161,255,0,12,148,255,0,12,148,255,0,32,156,255,0,101,186,255,0,170,216,255,0,239,247,255,0,223,231,255,2,209,173,255,5,195,115,255,8,182,57,255,16,182,49,255,16,182,49,255,10,198,106,255,5,214,164,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,8,28,156,255,8,28,156,255,8,28,156,255,79,18,164,255,152,0,173,255,239,0,198,255,239,0,198,255,239,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,231,0,189,255,154,4,175,255,77,8,161,255,0,12,148,255,0,32,156,255,0,32,156,255,0,101,186,255,0,170,216,255,0,223,231,255,0,223,231,255,2,209,173,255,5,195,115,255,16,182,49,255,10,198,106,255,5,214,164,255,0,231,222,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,8,28,156,255,8,28,156,255,79,18,164,255,150,9,172,255,239,0,198,255,239,0,198,255,239,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,247,0,198,255,231,0,189,255,231,0,189,255,154,4,175,255,77,8,161,255,0,32,156,255,0,32,156,255,0,32,156,255,0,101,186,255,0,223,231,255,0,223,231,255,0,223,231,255,2,209,173,255,10,198,106,255,5,214,164,255,0,231,222,255,0,231,222,255,0,167,211,255,0,103,192,255,0,40,173,255,0,40,173,255,8,28,156,255,79,18,164,255,150,9,172,255,222,0,181,255,239,0,198,255,239,0,198,255,0,0,0,0,239,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,247,0,198,255,144,0,169,255,82,8,161,255,8,12,148,255,8,12,148,255,8,12,148,255,0,101,195,255,0,170,225,255,0,239,255,255,0,239,255,255,0,231,231,255,0,231,231,255,0,231,231,255,0,167,211,255,8,28,156,255,8,28,156,255,8,28,156,255,8,28,156,255,66,0,148,255,156,0,173,255,247,0,198,255,247,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,255,0,198,255,135,6,173,255,135,6,173,255,135,6,173,255,135,6,173,255,135,6,173,255,135,6,173,255,135,6,173,255,135,6,173,255,139,4,173,255,139,4,173,255,139,4,173,255,139,4,173,255,139,4,173,255,139,4,173,255,139,4,173,255,139,4,173,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,247,0,198,255,156,4,175,255,82,8,161,255,8,12,148,255,8,12,148,255,0,32,165,255,0,101,195,255,0,170,225,255,0,239,255,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,8,28,156,255,8,28,156,255,8,28,156,255,79,18,164,255,156,0,173,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,139,4,173,255,139,4,173,255,139,4,173,255,135,6,173,255,135,6,173,255,135,6,173,255,135,6,173,255,139,4,173,255,139,4,173,255,139,4,173,255,139,4,173,255,135,6,173,255,135,6,173,255,135,6,173,255,135,6,173,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,24,8,148,255,24,8,148,255,24,8,148,255,24,8,148,255,24,8,148,255,24,8,148,255,24,8,148,255,139,4,173,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,231,0,189,255,156,4,175,255,82,8,161,255,8,12,148,255,0,32,165,255,0,32,165,255,0,101,195,255,0,170,225,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,8,28,156,255,8,28,156,255,79,18,164,255,150,9,172,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,139,4,173,255,24,8,148,255,24,8,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,24,8,148,255,24,8,148,255,24,8,148,255,24,8,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,24,8,148,255,24,8,148,255,24,8,148,255,24,8,148,255,24,8,148,255,24,8,148,255,24,8,148,255,139,4,173,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,231,0,189,255,231,0,189,255,156,4,175,255,82,8,161,255,0,32,165,255,0,32,165,255,0,32,165,255,0,101,195,255,0,167,211,255,0,103,192,255,0,40,173,255,0,40,173,255,8,28,156,255,79,18,164,255,150,9,172,255,222,0,181,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,139,4,173,255,24,8,148,255,24,8,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,24,8,148,255,24,8,148,255,24,8,148,255,24,8,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,0,101,173,255,0,101,173,255,0,101,173,255,0,101,173,255,0,148,153,255,0,148,153,255,0,148,153,255,0,148,153,255,0,101,173,255,0,101,173,255,0,101,173,255,0,101,173,255,0,101,189,255,44,33,161,255,66,0,148,255,66,0,148,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,247,0,198,255,144,0,169,255,77,8,161,255,0,12,148,255,0,12,148,255,0,12,148,255,0,32,156,255,0,32,156,255,0,32,156,255,0,32,156,255,66,0,148,255,156,0,173,255,247,0,198,255,247,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,139,6,173,255,24,12,148,255,24,12,148,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,173,255,0,101,173,255,0,101,173,255,0,101,173,255,0,159,140,255,0,159,140,255,0,159,140,255,0,159,140,255,0,227,189,255,0,227,189,255,0,227,189,255,0,227,189,255,0,227,231,255,0,227,231,255,0,227,231,255,0,227,231,255,0,227,214,255,0,227,214,255,0,227,214,255,0,227,214,255,0,101,189,255,44,33,161,255,66,0,148,255,66,0,148,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,247,0,198,255,154,4,175,255,77,8,161,255,0,12,148,255,0,12,148,255,0,32,156,255,0,32,156,255,0,32,156,255,74,21,164,255,156,0,173,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,139,6,173,255,24,12,148,255,24,12,148,255,0,101,189,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,206,255,0,227,206,255,0,227,206,255,0,227,206,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,189,255,0,227,189,255,0,227,189,255,0,227,189,255,0,227,231,255,0,227,231,255,0,227,231,255,0,227,231,255,0,227,214,255,0,227,214,255,0,227,214,255,0,227,214,255,0,101,189,255,44,33,161,255,66,0,148,255,66,0,148,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,231,0,189,255,154,4,175,255,77,8,161,255,0,12,148,255,0,32,156,255,0,32,156,255,74,21,164,255,148,10,172,255,247,0,198,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,139,6,173,255,24,12,148,255,24,12,148,255,0,101,189,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,206,255,0,227,206,255,0,227,206,255,0,227,206,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,185,183,255,0,185,183,255,0,185,183,255,0,185,183,255,0,148,153,255,0,148,153,255,0,148,153,255,0,148,153,255,0,185,200,255,0,185,200,255,0,227,214,255,0,227,214,255,0,101,189,255,44,33,161,255,66,0,148,255,66,0,148,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,231,0,189,255,231,0,189,255,154,4,175,255,77,8,161,255,0,32,156,255,74,21,164,255,148,10,172,255,222,0,181,255,247,0,198,255,247,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,139,6,173,255,24,12,148,255,24,12,148,255,0,101,189,255,0,227,222,255,0,227,222,255,0,185,211,255,0,185,195,255,0,185,195,255,0,185,195,255,0,185,195,255,0,159,140,255,0,159,140,255,0,159,140,255,0,159,140,255,8,186,49,255,8,186,49,255,8,186,49,255,8,186,49,255,8,182,49,255,8,182,49,255,8,182,49,255,8,182,49,255,0,178,57,255,0,194,112,255,0,227,222,255,0,227,222,255,0,97,189,255,49,32,161,255,74,0,148,255,74,0,148,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,247,0,198,255,144,0,169,255,66,0,148,255,152,0,173,255,239,0,198,255,239,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,101,173,255,0,231,198,255,0,231,198,255,0,187,189,255,0,182,49,255,0,182,49,255,0,182,49,255,0,182,49,255,8,186,49,255,8,186,49,255,8,186,49,255,8,186,49,255,90,209,32,255,90,209,32,255,90,209,32,255,90,209,32,255,74,205,35,255,74,205,35,255,74,205,35,255,74,205,35,255,0,178,57,255,0,194,112,255,0,227,222,255,0,227,222,255,0,97,189,255,49,32,161,255,74,0,148,255,74,0,148,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,247,0,198,255,152,0,173,255,239,0,198,255,239,0,198,255,239,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,101,173,255,0,231,198,255,0,231,198,255,0,187,189,255,0,182,49,255,85,206,32,255,85,206,32,255,85,206,32,255,90,209,32,255,90,209,32,255,90,209,32,255,90,209,32,255,172,232,16,255,172,232,16,255,172,232,16,255,172,232,16,255,206,251,8,255,206,251,8,255,206,251,8,255,74,205,35,255,0,178,57,255,0,194,112,255,0,227,222,255,0,227,222,255,0,97,189,255,49,32,161,255,74,0,148,255,74,0,148,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,247,0,198,255,239,0,198,255,239,0,198,255,239,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,101,173,255,0,231,198,255,0,231,198,255,0,187,189,255,0,182,49,255,85,206,32,255,170,230,16,255,170,230,16,255,172,232,16,255,172,232,16,255,172,232,16,255,172,232,16,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,206,251,8,255,206,251,8,255,206,251,8,255,74,205,35,255,0,178,57,255,0,194,112,255,0,227,222,255,0,227,222,255,0,97,189,255,49,32,161,255,74,0,148,255,74,0,148,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,0,198,255,239,0,198,255,239,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,101,173,255,0,231,198,255,0,231,198,255,0,187,189,255,0,182,49,255,85,206,32,255,170,230,16,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,174,0,255,255,174,0,255,255,174,0,255,255,174,0,255,255,231,0,255,255,231,0,255,197,227,8,255,82,219,24,255,8,178,57,255,5,194,109,255,0,227,214,255,0,227,214,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,159,143,255,0,227,231,255,0,227,231,255,0,159,143,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,174,0,255,255,174,0,255,255,174,0,255,255,174,0,255,255,60,0,255,255,60,0,255,255,60,0,255,255,60,0,255,255,231,0,255,255,231,0,255,197,227,8,255,82,219,24,255,8,178,57,255,5,194,109,255,0,227,214,255,0,227,214,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,159,143,255,0,227,231,255,0,227,231,255,0,159,143,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,174,0,255,255,60,0,255,255,60,0,255,255,60,0,255,255,4,0,255,255,4,0,255,255,4,0,255,255,60,0,255,255,231,0,255,255,231,0,255,197,227,8,255,82,219,24,255,8,178,57,255,5,194,109,255,0,227,214,255,0,227,214,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,159,143,255,0,227,231,255,0,227,231,255,0,159,143,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,174,0,255,255,60,0,255,255,4,0,255,255,4,0,255,255,4,0,255,255,4,0,255,255,4,0,255,255,60,0,255,255,231,0,255,255,231,0,255,197,227,8,255,82,219,24,255,8,178,57,255,5,194,109,255,0,227,214,255,0,227,214,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,255,255,0,198,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,198,255,255,0,198,255,135,6,173,255,16,12,148,255,16,12,148,255,0,159,143,255,0,227,231,255,0,227,231,255,0,159,143,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,174,0,255,255,60,0,255,255,4,0,255,255,4,0,255],"DXT3":[255,0,0,0,255,0,0,170,255,0,0,255,255,65,0,255,255,223,0,255,255,223,0,255,197,221,8,255,82,219,24,255,8,178,49,255,5,194,106,255,0,227,222,255,0,227,222,255,0,97,189,255,54,32,167,255,82,0,156,255,82,0,156,255,255,0,198,238,255,0,198,170,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,153,148,255,0,227,231,255,0,227,231,255,0,153,148,255,8,186,49,255,90,209,32,255,172,232,16,255,255,255,0,255,255,178,0,255,255,62,0,255,255,4,0,255,255,4,0,170,255,0,0,170,255,0,0,170,255,0,0,255,255,65,0,255,255,223,0,255,255,223,0,255,197,221,8,255,82,219,24,255,8,178,49,255,5,194,106,255,0,227,222,255,0,227,222,255,0,97,189,255,54,32,167,255,82,0,156,255,82,0,156,255,255,0,198,238,255,0,198,170,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,153,148,255,0,227,231,255,0,227,231,255,0,153,148,255,8,186,49,255,90,209,32,255,172,232,16,255,255,255,0,255,255,178,0,255,255,62,0,255,255,4,0,255,255,4,0,170,255,0,0,255,255,0,0,255,255,0,0,255,255,65,0,255,255,223,0,255,255,223,0,255,197,221,8,255,82,219,24,255,8,178,49,255,5,194,106,255,0,227,222,255,0,227,222,255,0,97,189,255,54,32,167,255,82,0,156,255,82,0,156,255,255,0,198,238,255,0,198,170,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,153,148,255,0,227,231,255,0,227,231,255,0,153,148,255,8,186,49,255,90,209,32,255,172,232,16,255,255,255,0,255,255,178,0,255,255,62,0,255,255,4,0,255,255,4,0,255,255,65,0,255,255,65,0,255,255,65,0,255,255,65,0,255,255,223,0,255,255,223,0,255,197,221,8,255,82,219,24,255,8,178,49,255,5,194,106,255,0,227,222,255,0,227,222,255,0,97,189,255,54,32,167,255,82,0,156,255,82,0,156,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,153,148,255,0,227,231,255,0,227,231,255,0,153,148,255,8,186,49,255,90,209,32,255,172,232,16,255,255,255,0,255,255,178,0,255,255,62,0,255,255,62,0,255,255,62,0,255,255,231,0,255,255,231,0,255,255,231,0,255,255,231,0,255,197,235,8,255,255,247,0,255,197,235,8,255,82,211,24,255,0,178,49,255,0,194,109,255,0,227,231,255,0,227,231,255,0,97,189,255,49,32,167,255,74,0,156,255,74,0,156,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,148,150,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,227,0,255,255,227,0,255,255,227,0,255,255,227,0,255,255,231,0,255,255,231,0,255,255,231,0,255,255,231,0,255,255,247,0,255,255,247,0,255,197,235,8,255,82,211,24,255,0,178,49,255,0,194,109,255,0,227,231,255,0,227,231,255,0,97,189,255,49,32,167,255,74,0,156,255,74,0,156,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,148,150,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,227,0,255,255,227,0,255,255,227,0,255,255,227,0,255,197,228,8,255,197,228,8,255,197,228,8,255,197,228,8,255,197,235,8,255,197,235,8,255,197,235,8,255,82,211,24,255,0,178,49,255,0,194,109,255,0,227,231,255,0,227,231,255,0,97,189,255,49,32,167,255,74,0,156,255,74,0,156,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,219,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,148,150,255,8,182,49,255,90,206,32,255,172,230,16,255,172,230,16,255,197,224,8,255,197,224,8,255,197,224,8,255,197,224,8,255,82,223,24,255,82,223,24,255,82,223,24,255,82,223,24,255,82,211,24,255,82,211,24,255,82,211,24,255,82,211,24,255,0,178,49,255,0,194,109,255,0,227,231,255,0,227,231,255,0,97,189,255,49,32,167,255,74,0,156,255,74,0,156,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,233,0,192,255,148,0,173,255,219,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,148,150,255,8,182,49,255,90,206,32,255,90,206,32,255,90,206,32,255,82,219,24,255,82,219,24,255,82,219,24,255,82,219,24,255,8,178,57,255,8,178,57,255,8,178,57,255,8,178,57,255,0,178,49,255,0,178,49,255,0,178,49,255,0,178,49,255,0,178,57,255,0,194,112,255,0,227,222,255,0,227,222,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,239,0,189,204,239,0,189,238,239,0,189,255,159,1,172,255,77,8,161,255,154,4,175,255,231,0,189,255,231,0,189,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,148,150,255,0,178,49,255,0,178,49,255,0,178,49,255,0,178,49,255,8,182,57,255,8,182,57,255,8,182,57,255,8,182,57,255,5,194,112,255,5,194,112,255,5,194,112,255,5,194,112,255,0,194,106,255,0,194,106,255,0,194,106,255,0,194,106,255,0,194,112,255,0,194,112,255,0,227,222,255,0,227,222,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,239,0,189,238,239,0,189,255,159,1,172,255,79,2,156,255,0,12,148,255,77,8,161,255,154,4,175,255,231,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,148,150,255,0,194,106,255,0,194,106,255,0,194,106,255,0,194,106,255,5,197,112,255,5,197,112,255,5,197,112,255,5,197,112,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,239,0,189,255,159,1,172,255,79,2,156,255,0,4,140,255,0,12,148,255,0,12,148,255,77,8,161,255,154,4,175,255,219,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,233,0,192,255,159,1,172,255,79,2,156,255,0,4,140,255,0,4,140,255,0,12,148,255,0,12,148,255,0,12,148,255,77,8,161,255,148,0,173,255,219,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,36,156,255,0,36,156,255,46,24,159,255,140,0,165,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,231,0,189,204,231,0,189,238,231,0,189,255,154,1,172,255,16,4,148,255,16,4,148,255,16,4,148,255,10,81,183,255,0,101,189,255,0,32,156,255,0,32,156,255,0,32,156,255,77,8,161,255,154,4,175,255,231,0,189,255,231,0,189,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,2,175,255,16,8,148,255,16,8,148,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,49,32,167,255,49,32,167,255,49,32,167,255,49,32,167,255,44,32,161,255,44,32,161,255,44,32,161,255,44,32,161,255,44,33,161,255,44,33,161,255,44,33,161,255,44,33,161,255,0,36,156,255,0,36,156,255,46,24,159,255,140,0,165,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,231,0,189,238,231,0,189,255,154,1,172,255,77,2,156,255,16,4,148,255,16,4,148,255,10,81,183,255,10,81,183,255,0,170,222,255,0,101,189,255,0,32,156,255,0,32,156,255,0,12,148,255,77,8,161,255,154,4,175,255,231,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,2,175,255,16,8,148,255,16,8,148,255,49,33,167,255,49,33,167,255,49,33,167,255,49,33,167,255,49,33,167,255,49,33,167,255,49,33,167,255,49,33,167,255,49,32,167,255,49,32,167,255,49,32,167,255,49,32,167,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,46,24,159,255,46,24,159,255,46,24,159,255,140,0,165,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,231,0,189,255,154,1,172,255,77,2,156,255,0,4,140,255,16,4,148,255,10,81,183,255,10,81,183,255,5,158,219,255,0,239,255,255,0,170,222,255,0,101,189,255,0,32,156,255,0,12,148,255,0,12,148,255,77,8,161,255,154,4,175,255,219,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,2,175,255,16,8,148,255,16,8,148,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,140,0,165,255,140,0,165,255,140,0,165,255,140,0,165,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,233,0,192,255,154,1,172,255,77,2,156,255,0,4,140,255,0,4,140,255,10,81,183,255,10,81,183,255,5,158,219,255,0,235,255,255,0,239,255,255,0,239,255,255,0,170,222,255,0,101,189,255,0,12,148,255,0,12,148,255,0,12,148,255,77,8,161,255,148,0,173,255,219,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,2,175,255,164,2,175,255,164,2,175,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,102,239,0,189,204,239,0,189,238,239,0,189,255,159,1,172,255,16,4,148,255,16,4,148,255,16,4,148,255,10,82,183,255,0,182,140,255,0,214,216,255,0,231,255,255,0,214,216,255,2,209,173,255,0,223,231,255,0,223,231,255,0,223,231,255,0,101,195,255,0,32,165,255,0,32,165,255,0,32,165,255,77,10,161,255,154,5,175,255,231,0,189,255,231,0,189,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,170,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,238,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,102,255,0,198,204,239,0,189,238,239,0,189,255,159,1,172,255,79,2,156,255,16,4,148,255,16,4,148,255,10,82,183,255,10,82,183,255,0,214,216,255,0,231,255,255,0,214,216,255,0,182,140,255,5,195,115,255,2,209,173,255,0,223,231,255,0,223,231,255,0,170,225,255,0,101,195,255,0,32,165,255,0,32,165,255,0,16,148,255,77,10,161,255,154,5,175,255,231,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,239,0,189,255,159,1,172,255,79,2,156,255,0,4,140,255,16,4,148,255,10,82,183,255,10,82,183,255,5,160,219,255,0,231,255,255,0,214,216,255,0,182,140,255,0,182,140,255,8,182,57,255,5,195,115,255,2,209,173,255,0,223,231,255,0,239,255,255,0,170,225,255,0,101,195,255,0,32,165,255,0,16,148,255,0,16,148,255,77,10,161,255,154,5,175,255,219,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,233,0,192,255,159,1,172,255,79,2,156,255,0,4,140,255,0,4,140,255,10,82,183,255,10,82,183,255,5,160,219,255,0,239,255,255,0,214,216,255,0,182,140,255,0,182,140,255,0,182,140,255,8,182,57,255,8,182,57,255,5,195,115,255,2,209,173,255,0,239,255,255,0,239,255,255,0,170,225,255,0,101,195,255,0,16,148,255,0,16,148,255,0,16,148,255,77,10,161,255,148,0,173,255,219,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,239,0,189,204,239,0,189,238,239,0,189,255,159,1,172,255,16,0,140,255,16,0,140,255,16,0,140,255,10,60,173,255,0,186,140,255,0,216,216,255,0,231,255,255,0,216,216,255,8,186,74,255,8,186,74,255,8,186,74,255,8,186,74,255,71,203,38,255,8,182,57,255,8,182,57,255,8,182,57,255,2,209,173,255,0,223,231,255,0,223,231,255,0,223,231,255,0,101,186,255,0,32,156,255,0,32,156,255,0,32,156,255,82,8,161,255,156,4,175,255,231,0,189,255,231,0,189,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,239,0,189,238,239,0,189,255,159,1,172,255,79,2,156,255,16,0,140,255,16,0,140,255,10,60,173,255,5,121,206,255,0,216,216,255,0,231,255,255,0,216,216,255,0,186,140,255,8,186,74,255,8,186,74,255,8,186,74,255,65,206,49,255,134,225,19,255,71,203,38,255,8,182,57,255,8,182,57,255,5,195,115,255,2,209,173,255,0,223,231,255,0,223,231,255,0,170,216,255,0,101,186,255,0,32,156,255,0,32,156,255,8,12,148,255,82,8,161,255,156,4,175,255,231,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,239,0,189,255,159,1,172,255,79,2,156,255,0,4,140,255,16,0,140,255,10,60,173,255,5,121,206,255,0,182,239,255,0,231,255,255,0,216,216,255,0,186,140,255,0,186,140,255,8,186,74,255,8,186,74,255,65,206,49,255,123,226,24,255,198,247,0,255,134,225,19,255,71,203,38,255,8,182,57,255,8,182,57,255,5,195,115,255,2,209,173,255,0,223,231,255,0,239,247,255,0,170,216,255,0,101,186,255,0,32,156,255,8,12,148,255,8,12,148,255,82,8,161,255,156,4,175,255,219,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,233,0,192,255,159,1,172,255,79,2,156,255,0,4,140,255,0,4,140,255,10,60,173,255,5,121,206,255,0,182,239,255,0,182,239,255,0,216,216,255,0,186,140,255,0,186,140,255,0,186,140,255,8,186,74,255,65,206,49,255,123,226,24,255,181,247,0,255,198,247,0,255,198,247,0,255,134,225,19,255,71,203,38,255,8,182,57,255,8,182,57,255,5,195,115,255,2,209,173,255,0,239,247,255,0,239,247,255,0,170,216,255,0,101,186,255,8,12,148,255,8,12,148,255,8,12,148,255,82,8,161,255,148,0,173,255,219,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,239,0,189,204,239,0,189,238,239,0,189,255,162,1,172,255,16,0,140,255,16,0,140,255,16,0,140,255,10,60,173,255,0,182,140,255,0,212,216,255,0,227,255,255,0,212,216,255,8,186,74,255,8,186,74,255,8,186,74,255,8,186,74,255,189,239,8,255,189,239,8,255,189,239,8,255,189,239,8,255,222,247,8,255,222,247,8,255,222,247,8,255,222,247,8,255,71,203,38,255,8,182,57,255,8,182,57,255,8,182,57,255,0,209,173,255,0,223,231,255,0,223,231,255,0,223,231,255,0,101,195,255,0,32,165,255,0,32,165,255,0,32,165,255,77,10,161,255,154,5,175,255,231,0,189,255,231,0,189,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,239,0,189,238,239,0,189,255,162,1,172,255,85,2,156,255,16,0,140,255,16,0,140,255,10,60,173,255,5,121,206,255,0,212,216,255,0,227,255,255,0,212,216,255,0,182,140,255,8,186,74,255,8,186,74,255,8,186,74,255,65,206,49,255,189,239,8,255,189,239,8,255,189,239,8,255,189,239,8,255,233,189,5,255,222,247,8,255,222,247,8,255,222,247,8,255,134,225,19,255,71,203,38,255,8,182,57,255,8,182,57,255,0,195,115,255,0,209,173,255,0,223,231,255,0,223,231,255,0,170,225,255,0,101,195,255,0,32,165,255,0,32,165,255,0,16,148,255,77,10,161,255,154,5,175,255,231,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,239,0,189,255,162,1,172,255,85,2,156,255,8,4,140,255,16,0,140,255,10,60,173,255,5,121,206,255,0,182,239,255,0,227,255,255,0,212,216,255,0,182,140,255,0,182,140,255,8,186,74,255,8,186,74,255,65,206,49,255,123,226,24,255,189,239,8,255,189,239,8,255,189,239,8,255,233,179,2,255,244,131,2,255,233,189,5,255,222,247,8,255,222,247,8,255,198,247,0,255,134,225,19,255,71,203,38,255,8,182,57,255,0,182,57,255,0,195,115,255,0,209,173,255,0,223,231,255,0,239,255,255,0,170,225,255,0,101,195,255,0,32,165,255,0,16,148,255,0,16,148,255,77,10,161,255,154,5,175,255,219,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,233,0,192,255,162,1,172,255,85,2,156,255,8,4,140,255,8,4,140,255,10,60,173,255,5,121,206,255,0,182,239,255,0,182,239,255,0,212,216,255,0,182,140,255,0,182,140,255,0,182,140,255,8,186,74,255,65,206,49,255,123,226,24,255,181,247,0,255,189,239,8,255,189,239,8,255,233,179,2,255,255,150,0,255,255,73,0,255,244,131,2,255,233,189,5,255,222,247,8,255,198,247,0,255,198,247,0,255,134,225,19,255,71,203,38,255,0,182,57,255,0,182,57,255,0,195,115,255,0,209,173,255,0,239,255,255,0,239,255,255,0,170,225,255,0,101,195,255,0,16,148,255,0,16,148,255,0,16,148,255,77,10,161,255,148,0,173,255,219,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,239,0,189,204,239,0,189,238,239,0,189,255,159,1,172,255,16,0,140,255,16,0,140,255,16,0,140,255,10,62,173,255,0,182,140,255,0,214,216,255,0,231,255,255,0,214,216,255,8,186,74,255,8,186,74,255,8,186,74,255,8,186,74,255,66,227,24,255,126,225,16,255,186,224,8,255,247,223,0,255,255,207,0,255,255,207,0,255,255,138,0,255,255,69,0,255,255,4,0,255,255,67,0,255,255,131,0,255,255,195,0,255,222,247,8,255,222,247,8,255,222,247,8,255,222,247,8,255,71,205,38,255,8,182,57,255,8,182,57,255,8,182,57,255,0,209,173,255,0,223,231,255,0,223,231,255,0,223,231,255,0,101,195,255,0,32,165,255,0,32,165,255,0,32,165,255,77,8,161,255,154,4,175,255,231,0,189,255,231,0,189,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,239,0,189,238,239,0,189,255,159,1,172,255,79,2,156,255,16,0,140,255,16,0,140,255,10,62,173,255,5,124,206,255,0,214,216,255,0,231,255,255,0,214,216,255,0,182,140,255,8,186,74,255,8,186,74,255,8,186,74,255,65,206,49,255,126,225,16,255,186,224,8,255,247,223,0,255,247,223,0,255,255,207,0,255,255,138,0,255,255,69,0,255,255,0,0,255,255,4,0,238,255,4,0,255,255,67,0,255,255,131,0,255,233,189,5,255,222,247,8,255,222,247,8,255,222,247,8,255,134,228,19,255,71,205,38,255,8,182,57,255,8,182,57,255,0,195,115,255,0,209,173,255,0,223,231,255,0,223,231,255,0,170,225,255,0,101,195,255,0,32,165,255,0,32,165,255,0,12,148,255,77,8,161,255,154,4,175,255,231,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,239,0,189,255,159,1,172,255,79,2,156,255,0,4,140,255,16,0,140,255,10,62,173,255,5,124,206,255,0,186,239,255,0,231,255,255,0,214,216,255,0,182,140,255,0,182,140,255,8,186,74,255,8,186,74,255,65,206,49,255,123,226,24,255,186,224,8,255,247,223,0,255,247,223,0,255,247,223,0,255,255,138,0,255,255,69,0,255,255,0,0,255,255,0,0,238,255,4,0,204,255,4,0,238,255,4,0,255,255,67,0,255,244,131,2,255,233,189,5,255,222,247,8,255,222,247,8,255,198,251,0,255,134,228,19,255,71,205,38,255,8,182,57,255,0,182,57,255,0,195,115,255,0,209,173,255,0,223,231,255,0,239,255,255,0,170,225,255,0,101,195,255,0,32,165,255,0,12,148,255,0,12,148,255,77,8,161,255,154,4,175,255,219,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,233,0,192,255,159,1,172,255,79,2,156,255,0,4,140,255,0,4,140,255,10,62,173,255,5,124,206,255,0,186,239,255,0,186,239,255,0,214,216,255,0,182,140,255,0,182,140,255,0,182,140,255,8,186,74,255,65,206,49,255,123,226,24,255,181,247,0,255,247,223,0,255,247,223,0,255,247,223,0,255,247,223,0,255,255,69,0,255,255,0,0,255,255,0,0,238,255,0,0,204,255,4,0,85,255,4,0,204,255,4,0,238,255,4,0,255,255,73,0,255,244,131,2,255,233,189,5,255,222,247,8,255,198,251,0,255,198,251,0,255,134,228,19,255,71,205,38,255,0,182,57,255,0,182,57,255,0,195,115,255,0,209,173,255,0,239,255,255,0,239,255,255,0,170,225,255,0,101,195,255,0,12,148,255,0,12,148,255,0,12,148,255,77,8,161,255,148,0,173,255,219,0,189,255,255,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,102,255,0,198,204,255,0,198,238,219,0,189,255,148,0,173,255,82,8,161,255,8,12,148,255,8,12,148,255,8,12,148,255,0,101,195,255,0,170,225,255,0,239,255,255,0,239,255,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,198,247,0,255,222,247,8,255,233,189,5,255,244,131,2,255,255,73,0,255,255,4,0,255,255,4,0,238,255,4,0,204,255,4,0,85,255,4,0,0,255,4,0,85,255,4,0,204,255,4,0,238,255,52,0,255,255,52,0,255,249,118,0,255,244,184,0,255,206,247,0,255,206,247,0,255,206,247,0,255,137,225,16,255,16,186,49,255,16,186,49,255,16,186,49,255,10,201,109,255,0,231,231,255,0,231,231,255,0,231,231,255,0,167,211,255,0,32,156,255,0,32,156,255,0,32,156,255,0,32,156,255,82,0,156,255,137,0,170,255,247,0,198,255,247,0,198,238,255,0,198,204,255,0,198,102,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,219,0,189,255,156,4,175,255,82,8,161,255,8,12,148,255,8,12,148,255,0,32,165,255,0,101,195,255,0,170,225,255,0,239,255,255,0,223,231,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,222,247,8,255,222,247,8,255,233,189,5,255,244,131,2,255,255,67,0,255,255,4,0,255,255,4,0,238,255,4,0,204,255,4,0,85,255,4,0,204,255,4,0,238,255,4,0,255,255,52,0,255,249,118,0,255,244,184,0,255,239,251,0,255,206,247,0,255,206,247,0,255,137,225,16,255,68,203,32,255,16,186,49,255,16,186,49,255,10,201,109,255,5,216,170,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,0,32,156,255,0,32,156,255,0,32,156,255,74,21,164,255,137,0,170,255,247,0,198,255,247,0,198,238,247,0,198,204,255,0,198,102,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,231,0,189,255,156,4,175,255,82,8,161,255,8,12,148,255,0,32,165,255,0,32,165,255,0,101,195,255,0,170,225,255,0,223,231,255,0,223,231,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,222,247,8,255,222,247,8,255,222,247,8,255,233,189,5,255,255,131,0,255,255,67,0,255,255,4,0,255,255,4,0,238,255,4,0,204,255,4,0,238,255,4,0,255,255,66,0,255,249,118,0,255,244,184,0,255,239,251,0,255,239,251,0,255,206,247,0,255,137,225,16,255,68,203,32,255,0,182,49,255,16,186,49,255,10,201,109,255,5,216,170,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,0,32,156,255,0,32,156,255,74,21,164,255,148,10,172,255,247,0,198,255,247,0,198,238,247,0,198,204,247,0,198,102,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,231,0,189,238,231,0,189,255,156,4,175,255,82,8,161,255,0,32,165,255,0,32,165,255,0,32,165,255,0,101,195,255,0,223,231,255,0,223,231,255,0,223,231,255,2,209,173,255,8,182,57,255,8,182,57,255,8,182,57,255,71,203,38,255,222,247,8,255,222,247,8,255,222,247,8,255,222,247,8,255,255,195,0,255,255,131,0,255,255,67,0,255,255,4,0,255,255,4,0,238,255,4,0,255,255,66,0,255,255,128,0,255,244,184,0,255,239,251,0,255,239,251,0,255,239,251,0,255,137,225,16,255,68,203,32,255,0,182,49,255,0,182,49,255,10,201,109,255,5,216,170,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,0,40,173,255,0,32,156,255,74,21,164,255,148,10,172,255,222,0,181,255,247,0,198,238,247,0,198,204,247,0,198,102,247,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,219,0,189,255,148,0,173,255,77,10,161,255,0,16,148,255,0,16,148,255,0,16,148,255,0,101,186,255,0,170,216,255,0,239,247,255,0,239,247,255,0,209,173,255,0,195,115,255,0,182,57,255,0,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,198,247,0,255,222,247,8,255,233,187,5,255,244,128,2,255,255,69,0,255,255,52,0,255,255,52,0,255,249,118,0,255,244,184,0,255,206,247,0,255,206,247,0,255,206,247,0,255,137,225,16,255,16,182,49,255,16,182,49,255,16,182,49,255,10,198,106,255,0,231,231,255,0,231,231,255,0,231,231,255,0,167,211,255,8,24,156,255,8,24,156,255,8,24,156,255,8,24,156,255,82,0,156,255,137,0,170,255,247,0,198,255,247,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,219,0,189,255,154,5,175,255,77,10,161,255,0,16,148,255,0,16,148,255,0,32,156,255,0,101,186,255,0,170,216,255,0,239,247,255,0,223,231,255,0,209,173,255,0,195,115,255,0,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,222,247,8,255,222,247,8,255,233,187,5,255,244,128,2,255,255,52,0,255,249,118,0,255,244,184,0,255,239,251,0,255,206,247,0,255,206,247,0,255,137,225,16,255,68,203,32,255,16,182,49,255,16,182,49,255,10,198,106,255,5,214,164,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,8,24,156,255,8,24,156,255,8,24,156,255,79,16,164,255,137,0,170,255,247,0,198,255,247,0,198,238,247,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,231,0,189,255,154,5,175,255,77,10,161,255,0,16,148,255,0,32,156,255,0,32,156,255,0,101,186,255,0,170,216,255,0,223,231,255,0,223,231,255,0,209,173,255,0,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,222,247,8,255,222,247,8,255,222,247,8,255,233,187,5,255,249,118,0,255,244,184,0,255,239,251,0,255,239,251,0,255,206,247,0,255,137,225,16,255,68,203,32,255,0,182,49,255,16,182,49,255,10,198,106,255,5,214,164,255,0,231,222,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,8,24,156,255,8,24,156,255,79,16,164,255,150,8,172,255,247,0,198,255,247,0,198,238,247,0,198,204,247,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,231,0,189,238,231,0,189,255,154,5,175,255,77,10,161,255,0,32,156,255,0,32,156,255,0,32,156,255,0,101,186,255,0,223,231,255,0,223,231,255,0,223,231,255,0,209,173,255,8,182,57,255,8,182,57,255,8,182,57,255,71,203,38,255,222,247,8,255,222,247,8,255,222,247,8,255,222,247,8,255,244,184,0,255,239,251,0,255,239,251,0,255,239,251,0,255,137,225,16,255,68,203,32,255,0,182,49,255,0,182,49,255,10,198,106,255,5,214,164,255,0,231,222,255,0,231,222,255,0,167,211,255,0,103,192,255,0,40,173,255,0,40,173,255,8,24,156,255,79,16,164,255,150,8,172,255,222,0,181,255,247,0,198,238,247,0,198,204,247,0,198,102,247,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,219,0,189,255,148,0,173,255,82,8,161,255,8,12,148,255,8,12,148,255,8,12,148,255,0,101,195,255,0,170,225,255,0,239,255,255,0,239,255,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,198,247,0,255,206,247,0,255,206,247,0,255,206,247,0,255,137,225,16,255,16,182,57,255,16,182,57,255,16,182,57,255,10,198,112,255,0,231,231,255,0,231,231,255,0,231,231,255,0,167,211,255,0,32,156,255,0,32,156,255,0,32,156,255,0,32,156,255,82,0,156,255,137,0,170,255,247,0,198,255,247,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,219,0,189,255,156,4,175,255,82,8,161,255,8,12,148,255,8,12,148,255,0,32,165,255,0,101,195,255,0,170,225,255,0,239,255,255,0,223,231,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,206,247,0,255,206,247,0,255,137,225,16,255,68,203,32,255,16,182,57,255,16,182,57,255,10,198,112,255,5,214,167,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,0,32,156,255,0,32,156,255,0,32,156,255,74,21,164,255,137,0,170,255,247,0,198,255,247,0,198,238,247,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,231,0,189,255,156,4,175,255,82,8,161,255,8,12,148,255,0,32,165,255,0,32,165,255,0,101,195,255,0,170,225,255,0,223,231,255,0,223,231,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,206,247,0,255,137,225,16,255,68,203,32,255,0,182,49,255,16,182,57,255,10,198,112,255,5,214,167,255,0,231,222,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,0,32,156,255,0,32,156,255,74,21,164,255,148,10,172,255,247,0,198,255,247,0,198,238,247,0,198,204,247,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,231,0,189,238,231,0,189,255,156,4,175,255,82,8,161,255,0,32,165,255,0,32,165,255,0,32,165,255,0,101,195,255,0,223,231,255,0,223,231,255,0,223,231,255,2,209,173,255,8,182,57,255,8,182,57,255,8,182,57,255,71,203,38,255,137,225,16,255,68,203,32,255,0,182,49,255,0,182,49,255,10,198,112,255,5,214,167,255,0,231,222,255,0,231,222,255,0,167,211,255,0,103,192,255,0,40,173,255,0,40,173,255,0,32,156,255,74,21,164,255,148,10,172,255,222,0,181,255,247,0,198,238,247,0,198,204,247,0,198,102,247,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,219,0,189,255,148,0,173,255,77,8,161,255,0,12,148,255,0,12,148,255,0,12,148,255,0,101,186,255,0,170,216,255,0,239,247,255,0,239,247,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,16,182,49,255,16,182,49,255,16,182,49,255,10,198,106,255,0,231,231,255,0,231,231,255,0,231,231,255,0,167,211,255,8,28,156,255,8,28,156,255,8,28,156,255,8,28,156,255,82,0,156,255,137,0,170,255,247,0,198,255,247,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,219,0,189,255,154,4,175,255,77,8,161,255,0,12,148,255,0,12,148,255,0,32,156,255,0,101,186,255,0,170,216,255,0,239,247,255,0,223,231,255,2,209,173,255,5,195,115,255,8,182,57,255,16,182,49,255,16,182,49,255,10,198,106,255,5,214,164,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,8,28,156,255,8,28,156,255,8,28,156,255,79,18,164,255,137,0,170,255,247,0,198,255,247,0,198,238,247,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,231,0,189,255,154,4,175,255,77,8,161,255,0,12,148,255,0,32,156,255,0,32,156,255,0,101,186,255,0,170,216,255,0,223,231,255,0,223,231,255,2,209,173,255,5,195,115,255,16,182,49,255,10,198,106,255,5,214,164,255,0,231,222,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,8,28,156,255,8,28,156,255,79,18,164,255,150,9,172,255,247,0,198,255,247,0,198,238,247,0,198,204,247,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,102,255,0,198,204,231,0,189,238,231,0,189,255,154,4,175,255,77,8,161,255,0,32,156,255,0,32,156,255,0,32,156,255,0,101,186,255,0,223,231,255,0,223,231,255,0,223,231,255,2,209,173,255,10,198,106,255,5,214,164,255,0,231,222,255,0,231,222,255,0,167,211,255,0,103,192,255,0,40,173,255,0,40,173,255,8,28,156,255,79,18,164,255,150,9,172,255,222,0,181,255,247,0,198,238,247,0,198,204,247,0,198,102,247,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,255,0,198,170,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,231,0,189,238,231,0,189,238,231,0,189,238,231,0,189,238,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,219,0,189,255,148,0,173,255,82,8,161,255,8,12,148,255,8,12,148,255,8,12,148,255,0,101,195,255,0,170,225,255,0,239,255,255,0,239,255,255,0,231,231,255,0,231,231,255,0,231,231,255,0,167,211,255,8,28,156,255,8,28,156,255,8,28,156,255,8,28,156,255,82,0,148,255,137,0,164,255,247,0,198,255,247,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,170,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,239,0,189,238,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,2,175,255,164,2,175,255,164,2,175,255,164,2,175,255,159,2,175,255,159,2,175,255,159,2,175,255,159,2,175,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,219,0,189,255,156,4,175,255,82,8,161,255,8,12,148,255,8,12,148,255,0,32,165,255,0,101,195,255,0,170,225,255,0,239,255,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,8,28,156,255,8,28,156,255,8,28,156,255,79,18,164,255,137,0,164,255,247,0,198,255,247,0,198,238,247,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,2,175,255,164,2,175,255,164,2,175,255,162,4,175,255,162,4,175,255,162,4,175,255,162,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,159,2,175,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,231,0,189,255,156,4,175,255,82,8,161,255,8,12,148,255,0,32,165,255,0,32,165,255,0,101,195,255,0,170,225,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,8,28,156,255,8,28,156,255,79,18,164,255,150,9,172,255,247,0,198,255,247,0,198,238,247,0,198,204,247,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,2,175,255,16,8,148,255,16,8,148,255,8,12,148,255,8,12,148,255,8,12,148,255,8,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,159,2,175,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,231,0,189,238,231,0,189,255,156,4,175,255,82,8,161,255,0,32,165,255,0,32,165,255,0,32,165,255,0,101,195,255,0,167,211,255,0,103,192,255,0,40,173,255,0,40,173,255,8,28,156,255,79,18,164,255,150,9,172,255,222,0,181,255,247,0,198,238,247,0,198,204,247,0,198,102,247,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,2,175,255,16,8,148,255,16,8,148,255,8,12,148,255,8,12,148,255,8,12,148,255,8,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,0,101,173,255,0,101,173,255,0,101,173,255,0,101,173,255,0,148,153,255,0,148,153,255,0,148,153,255,0,148,153,255,0,101,173,255,0,101,173,255,0,101,173,255,0,101,173,255,0,101,189,255,44,33,161,255,66,0,148,255,66,0,148,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,219,0,189,255,148,0,173,255,77,8,161,255,0,12,148,255,0,12,148,255,0,12,148,255,0,32,156,255,0,32,156,255,0,32,156,255,0,32,156,255,82,0,156,255,137,0,170,255,247,0,198,255,247,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,173,255,0,101,173,255,0,101,173,255,0,101,173,255,0,159,140,255,0,159,140,255,0,159,140,255,0,159,140,255,0,227,189,255,0,227,189,255,0,227,189,255,0,227,189,255,0,227,231,255,0,227,231,255,0,227,231,255,0,227,231,255,0,227,214,255,0,227,214,255,0,227,214,255,0,227,214,255,0,101,189,255,44,33,161,255,66,0,148,255,66,0,148,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,219,0,189,255,154,4,175,255,77,8,161,255,0,12,148,255,0,12,148,255,0,32,156,255,0,32,156,255,0,32,156,255,74,21,164,255,137,0,170,255,247,0,198,255,247,0,198,238,247,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,101,189,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,206,255,0,227,206,255,0,227,206,255,0,227,206,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,189,255,0,227,189,255,0,227,189,255,0,227,189,255,0,227,231,255,0,227,231,255,0,227,231,255,0,227,231,255,0,227,214,255,0,227,214,255,0,227,214,255,0,227,214,255,0,101,189,255,44,33,161,255,66,0,148,255,66,0,148,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,231,0,189,255,154,4,175,255,77,8,161,255,0,12,148,255,0,32,156,255,0,32,156,255,74,21,164,255,148,10,172,255,247,0,198,255,247,0,198,238,247,0,198,204,247,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,101,189,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,206,255,0,227,206,255,0,227,206,255,0,227,206,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,185,183,255,0,185,183,255,0,185,183,255,0,185,183,255,0,148,153,255,0,148,153,255,0,148,153,255,0,148,153,255,0,185,200,255,0,185,200,255,0,227,214,255,0,227,214,255,0,101,189,255,44,33,161,255,66,0,148,255,66,0,148,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,231,0,189,238,231,0,189,255,154,4,175,255,77,8,161,255,0,32,156,255,74,21,164,255,148,10,172,255,222,0,181,255,247,0,198,238,247,0,198,204,247,0,198,102,247,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,101,189,255,0,227,222,255,0,227,222,255,0,185,211,255,0,185,195,255,0,185,195,255,0,185,195,255,0,185,195,255,0,159,140,255,0,159,140,255,0,159,140,255,0,159,140,255,8,186,49,255,8,186,49,255,8,186,49,255,8,186,49,255,8,182,49,255,8,182,49,255,8,182,49,255,8,182,49,255,0,178,57,255,0,194,112,255,0,227,222,255,0,227,222,255,0,97,189,255,49,32,161,255,74,0,148,255,74,0,148,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,219,0,189,255,148,0,173,255,82,0,156,255,137,0,170,255,247,0,198,255,247,0,198,238,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,101,173,255,0,231,198,255,0,231,198,255,0,187,189,255,0,182,49,255,0,182,49,255,0,182,49,255,0,182,49,255,8,186,49,255,8,186,49,255,8,186,49,255,8,186,49,255,90,209,32,255,90,209,32,255,90,209,32,255,90,209,32,255,74,205,35,255,74,205,35,255,74,205,35,255,74,205,35,255,0,178,57,255,0,194,112,255,0,227,222,255,0,227,222,255,0,97,189,255,49,32,161,255,74,0,148,255,74,0,148,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,219,0,189,255,137,0,170,255,247,0,198,255,247,0,198,238,247,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,101,173,255,0,231,198,255,0,231,198,255,0,187,189,255,0,182,49,255,85,206,32,255,85,206,32,255,85,206,32,255,90,209,32,255,90,209,32,255,90,209,32,255,90,209,32,255,172,232,16,255,172,232,16,255,172,232,16,255,172,232,16,255,206,251,8,255,206,251,8,255,206,251,8,255,74,205,35,255,0,178,57,255,0,194,112,255,0,227,222,255,0,227,222,255,0,97,189,255,49,32,161,255,74,0,148,255,74,0,148,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,238,247,0,198,255,247,0,198,238,247,0,198,204,247,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,101,173,255,0,231,198,255,0,231,198,255,0,187,189,255,0,182,49,255,85,206,32,255,170,230,16,255,170,230,16,255,172,232,16,255,172,232,16,255,172,232,16,255,172,232,16,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,206,251,8,255,206,251,8,255,206,251,8,255,74,205,35,255,0,178,57,255,0,194,112,255,0,227,222,255,0,227,222,255,0,97,189,255,49,32,161,255,74,0,148,255,74,0,148,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,247,0,198,238,247,0,198,204,247,0,198,102,247,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,101,173,255,0,231,198,255,0,231,198,255,0,187,189,255,0,182,49,255,85,206,32,255,170,230,16,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,174,0,255,255,174,0,255,255,174,0,255,255,174,0,255,255,231,0,255,255,231,0,255,197,227,8,255,82,219,24,255,8,178,57,255,5,194,109,255,0,227,214,255,0,227,214,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,204,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,159,143,255,0,227,231,255,0,227,231,255,0,159,143,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,174,0,255,255,174,0,255,255,174,0,255,255,174,0,255,255,60,0,255,255,60,0,255,255,60,0,255,255,60,0,255,255,231,0,255,255,231,0,255,197,227,8,255,82,219,24,255,8,178,57,255,5,194,109,255,0,227,214,255,0,227,214,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,238,255,0,198,170,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,102,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,159,143,255,0,227,231,255,0,227,231,255,0,159,143,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,174,0,255,255,60,0,255,255,60,0,255,255,60,0,255,255,4,0,255,255,4,0,255,255,4,0,255,255,60,0,255,255,231,0,255,255,231,0,255,197,227,8,255,82,219,24,255,8,178,57,255,5,194,109,255,0,227,214,255,0,227,214,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,238,255,0,198,170,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,159,143,255,0,227,231,255,0,227,231,255,0,159,143,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,174,0,255,255,60,0,255,255,4,0,255,255,4,0,255,255,4,0,170,255,4,0,170,255,4,0,255,255,60,0,255,255,231,0,255,255,231,0,255,197,227,8,255,82,219,24,255,8,178,57,255,5,194,109,255,0,227,214,255,0,227,214,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,238,255,0,198,170,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,170,239,0,189,238,164,4,175,255,16,12,148,255,16,12,148,255,0,159,143,255,0,227,231,255,0,227,231,255,0,159,143,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,174,0,255,255,60,0,255,255,4,0,255,255,4,0,170],"DXT5":[255,0,0,0,255,0,0,168,255,0,0,255,255,65,0,255,255,223,0,255,255,223,0,255,197,221,8,255,82,219,24,255,8,178,49,255,5,194,106,255,0,227,222,255,0,227,222,255,0,97,189,255,54,32,167,255,82,0,156,255,82,0,156,255,255,0,198,244,255,0,198,169,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,153,148,255,0,227,231,255,0,227,231,255,0,153,148,255,8,186,49,255,90,209,32,255,172,232,16,255,255,255,0,255,255,178,0,255,255,62,0,255,255,4,0,255,255,4,0,168,255,0,0,168,255,0,0,168,255,0,0,255,255,65,0,255,255,223,0,255,255,223,0,255,197,221,8,255,82,219,24,255,8,178,49,255,5,194,106,255,0,227,222,255,0,227,222,255,0,97,189,255,54,32,167,255,82,0,156,255,82,0,156,255,255,0,198,244,255,0,198,169,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,153,148,255,0,227,231,255,0,227,231,255,0,153,148,255,8,186,49,255,90,209,32,255,172,232,16,255,255,255,0,255,255,178,0,255,255,62,0,255,255,4,0,255,255,4,0,168,255,0,0,255,255,0,0,255,255,0,0,255,255,65,0,255,255,223,0,255,255,223,0,255,197,221,8,255,82,219,24,255,8,178,49,255,5,194,106,255,0,227,222,255,0,227,222,255,0,97,189,255,54,32,167,255,82,0,156,255,82,0,156,255,255,0,198,244,255,0,198,169,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,153,148,255,0,227,231,255,0,227,231,255,0,153,148,255,8,186,49,255,90,209,32,255,172,232,16,255,255,255,0,255,255,178,0,255,255,62,0,255,255,4,0,255,255,4,0,255,255,65,0,255,255,65,0,255,255,65,0,255,255,65,0,255,255,223,0,255,255,223,0,255,197,221,8,255,82,219,24,255,8,178,49,255,5,194,106,255,0,227,222,255,0,227,222,255,0,97,189,255,54,32,167,255,82,0,156,255,82,0,156,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,153,148,255,0,227,231,255,0,227,231,255,0,153,148,255,8,186,49,255,90,209,32,255,172,232,16,255,255,255,0,255,255,178,0,255,255,62,0,255,255,62,0,255,255,62,0,255,255,231,0,255,255,231,0,255,255,231,0,255,255,231,0,255,197,235,8,255,255,247,0,255,197,235,8,255,82,211,24,255,0,178,49,255,0,194,109,255,0,227,231,255,0,227,231,255,0,97,189,255,49,32,167,255,74,0,156,255,74,0,156,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,148,150,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,227,0,255,255,227,0,255,255,227,0,255,255,227,0,255,255,231,0,255,255,231,0,255,255,231,0,255,255,231,0,255,255,247,0,255,255,247,0,255,197,235,8,255,82,211,24,255,0,178,49,255,0,194,109,255,0,227,231,255,0,227,231,255,0,97,189,255,49,32,167,255,74,0,156,255,74,0,156,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,148,150,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,227,0,255,255,227,0,255,255,227,0,255,255,227,0,255,197,228,8,255,197,228,8,255,197,228,8,255,197,228,8,255,197,235,8,255,197,235,8,255,197,235,8,255,82,211,24,255,0,178,49,255,0,194,109,255,0,227,231,255,0,227,231,255,0,97,189,255,49,32,167,255,74,0,156,255,74,0,156,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,219,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,148,150,255,8,182,49,255,90,206,32,255,172,230,16,255,172,230,16,255,197,224,8,255,197,224,8,255,197,224,8,255,197,224,8,255,82,223,24,255,82,223,24,255,82,223,24,255,82,223,24,255,82,211,24,255,82,211,24,255,82,211,24,255,82,211,24,255,0,178,49,255,0,194,109,255,0,227,231,255,0,227,231,255,0,97,189,255,49,32,167,255,74,0,156,255,74,0,156,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,233,0,192,255,148,0,173,255,219,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,148,150,255,8,182,49,255,90,206,32,255,90,206,32,255,90,206,32,255,82,219,24,255,82,219,24,255,82,219,24,255,82,219,24,255,8,178,57,255,8,178,57,255,8,178,57,255,8,178,57,255,0,178,49,255,0,178,49,255,0,178,49,255,0,178,49,255,0,178,57,255,0,194,112,255,0,227,222,255,0,227,222,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,239,0,189,197,239,0,189,237,239,0,189,255,159,1,172,255,77,8,161,255,154,4,175,255,231,0,189,255,231,0,189,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,148,150,255,0,178,49,255,0,178,49,255,0,178,49,255,0,178,49,255,8,182,57,255,8,182,57,255,8,182,57,255,8,182,57,255,5,194,112,255,5,194,112,255,5,194,112,255,5,194,112,255,0,194,106,255,0,194,106,255,0,194,106,255,0,194,106,255,0,194,112,255,0,194,112,255,0,227,222,255,0,227,222,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,239,0,189,237,239,0,189,255,159,1,172,255,79,2,156,255,0,12,148,255,77,8,161,255,154,4,175,255,231,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,148,150,255,0,194,106,255,0,194,106,255,0,194,106,255,0,194,106,255,5,197,112,255,5,197,112,255,5,197,112,255,5,197,112,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,239,0,189,255,159,1,172,255,79,2,156,255,0,4,140,255,0,12,148,255,0,12,148,255,77,8,161,255,154,4,175,255,219,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,233,0,192,255,159,1,172,255,79,2,156,255,0,4,140,255,0,4,140,255,0,12,148,255,0,12,148,255,0,12,148,255,77,8,161,255,148,0,173,255,219,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,148,150,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,36,156,255,0,36,156,255,46,24,159,255,140,0,165,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,231,0,189,197,231,0,189,237,231,0,189,255,154,1,172,255,16,4,148,255,16,4,148,255,16,4,148,255,10,81,183,255,0,101,189,255,0,32,156,255,0,32,156,255,0,32,156,255,77,8,161,255,154,4,175,255,231,0,189,255,231,0,189,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,2,175,255,16,8,148,255,16,8,148,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,97,189,255,0,97,189,255,0,97,189,255,0,97,189,255,49,32,167,255,49,32,167,255,49,32,167,255,49,32,167,255,44,32,161,255,44,32,161,255,44,32,161,255,44,32,161,255,44,33,161,255,44,33,161,255,44,33,161,255,44,33,161,255,0,36,156,255,0,36,156,255,46,24,159,255,140,0,165,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,231,0,189,237,231,0,189,255,154,1,172,255,77,2,156,255,16,4,148,255,16,4,148,255,10,81,183,255,10,81,183,255,0,170,222,255,0,101,189,255,0,32,156,255,0,32,156,255,0,12,148,255,77,8,161,255,154,4,175,255,231,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,2,175,255,16,8,148,255,16,8,148,255,49,33,167,255,49,33,167,255,49,33,167,255,49,33,167,255,49,33,167,255,49,33,167,255,49,33,167,255,49,33,167,255,49,32,167,255,49,32,167,255,49,32,167,255,49,32,167,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,46,24,159,255,46,24,159,255,46,24,159,255,140,0,165,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,231,0,189,255,154,1,172,255,77,2,156,255,0,4,140,255,16,4,148,255,10,81,183,255,10,81,183,255,5,158,219,255,0,239,255,255,0,170,222,255,0,101,189,255,0,32,156,255,0,12,148,255,0,12,148,255,77,8,161,255,154,4,175,255,219,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,2,175,255,16,8,148,255,16,8,148,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,66,0,148,255,140,0,165,255,140,0,165,255,140,0,165,255,140,0,165,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,233,0,192,255,154,1,172,255,77,2,156,255,0,4,140,255,0,4,140,255,10,81,183,255,10,81,183,255,5,158,219,255,0,235,255,255,0,239,255,255,0,239,255,255,0,170,222,255,0,101,189,255,0,12,148,255,0,12,148,255,0,12,148,255,77,8,161,255,148,0,173,255,219,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,2,175,255,164,2,175,255,164,2,175,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,74,0,156,255,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,154,255,0,198,0,255,0,198,94,239,0,189,197,239,0,189,237,239,0,189,255,159,1,172,255,16,4,148,255,16,4,148,255,16,4,148,255,10,82,183,255,0,182,140,255,0,214,216,255,0,231,255,255,0,214,216,255,2,209,173,255,0,223,231,255,0,223,231,255,0,223,231,255,0,101,195,255,0,32,165,255,0,32,165,255,0,32,165,255,77,10,161,255,154,5,175,255,231,0,189,255,231,0,189,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,179,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,244,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,154,255,0,198,154,255,0,198,94,255,0,198,184,239,0,189,237,239,0,189,255,159,1,172,255,79,2,156,255,16,4,148,255,16,4,148,255,10,82,183,255,10,82,183,255,0,214,216,255,0,231,255,255,0,214,216,255,0,182,140,255,5,195,115,255,2,209,173,255,0,223,231,255,0,223,231,255,0,170,225,255,0,101,195,255,0,32,165,255,0,32,165,255,0,16,148,255,77,10,161,255,154,5,175,255,231,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,179,255,0,198,174,255,0,198,174,255,0,198,174,255,0,198,174,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,184,255,0,198,244,239,0,189,255,159,1,172,255,79,2,156,255,0,4,140,255,16,4,148,255,10,82,183,255,10,82,183,255,5,160,219,255,0,231,255,255,0,214,216,255,0,182,140,255,0,182,140,255,8,182,57,255,5,195,115,255,2,209,173,255,0,223,231,255,0,239,255,255,0,170,225,255,0,101,195,255,0,32,165,255,0,16,148,255,0,16,148,255,77,10,161,255,154,5,175,255,219,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,184,255,0,198,244,233,0,192,255,159,1,172,255,79,2,156,255,0,4,140,255,0,4,140,255,10,82,183,255,10,82,183,255,5,160,219,255,0,239,255,255,0,214,216,255,0,182,140,255,0,182,140,255,0,182,140,255,8,182,57,255,8,182,57,255,5,195,115,255,2,209,173,255,0,239,255,255,0,239,255,255,0,170,225,255,0,101,195,255,0,16,148,255,0,16,148,255,0,16,148,255,77,10,161,255,148,0,173,255,219,0,189,255,255,0,198,237,255,0,198,208,255,0,198,104,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,239,0,189,197,239,0,189,237,239,0,189,255,159,1,172,255,16,0,140,255,16,0,140,255,16,0,140,255,10,60,173,255,0,186,140,255,0,216,216,255,0,231,255,255,0,216,216,255,8,186,74,255,8,186,74,255,8,186,74,255,8,186,74,255,71,203,38,255,8,182,57,255,8,182,57,255,8,182,57,255,2,209,173,255,0,223,231,255,0,223,231,255,0,223,231,255,0,101,186,255,0,32,156,255,0,32,156,255,0,32,156,255,82,8,161,255,156,4,175,255,231,0,189,255,231,0,189,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,239,0,189,237,239,0,189,255,159,1,172,255,79,2,156,255,16,0,140,255,16,0,140,255,10,60,173,255,5,121,206,255,0,216,216,255,0,231,255,255,0,216,216,255,0,186,140,255,8,186,74,255,8,186,74,255,8,186,74,255,65,206,49,255,134,225,19,255,71,203,38,255,8,182,57,255,8,182,57,255,5,195,115,255,2,209,173,255,0,223,231,255,0,223,231,255,0,170,216,255,0,101,186,255,0,32,156,255,0,32,156,255,8,12,148,255,82,8,161,255,156,4,175,255,231,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,239,0,189,255,159,1,172,255,79,2,156,255,0,4,140,255,16,0,140,255,10,60,173,255,5,121,206,255,0,182,239,255,0,231,255,255,0,216,216,255,0,186,140,255,0,186,140,255,8,186,74,255,8,186,74,255,65,206,49,255,123,226,24,255,198,247,0,255,134,225,19,255,71,203,38,255,8,182,57,255,8,182,57,255,5,195,115,255,2,209,173,255,0,223,231,255,0,239,247,255,0,170,216,255,0,101,186,255,0,32,156,255,8,12,148,255,8,12,148,255,82,8,161,255,156,4,175,255,219,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,233,0,192,255,159,1,172,255,79,2,156,255,0,4,140,255,0,4,140,255,10,60,173,255,5,121,206,255,0,182,239,255,0,182,239,255,0,216,216,255,0,186,140,255,0,186,140,255,0,186,140,255,8,186,74,255,65,206,49,255,123,226,24,255,181,247,0,255,198,247,0,255,198,247,0,255,134,225,19,255,71,203,38,255,8,182,57,255,8,182,57,255,5,195,115,255,2,209,173,255,0,239,247,255,0,239,247,255,0,170,216,255,0,101,186,255,8,12,148,255,8,12,148,255,8,12,148,255,82,8,161,255,148,0,173,255,219,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,239,0,189,197,239,0,189,237,239,0,189,255,162,1,172,255,16,0,140,255,16,0,140,255,16,0,140,255,10,60,173,255,0,182,140,255,0,212,216,255,0,227,255,255,0,212,216,255,8,186,74,255,8,186,74,255,8,186,74,255,8,186,74,255,189,239,8,255,189,239,8,255,189,239,8,255,189,239,8,255,222,247,8,255,222,247,8,255,222,247,8,255,222,247,8,255,71,203,38,255,8,182,57,255,8,182,57,255,8,182,57,255,0,209,173,255,0,223,231,255,0,223,231,255,0,223,231,255,0,101,195,255,0,32,165,255,0,32,165,255,0,32,165,255,77,10,161,255,154,5,175,255,231,0,189,255,231,0,189,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,239,0,189,237,239,0,189,255,162,1,172,255,85,2,156,255,16,0,140,255,16,0,140,255,10,60,173,255,5,121,206,255,0,212,216,255,0,227,255,255,0,212,216,255,0,182,140,255,8,186,74,255,8,186,74,255,8,186,74,255,65,206,49,255,189,239,8,255,189,239,8,255,189,239,8,255,189,239,8,255,233,189,5,255,222,247,8,255,222,247,8,255,222,247,8,255,134,225,19,255,71,203,38,255,8,182,57,255,8,182,57,255,0,195,115,255,0,209,173,255,0,223,231,255,0,223,231,255,0,170,225,255,0,101,195,255,0,32,165,255,0,32,165,255,0,16,148,255,77,10,161,255,154,5,175,255,231,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,239,0,189,255,162,1,172,255,85,2,156,255,8,4,140,255,16,0,140,255,10,60,173,255,5,121,206,255,0,182,239,255,0,227,255,255,0,212,216,255,0,182,140,255,0,182,140,255,8,186,74,255,8,186,74,255,65,206,49,255,123,226,24,255,189,239,8,255,189,239,8,255,189,239,8,255,233,179,2,255,244,131,2,255,233,189,5,255,222,247,8,255,222,247,8,255,198,247,0,255,134,225,19,255,71,203,38,255,8,182,57,255,0,182,57,255,0,195,115,255,0,209,173,255,0,223,231,255,0,239,255,255,0,170,225,255,0,101,195,255,0,32,165,255,0,16,148,255,0,16,148,255,77,10,161,255,154,5,175,255,219,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,233,0,192,255,162,1,172,255,85,2,156,255,8,4,140,255,8,4,140,255,10,60,173,255,5,121,206,255,0,182,239,255,0,182,239,255,0,212,216,255,0,182,140,255,0,182,140,255,0,182,140,255,8,186,74,255,65,206,49,255,123,226,24,255,181,247,0,255,189,239,8,255,189,239,8,255,233,179,2,255,255,150,0,255,255,73,0,255,244,131,2,255,233,189,5,255,222,247,8,255,198,247,0,255,198,247,0,255,134,225,19,255,71,203,38,255,0,182,57,255,0,182,57,255,0,195,115,255,0,209,173,255,0,239,255,255,0,239,255,255,0,170,225,255,0,101,195,255,0,16,148,255,0,16,148,255,0,16,148,255,77,10,161,255,148,0,173,255,219,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,239,0,189,197,239,0,189,237,239,0,189,255,159,1,172,255,16,0,140,255,16,0,140,255,16,0,140,255,10,62,173,255,0,182,140,255,0,214,216,255,0,231,255,255,0,214,216,255,8,186,74,255,8,186,74,255,8,186,74,255,8,186,74,255,66,227,24,255,126,225,16,255,186,224,8,255,247,223,0,255,255,207,0,255,255,207,0,255,255,138,0,255,255,69,0,255,255,4,0,255,255,67,0,255,255,131,0,255,255,195,0,255,222,247,8,255,222,247,8,255,222,247,8,255,222,247,8,255,71,205,38,255,8,182,57,255,8,182,57,255,8,182,57,255,0,209,173,255,0,223,231,255,0,223,231,255,0,223,231,255,0,101,195,255,0,32,165,255,0,32,165,255,0,32,165,255,77,8,161,255,154,4,175,255,231,0,189,255,231,0,189,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,239,0,189,237,239,0,189,255,159,1,172,255,79,2,156,255,16,0,140,255,16,0,140,255,10,62,173,255,5,124,206,255,0,214,216,255,0,231,255,255,0,214,216,255,0,182,140,255,8,186,74,255,8,186,74,255,8,186,74,255,65,206,49,255,126,225,16,255,186,224,8,255,247,223,0,255,247,223,0,255,255,207,0,255,255,138,0,255,255,69,0,255,255,0,0,255,255,4,0,245,255,4,0,255,255,67,0,255,255,131,0,255,233,189,5,255,222,247,8,255,222,247,8,255,222,247,8,255,134,228,19,255,71,205,38,255,8,182,57,255,8,182,57,255,0,195,115,255,0,209,173,255,0,223,231,255,0,223,231,255,0,170,225,255,0,101,195,255,0,32,165,255,0,32,165,255,0,12,148,255,77,8,161,255,154,4,175,255,231,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,239,0,189,255,159,1,172,255,79,2,156,255,0,4,140,255,16,0,140,255,10,62,173,255,5,124,206,255,0,186,239,255,0,231,255,255,0,214,216,255,0,182,140,255,0,182,140,255,8,186,74,255,8,186,74,255,65,206,49,255,123,226,24,255,186,224,8,255,247,223,0,255,247,223,0,255,247,223,0,255,255,138,0,255,255,69,0,255,255,0,0,255,255,0,0,245,255,4,0,184,255,4,0,245,255,4,0,255,255,67,0,255,244,131,2,255,233,189,5,255,222,247,8,255,222,247,8,255,198,251,0,255,134,228,19,255,71,205,38,255,8,182,57,255,0,182,57,255,0,195,115,255,0,209,173,255,0,223,231,255,0,239,255,255,0,170,225,255,0,101,195,255,0,32,165,255,0,12,148,255,0,12,148,255,77,8,161,255,154,4,175,255,219,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,233,0,192,255,159,1,172,255,79,2,156,255,0,4,140,255,0,4,140,255,10,62,173,255,5,124,206,255,0,186,239,255,0,186,239,255,0,214,216,255,0,182,140,255,0,182,140,255,0,182,140,255,8,186,74,255,65,206,49,255,123,226,24,255,181,247,0,255,247,223,0,255,247,223,0,255,247,223,0,255,247,223,0,255,255,69,0,255,255,0,0,255,255,0,0,245,255,0,0,197,255,4,0,93,255,4,0,184,255,4,0,245,255,4,0,255,255,73,0,255,244,131,2,255,233,189,5,255,222,247,8,255,198,251,0,255,198,251,0,255,134,228,19,255,71,205,38,255,0,182,57,255,0,182,57,255,0,195,115,255,0,209,173,255,0,239,255,255,0,239,255,255,0,170,225,255,0,101,195,255,0,12,148,255,0,12,148,255,0,12,148,255,77,8,161,255,148,0,173,255,219,0,189,255,255,0,198,237,255,0,198,208,255,0,198,94,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,94,255,0,198,208,255,0,198,237,219,0,189,255,148,0,173,255,82,8,161,255,8,12,148,255,8,12,148,255,8,12,148,255,0,101,195,255,0,170,225,255,0,239,255,255,0,239,255,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,198,247,0,255,222,247,8,255,233,189,5,255,244,131,2,255,255,73,0,255,255,4,0,255,255,4,0,245,255,4,0,184,255,4,0,93,255,4,0,0,255,4,0,93,255,4,0,184,255,4,0,245,255,52,0,255,255,52,0,255,249,118,0,255,244,184,0,255,206,247,0,255,206,247,0,255,206,247,0,255,137,225,16,255,16,186,49,255,16,186,49,255,16,186,49,255,10,201,109,255,0,231,231,255,0,231,231,255,0,231,231,255,0,167,211,255,0,32,156,255,0,32,156,255,0,32,156,255,0,32,156,255,82,0,156,255,137,0,170,255,247,0,198,255,247,0,198,237,255,0,198,197,255,0,198,94,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,219,0,189,255,156,4,175,255,82,8,161,255,8,12,148,255,8,12,148,255,0,32,165,255,0,101,195,255,0,170,225,255,0,239,255,255,0,223,231,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,222,247,8,255,222,247,8,255,233,189,5,255,244,131,2,255,255,67,0,255,255,4,0,255,255,4,0,245,255,4,0,184,255,4,0,93,255,4,0,184,255,4,0,245,255,4,0,255,255,52,0,255,249,118,0,255,244,184,0,255,239,251,0,255,206,247,0,255,206,247,0,255,137,225,16,255,68,203,32,255,16,186,49,255,16,186,49,255,10,201,109,255,5,216,170,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,0,32,156,255,0,32,156,255,0,32,156,255,74,21,164,255,137,0,170,255,247,0,198,255,247,0,198,237,247,0,198,208,255,0,198,94,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,231,0,189,255,156,4,175,255,82,8,161,255,8,12,148,255,0,32,165,255,0,32,165,255,0,101,195,255,0,170,225,255,0,223,231,255,0,223,231,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,222,247,8,255,222,247,8,255,222,247,8,255,233,189,5,255,255,131,0,255,255,67,0,255,255,4,0,255,255,4,0,245,255,4,0,184,255,4,0,245,255,4,0,255,255,66,0,255,249,118,0,255,244,184,0,255,239,251,0,255,239,251,0,255,206,247,0,255,137,225,16,255,68,203,32,255,0,182,49,255,16,186,49,255,10,201,109,255,5,216,170,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,0,32,156,255,0,32,156,255,74,21,164,255,148,10,172,255,247,0,198,255,247,0,198,237,247,0,198,208,247,0,198,94,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,231,0,189,237,231,0,189,255,156,4,175,255,82,8,161,255,0,32,165,255,0,32,165,255,0,32,165,255,0,101,195,255,0,223,231,255,0,223,231,255,0,223,231,255,2,209,173,255,8,182,57,255,8,182,57,255,8,182,57,255,71,203,38,255,222,247,8,255,222,247,8,255,222,247,8,255,222,247,8,255,255,195,0,255,255,131,0,255,255,67,0,255,255,4,0,255,255,4,0,245,255,4,0,255,255,66,0,255,255,128,0,255,244,184,0,255,239,251,0,255,239,251,0,255,239,251,0,255,137,225,16,255,68,203,32,255,0,182,49,255,0,182,49,255,10,201,109,255,5,216,170,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,0,40,173,255,0,32,156,255,74,21,164,255,148,10,172,255,222,0,181,255,247,0,198,237,247,0,198,208,247,0,198,94,247,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,219,0,189,255,148,0,173,255,77,10,161,255,0,16,148,255,0,16,148,255,0,16,148,255,0,101,186,255,0,170,216,255,0,239,247,255,0,239,247,255,0,209,173,255,0,195,115,255,0,182,57,255,0,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,198,247,0,255,222,247,8,255,233,187,5,255,244,128,2,255,255,69,0,255,255,52,0,255,255,52,0,255,249,118,0,255,244,184,0,255,206,247,0,255,206,247,0,255,206,247,0,255,137,225,16,255,16,182,49,255,16,182,49,255,16,182,49,255,10,198,106,255,0,231,231,255,0,231,231,255,0,231,231,255,0,167,211,255,8,24,156,255,8,24,156,255,8,24,156,255,8,24,156,255,82,0,156,255,137,0,170,255,247,0,198,255,247,0,198,237,255,0,198,197,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,219,0,189,255,154,5,175,255,77,10,161,255,0,16,148,255,0,16,148,255,0,32,156,255,0,101,186,255,0,170,216,255,0,239,247,255,0,223,231,255,0,209,173,255,0,195,115,255,0,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,222,247,8,255,222,247,8,255,233,187,5,255,244,128,2,255,255,52,0,255,249,118,0,255,244,184,0,255,239,251,0,255,206,247,0,255,206,247,0,255,137,225,16,255,68,203,32,255,16,182,49,255,16,182,49,255,10,198,106,255,5,214,164,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,8,24,156,255,8,24,156,255,8,24,156,255,79,16,164,255,137,0,170,255,247,0,198,255,247,0,198,237,247,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,231,0,189,255,154,5,175,255,77,10,161,255,0,16,148,255,0,32,156,255,0,32,156,255,0,101,186,255,0,170,216,255,0,223,231,255,0,223,231,255,0,209,173,255,0,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,222,247,8,255,222,247,8,255,222,247,8,255,233,187,5,255,249,118,0,255,244,184,0,255,239,251,0,255,239,251,0,255,206,247,0,255,137,225,16,255,68,203,32,255,0,182,49,255,16,182,49,255,10,198,106,255,5,214,164,255,0,231,222,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,8,24,156,255,8,24,156,255,79,16,164,255,150,8,172,255,247,0,198,255,247,0,198,237,247,0,198,208,247,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,231,0,189,237,231,0,189,255,154,5,175,255,77,10,161,255,0,32,156,255,0,32,156,255,0,32,156,255,0,101,186,255,0,223,231,255,0,223,231,255,0,223,231,255,0,209,173,255,8,182,57,255,8,182,57,255,8,182,57,255,71,203,38,255,222,247,8,255,222,247,8,255,222,247,8,255,222,247,8,255,244,184,0,255,239,251,0,255,239,251,0,255,239,251,0,255,137,225,16,255,68,203,32,255,0,182,49,255,0,182,49,255,10,198,106,255,5,214,164,255,0,231,222,255,0,231,222,255,0,167,211,255,0,103,192,255,0,40,173,255,0,40,173,255,8,24,156,255,79,16,164,255,150,8,172,255,222,0,181,255,247,0,198,237,247,0,198,208,247,0,198,94,247,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,219,0,189,255,148,0,173,255,82,8,161,255,8,12,148,255,8,12,148,255,8,12,148,255,0,101,195,255,0,170,225,255,0,239,255,255,0,239,255,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,198,247,0,255,206,247,0,255,206,247,0,255,206,247,0,255,137,225,16,255,16,182,57,255,16,182,57,255,16,182,57,255,10,198,112,255,0,231,231,255,0,231,231,255,0,231,231,255,0,167,211,255,0,32,156,255,0,32,156,255,0,32,156,255,0,32,156,255,82,0,156,255,137,0,170,255,247,0,198,255,247,0,198,237,255,0,198,197,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,219,0,189,255,156,4,175,255,82,8,161,255,8,12,148,255,8,12,148,255,0,32,165,255,0,101,195,255,0,170,225,255,0,239,255,255,0,223,231,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,198,247,0,255,206,247,0,255,206,247,0,255,137,225,16,255,68,203,32,255,16,182,57,255,16,182,57,255,10,198,112,255,5,214,167,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,0,32,156,255,0,32,156,255,0,32,156,255,74,21,164,255,137,0,170,255,247,0,198,255,247,0,198,237,247,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,231,0,189,255,156,4,175,255,82,8,161,255,8,12,148,255,0,32,165,255,0,32,165,255,0,101,195,255,0,170,225,255,0,223,231,255,0,223,231,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,71,203,38,255,134,225,19,255,206,247,0,255,137,225,16,255,68,203,32,255,0,182,49,255,16,182,57,255,10,198,112,255,5,214,167,255,0,231,222,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,0,32,156,255,0,32,156,255,74,21,164,255,148,10,172,255,247,0,198,255,247,0,198,237,247,0,198,208,247,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,231,0,189,237,231,0,189,255,156,4,175,255,82,8,161,255,0,32,165,255,0,32,165,255,0,32,165,255,0,101,195,255,0,223,231,255,0,223,231,255,0,223,231,255,2,209,173,255,8,182,57,255,8,182,57,255,8,182,57,255,71,203,38,255,137,225,16,255,68,203,32,255,0,182,49,255,0,182,49,255,10,198,112,255,5,214,167,255,0,231,222,255,0,231,222,255,0,167,211,255,0,103,192,255,0,40,173,255,0,40,173,255,0,32,156,255,74,21,164,255,148,10,172,255,222,0,181,255,247,0,198,237,247,0,198,208,247,0,198,94,247,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,219,0,189,255,148,0,173,255,77,8,161,255,0,12,148,255,0,12,148,255,0,12,148,255,0,101,186,255,0,170,216,255,0,239,247,255,0,239,247,255,2,209,173,255,5,195,115,255,8,182,57,255,8,182,57,255,16,182,49,255,16,182,49,255,16,182,49,255,10,198,106,255,0,231,231,255,0,231,231,255,0,231,231,255,0,167,211,255,8,28,156,255,8,28,156,255,8,28,156,255,8,28,156,255,82,0,156,255,137,0,170,255,247,0,198,255,247,0,198,237,255,0,198,197,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,219,0,189,255,154,4,175,255,77,8,161,255,0,12,148,255,0,12,148,255,0,32,156,255,0,101,186,255,0,170,216,255,0,239,247,255,0,223,231,255,2,209,173,255,5,195,115,255,8,182,57,255,16,182,49,255,16,182,49,255,10,198,106,255,5,214,164,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,8,28,156,255,8,28,156,255,8,28,156,255,79,18,164,255,137,0,170,255,247,0,198,255,247,0,198,237,247,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,231,0,189,255,154,4,175,255,77,8,161,255,0,12,148,255,0,32,156,255,0,32,156,255,0,101,186,255,0,170,216,255,0,223,231,255,0,223,231,255,2,209,173,255,5,195,115,255,16,182,49,255,10,198,106,255,5,214,164,255,0,231,222,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,8,28,156,255,8,28,156,255,79,18,164,255,150,9,172,255,247,0,198,255,247,0,198,237,247,0,198,208,247,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,255,255,0,255,255,255,0,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,179,255,0,198,179,255,0,198,94,255,0,198,208,231,0,189,237,231,0,189,255,154,4,175,255,77,8,161,255,0,32,156,255,0,32,156,255,0,32,156,255,0,101,186,255,0,223,231,255,0,223,231,255,0,223,231,255,2,209,173,255,10,198,106,255,5,214,164,255,0,231,222,255,0,231,222,255,0,167,211,255,0,103,192,255,0,40,173,255,0,40,173,255,8,28,156,255,79,18,164,255,150,9,172,255,222,0,181,255,247,0,198,237,247,0,198,208,247,0,198,94,247,0,198,179,255,0,198,176,255,0,198,176,255,0,198,176,255,0,198,176,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,255,0,198,169,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,231,0,189,244,231,0,189,244,231,0,189,244,231,0,189,244,255,0,198,244,255,0,198,174,255,0,198,0,255,0,198,104,255,0,198,208,255,0,198,237,219,0,189,255,148,0,173,255,82,8,161,255,8,12,148,255,8,12,148,255,8,12,148,255,0,101,195,255,0,170,225,255,0,239,255,255,0,239,255,255,0,231,231,255,0,231,231,255,0,231,231,255,0,167,211,255,8,28,156,255,8,28,156,255,8,28,156,255,8,28,156,255,82,0,148,255,137,0,164,255,247,0,198,255,247,0,198,237,255,0,198,197,255,0,198,94,255,0,198,0,255,0,198,176,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,239,0,189,244,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,2,175,255,164,2,175,255,164,2,175,255,164,2,175,255,159,2,175,255,159,2,175,255,159,2,175,255,159,2,175,255,255,0,198,244,255,0,198,174,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,219,0,189,255,156,4,175,255,82,8,161,255,8,12,148,255,8,12,148,255,0,32,165,255,0,101,195,255,0,170,225,255,0,239,255,255,0,231,231,255,0,231,231,255,0,167,211,255,0,103,192,255,8,28,156,255,8,28,156,255,8,28,156,255,79,18,164,255,137,0,164,255,247,0,198,255,247,0,198,237,247,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,176,239,0,189,244,164,2,175,255,164,2,175,255,164,2,175,255,162,4,175,255,162,4,175,255,162,4,175,255,162,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,164,4,175,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,159,2,175,255,255,0,198,244,255,0,198,174,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,231,0,189,255,156,4,175,255,82,8,161,255,8,12,148,255,0,32,165,255,0,32,165,255,0,101,195,255,0,170,225,255,0,231,231,255,0,167,211,255,0,103,192,255,0,40,173,255,8,28,156,255,8,28,156,255,79,18,164,255,150,9,172,255,247,0,198,255,247,0,198,237,247,0,198,208,247,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,176,239,0,189,244,164,2,175,255,16,8,148,255,16,8,148,255,8,12,148,255,8,12,148,255,8,12,148,255,8,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,16,8,148,255,159,2,175,255,255,0,198,244,255,0,198,174,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,231,0,189,237,231,0,189,255,156,4,175,255,82,8,161,255,0,32,165,255,0,32,165,255,0,32,165,255,0,101,195,255,0,167,211,255,0,103,192,255,0,40,173,255,0,40,173,255,8,28,156,255,79,18,164,255,150,9,172,255,222,0,181,255,247,0,198,237,247,0,198,208,247,0,198,94,247,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,176,239,0,189,244,164,2,175,255,16,8,148,255,16,8,148,255,8,12,148,255,8,12,148,255,8,12,148,255,8,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,16,12,148,255,0,101,173,255,0,101,173,255,0,101,173,255,0,101,173,255,0,148,153,255,0,148,153,255,0,148,153,255,0,148,153,255,0,101,173,255,0,101,173,255,0,101,173,255,0,101,173,255,0,101,189,255,44,33,161,255,66,0,148,255,66,0,148,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,219,0,189,255,148,0,173,255,77,8,161,255,0,12,148,255,0,12,148,255,0,12,148,255,0,32,156,255,0,32,156,255,0,32,156,255,0,32,156,255,82,0,156,255,137,0,170,255,247,0,198,255,247,0,198,237,255,0,198,197,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,189,255,0,101,173,255,0,101,173,255,0,101,173,255,0,101,173,255,0,159,140,255,0,159,140,255,0,159,140,255,0,159,140,255,0,227,189,255,0,227,189,255,0,227,189,255,0,227,189,255,0,227,231,255,0,227,231,255,0,227,231,255,0,227,231,255,0,227,214,255,0,227,214,255,0,227,214,255,0,227,214,255,0,101,189,255,44,33,161,255,66,0,148,255,66,0,148,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,219,0,189,255,154,4,175,255,77,8,161,255,0,12,148,255,0,12,148,255,0,32,156,255,0,32,156,255,0,32,156,255,74,21,164,255,137,0,170,255,247,0,198,255,247,0,198,237,247,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,101,189,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,206,255,0,227,206,255,0,227,206,255,0,227,206,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,189,255,0,227,189,255,0,227,189,255,0,227,189,255,0,227,231,255,0,227,231,255,0,227,231,255,0,227,231,255,0,227,214,255,0,227,214,255,0,227,214,255,0,227,214,255,0,101,189,255,44,33,161,255,66,0,148,255,66,0,148,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,231,0,189,255,154,4,175,255,77,8,161,255,0,12,148,255,0,32,156,255,0,32,156,255,74,21,164,255,148,10,172,255,247,0,198,255,247,0,198,237,247,0,198,208,247,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,101,189,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,206,255,0,227,206,255,0,227,206,255,0,227,206,255,0,227,222,255,0,227,222,255,0,227,222,255,0,227,222,255,0,185,183,255,0,185,183,255,0,185,183,255,0,185,183,255,0,148,153,255,0,148,153,255,0,148,153,255,0,148,153,255,0,185,200,255,0,185,200,255,0,227,214,255,0,227,214,255,0,101,189,255,44,33,161,255,66,0,148,255,66,0,148,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,231,0,189,237,231,0,189,255,154,4,175,255,77,8,161,255,0,32,156,255,74,21,164,255,148,10,172,255,222,0,181,255,247,0,198,237,247,0,198,208,247,0,198,94,247,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,101,189,255,0,227,222,255,0,227,222,255,0,185,211,255,0,185,195,255,0,185,195,255,0,185,195,255,0,185,195,255,0,159,140,255,0,159,140,255,0,159,140,255,0,159,140,255,8,186,49,255,8,186,49,255,8,186,49,255,8,186,49,255,8,182,49,255,8,182,49,255,8,182,49,255,8,182,49,255,0,178,57,255,0,194,112,255,0,227,222,255,0,227,222,255,0,97,189,255,49,32,161,255,74,0,148,255,74,0,148,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,219,0,189,255,148,0,173,255,82,0,156,255,137,0,170,255,247,0,198,255,247,0,198,237,255,0,198,197,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,101,173,255,0,231,198,255,0,231,198,255,0,187,189,255,0,182,49,255,0,182,49,255,0,182,49,255,0,182,49,255,8,186,49,255,8,186,49,255,8,186,49,255,8,186,49,255,90,209,32,255,90,209,32,255,90,209,32,255,90,209,32,255,74,205,35,255,74,205,35,255,74,205,35,255,74,205,35,255,0,178,57,255,0,194,112,255,0,227,222,255,0,227,222,255,0,97,189,255,49,32,161,255,74,0,148,255,74,0,148,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,219,0,189,255,137,0,170,255,247,0,198,255,247,0,198,237,247,0,198,208,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,101,173,255,0,231,198,255,0,231,198,255,0,187,189,255,0,182,49,255,85,206,32,255,85,206,32,255,85,206,32,255,90,209,32,255,90,209,32,255,90,209,32,255,90,209,32,255,172,232,16,255,172,232,16,255,172,232,16,255,172,232,16,255,206,251,8,255,206,251,8,255,206,251,8,255,74,205,35,255,0,178,57,255,0,194,112,255,0,227,222,255,0,227,222,255,0,97,189,255,49,32,161,255,74,0,148,255,74,0,148,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,255,0,198,237,247,0,198,255,247,0,198,237,247,0,198,208,247,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,101,173,255,0,231,198,255,0,231,198,255,0,187,189,255,0,182,49,255,85,206,32,255,170,230,16,255,170,230,16,255,172,232,16,255,172,232,16,255,172,232,16,255,172,232,16,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,206,251,8,255,206,251,8,255,206,251,8,255,74,205,35,255,0,178,57,255,0,194,112,255,0,227,222,255,0,227,222,255,0,97,189,255,49,32,161,255,74,0,148,255,74,0,148,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,208,247,0,198,237,247,0,198,208,247,0,198,94,247,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,101,173,255,0,231,198,255,0,231,198,255,0,187,189,255,0,182,49,255,85,206,32,255,170,230,16,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,174,0,255,255,174,0,255,255,174,0,255,255,174,0,255,255,231,0,255,255,231,0,255,197,227,8,255,82,219,24,255,8,178,57,255,5,194,109,255,0,227,214,255,0,227,214,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,197,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,159,143,255,0,227,231,255,0,227,231,255,0,159,143,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,174,0,255,255,174,0,255,255,174,0,255,255,174,0,255,255,60,0,255,255,60,0,255,255,60,0,255,255,60,0,255,255,231,0,255,255,231,0,255,197,227,8,255,82,219,24,255,8,178,57,255,5,194,109,255,0,227,214,255,0,227,214,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,244,255,0,198,169,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,94,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,159,143,255,0,227,231,255,0,227,231,255,0,159,143,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,174,0,255,255,60,0,255,255,60,0,255,255,60,0,255,255,4,0,255,255,4,0,255,255,4,0,255,255,60,0,255,255,231,0,255,255,231,0,255,197,227,8,255,82,219,24,255,8,178,57,255,5,194,109,255,0,227,214,255,0,227,214,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,244,255,0,198,169,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,159,143,255,0,227,231,255,0,227,231,255,0,159,143,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,174,0,255,255,60,0,255,255,4,0,255,255,4,0,255,255,4,0,168,255,4,0,168,255,4,0,255,255,60,0,255,255,231,0,255,255,231,0,255,197,227,8,255,82,219,24,255,8,178,57,255,5,194,109,255,0,227,214,255,0,227,214,255,0,101,189,255,49,33,167,255,74,0,156,255,74,0,156,255,255,0,198,244,255,0,198,169,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,0,198,169,239,0,189,244,164,4,175,255,16,12,148,255,16,12,148,255,0,159,143,255,0,227,231,255,0,227,231,255,0,159,143,255,8,182,49,255,90,206,32,255,172,230,16,255,255,255,0,255,255,174,0,255,255,60,0,255,255,4,0,255,255,4,0,168]} \ No newline at end of file diff --git a/tests/assets/dxtDecoding.txd b/tests/assets/dxtDecoding.txd new file mode 100644 index 0000000000000000000000000000000000000000..054887486a1df3f86383692dcca5ac47dcfeb49f GIT binary patch literal 10664 zcmbuFUuYcH6~?c$UaeHKNVY6%8@X5yHM9jiB*vuRfEQBI+S zeU~xc8~MSL^6~L6F{pDCP0{qU?dUQxzp0rA&lZc`;^y_?l3Z`*2XZ5F^&aidbjf8* zp|&oU8ujJc{=HC}kZZiBP}6z7*s(9SN3KPGE1A(U?#*mouHNUjw%`AcLd~Bz`OdCy74AM&m*TxIh{&(63a=(^q z(VrCiR~{PwdSLg0@D=mkfY|kf-9YX_Hs5Vb@AFSL<&WL|J5QSO;%j65i{obJ&_@f6 ze#H4(`@_T7nR0fOr&l#*cai(k0p9bogKdWn9T8SG{-NDPYxk+1leu!`&W|T@y=}+G zUR!MR!`eS)`A;h!wG-W~J)Ph4bX}X@)$aP)lkdRysh)|z?vdPw*`L2OGCY;v=urC; zxjoL0x5Ie6epc6|`MlBZ-kw*!gi*_ji3fSeHh=_u;E?KI`Hf&dbJH2>DM~{I%W1=I3vn zA3;3o@+!1z^U9sS?))Ff$@$mTcJAxW-au|Cu&3`M&##(4e>N%i+1cRym-o-^7VjVY zNYCf^`Tt$9drmHS|75*~SB9`#lJ}tT7ZwKPeWdT-3;8GP`#0tNLw-j0=KDz3t^WPH zPxxM!%fA1Hh61}AqoWy}NG`2G`sDszv5RV z-R1rBz|{Ks`hprmG4+Uk){DBtBHyPzxoYf>?-y#>Y*tdqUW(<@HgSj8-RAQZ6a47& zMX8%Mef!gYXS_%2Cj8r%yAs43Ox@#uAU|@IUH!v2br6_(2uxiBrapqdo*Qu2dmPo_ zl9?+l&21KHd;chpmCu;@j@2{%e4*C&OQ|w-spaaB@5g5dk>k&J8vg;=&zf)eOWg&g z{sL2nfvJ-sZ0j;G^;yKQ^xJBbfRviifRh&s63o>-UTGPxp(>k5>LN zZuw@jE~^6ma-I~y%opJn>+9-d{HJaOQ#XUDCqwM&MsPA7)YVZu#)JAgeZRyRkT392 z{&HS#!M`QnpgzanBwy-v#vAx$#xUrcYmDvF~gAwJ!iu4}<9w!1OJvqyD_+u=3Tu z?dZ~tO^xxQypKI;6nLJ#BE+t*0n^`rse{4PrDAJ-^~`)n;coBIywpEuU$?OChX4FFzW!Ayf^9u%$E(%&^NQVXO8P`JZu6tsY`+Bk z5&kFhBe`E%udnUz9N)=!K1cpU{?{{T9C!S^l@;ru*3YWLrQ>7q@kPZKFJ3L#3J7cI z`(^9=Xk6bIU)jIA?f$KF1QihLv9dz_FaBH}8L9KXb89}9FY7}e45l9j(-(v3kE8m} zM&6X{9sjn7M=U>Doma%yc0WeyKWitw{A%7B!(jSxFnu|g{=9*|3j_W| z@vs98@klwJ!|#Xlx!;8K|JMBJ_wkp$Kf+dbu(;}@12B#r07e%8C;K1WPo5XAr@XNH zrM?!QOV)4ueEfaX^m+Su@V*Mh9e?}%Vli#~(Hrm=-NE4x9#elf6pM1KIIKY-C6rq|AWoxxAs--EnohiKj0tw0~r0`@)iHyexZo|z&QE?82tf^{s2aQfIsIAe8c_Y z;sG98o;mgYb8p;6e;8Z->3g5Ncy9{*fq10N2Y<%X_@h7IFZu%*{Q->r0H$A$u+<;H z?7xV=OUV{|Z!G`yl4cnC!}5RpdjWR;j+7n`JO88c&t&j7$p`&`ar6f;`a^`R{s2aQ zi1^zTPOfjr*Xa*@AN>K0{?IZW(=(?J&twiauD{hEm=FCS9b5fjdhLaFBU@1Slj;v( z^0gHnTYLAza~+v5pF_T`AICoW1DJjdOur4Lzl`Ex^#{q1chA@Dmo;O4|H=zrd~>`0 z!pHKJ_eI@#74#p8{AHYYr><{;Fa0=t&>z6`ry+Lw12`EE^oJ-OR)0v}FD@b>pEy?j zf&P%n-#)(u-#~xB-y~o32gV!tI{krh`fV`!1DJjryhVPboTu^gDUE-`*Xj>x`HcR6 zKgoPf@|l^asf|x#a!o{#_LN^p{}zDKPyu82#bIdiT8x{{2vYII%8=$ETM<{ekDv zA42TG81o1NP`I!RQa*WIWIx z!f~fRggC*M{*>`XzE*!oFZu%*{Q->r07icRqd$PrACmmpU-%cr z!^I~NkL~YYJL7iwqd(v;`a^`R{viFJT-_V!4~(NffYBeo$^J*r(?EZytEU3JAc2X8 qecqV*_ffOwi6_s)-{N91ZT-<7@E85T^7Z#O(;q}02rm79A^ry+OMH9) literal 0 HcmV?d00001 diff --git a/tests/txd/dxtDecoding.ts.test.ts b/tests/txd/dxtDecoding.ts.test.ts new file mode 100644 index 0000000..812f5aa --- /dev/null +++ b/tests/txd/dxtDecoding.ts.test.ts @@ -0,0 +1,57 @@ +import { readFile } from 'node:fs/promises'; +import { join } from 'node:path'; +import { TxdParser, RwTxd } from '../../src'; + +describe('txd parsing - dxtDecoding', () => { + let rwTxd: RwTxd; + let dxtJsOut:{[key: string]: number[]} = {}; + + beforeAll(async () => { + // Disable console debug for now, because of missing structures + const consoleDebug = console.debug; + console.debug = jest.fn(); + + const txdParser = new TxdParser(await readFile(join(__dirname, '../assets/dxtDecoding.txd'))); + rwTxd = txdParser.parse(); + + dxtJsOut = JSON.parse(await readFile(join(__dirname, '../assets/dxtDecoding.dxt-js.json'), 'utf8')); + + console.debug = consoleDebug; + }); + + test('texture dictionary', () => { + expect(rwTxd.textureDictionary).toBeDefined(); + }); + + test('texture dictionary - length', () => { + expect(rwTxd.textureDictionary.textureCount).toBe(3); + expect(rwTxd.textureDictionary.textureNatives).toHaveLength(rwTxd.textureDictionary.textureCount); + }); + + test('texture dictionary - decoding dxt1', () => { + for (let i = 0; i < rwTxd.textureDictionary.textureNatives[0].mipmaps[0].length; i++) { + const dxtJsValue = dxtJsOut['DXT1'][i]; + const calculatedValue = rwTxd.textureDictionary.textureNatives[0].mipmaps[0][i] + expect(calculatedValue).toBeLessThanOrEqual(dxtJsValue + 1); + expect(calculatedValue).toBeGreaterThanOrEqual(dxtJsValue - 1); + } + }); + + test('texture dictionary - decoding dxt3', () => { + for (let i = 0; i < rwTxd.textureDictionary.textureNatives[1].mipmaps[0].length; i++) { + const dxtJsValue = dxtJsOut['DXT3'][i]; + const calculatedValue = rwTxd.textureDictionary.textureNatives[1].mipmaps[0][i] + expect(calculatedValue).toBeLessThanOrEqual(dxtJsValue + 1); + expect(calculatedValue).toBeGreaterThanOrEqual(dxtJsValue - 1); + } + }); + + test('texture dictionary - decoding dxt5', () => { + for (let i = 0; i < rwTxd.textureDictionary.textureNatives[2].mipmaps[0].length; i++) { + const dxtJsValue = dxtJsOut['DXT5'][i]; + const calculatedValue = rwTxd.textureDictionary.textureNatives[2].mipmaps[0][i] + expect(calculatedValue).toBeLessThanOrEqual(dxtJsValue + 1); + expect(calculatedValue).toBeGreaterThanOrEqual(dxtJsValue - 1); + } + }); +});