diff --git a/e2e/fragments/AtImageView.js b/e2e/fragments/AtImageView.js index 532c60769..b928f0cc7 100644 --- a/e2e/fragments/AtImageView.js +++ b/e2e/fragments/AtImageView.js @@ -95,7 +95,7 @@ module.exports = { }, /** - * Get pixel color at point + * Get pixel color at point * @param {number} x * @param {number} y * @param {number[]} rgbArray diff --git a/e2e/tests/helpers.js b/e2e/tests/helpers.js index 739a3d134..b4174de8e 100644 --- a/e2e/tests/helpers.js +++ b/e2e/tests/helpers.js @@ -444,6 +444,14 @@ const areEqualRGB = (a, b, tolerance) => { return true; }; +const setKonvaLayersOpacity = ([opacity]) => { + const stage = window.Konva.stages[0]; + + for (const layer of stage.getLayers()) { + layer.canvas._canvas.style.opacity = opacity; + } +}; + const getKonvaPixelColorFromPoint = ([x, y]) => { const stage = window.Konva.stages[0]; const colors = []; @@ -731,6 +739,7 @@ module.exports = { getCanvasSize, getImageSize, getImageFrameSize, + setKonvaLayersOpacity, setZoom, whereIsPixel, countKonvaShapes, diff --git a/e2e/tests/image.magic-wand.test.js b/e2e/tests/image.magic-wand.test.js new file mode 100644 index 000000000..e060d3593 --- /dev/null +++ b/e2e/tests/image.magic-wand.test.js @@ -0,0 +1,199 @@ +/* global Feature, Scenario */ + +const { + initLabelStudio, + hasKonvaPixelColorAtPoint, + setKonvaLayersOpacity, + serialize, + waitForImage, +} = require('./helpers'); +const assert = require('assert'); + +Feature('Test Image Magic Wand'); + +const CLOUDSHADOW = { + color: '#1EAE3B', + rgbArray: [30, 174, 59], +}; +const HAZE = { + color: '#68eee5', + rgbArray: [104, 238, 229], +}; +const CLOUD = { + color: '#1b32de', + rgbArray: [27, 50, 222], +}; + +const config = ` + + + + + + + + `; + +const annotationEmpty = { + id: '1000', + result: [], +}; + +// TODO: Change these URLs to heartex URLs, and ensure the heartex bucket allows CORS access +// for these to work. +const data = { + 'image': [ + 'http://htx-pub.s3.amazonaws.com/samples/magicwand/magic_wand_scale_1_20200902_015806_26_2235_1B_AnalyticMS_00750_00750.jpg', + 'http://htx-pub.s3.amazonaws.com/samples/magicwand/magic_wand_scale_2_20200902_015806_26_2235_1B_AnalyticMS_00750_00750.jpg', + 'http://htx-pub.s3.amazonaws.com/samples/magicwand/magic_wand_scale_3_20200902_015806_26_2235_1B_AnalyticMS_00750_00750.jpg', + 'http://htx-pub.s3.amazonaws.com/samples/magicwand/magic_wand_false_color_20200902_015806_26_2235_1B_AnalyticMS_00750_00750.jpg', + ], + 'thumb': 'http://htx-pub.s3.amazonaws.com/samples/magicwand/magic_wand_thumbnail_20200902_015806_26_2235_1B_AnalyticMS_00750_00750.jpg', +}; + +async function magicWand(I, { msg, fromX, fromY, toX, toY }) { + I.usePlaywrightTo(msg, async ({ page }) => { + await page.mouse.move(fromX, fromY); + await page.mouse.down(); + await page.mouse.move(toX, toY); + await page.mouse.up(); + }); + I.wait(1); // Ensure that the magic wand brush region is fully finished being created. +} + +async function assertMagicWandPixel(I, x, y, assertValue, rgbArray, msg) { + const hasPixel = await I.executeScript(hasKonvaPixelColorAtPoint, [x, y, rgbArray, 1]); + + assert.equal(hasPixel, assertValue, msg); +} + +Scenario('Make sure the magic wand works in a variety of scenarios', async function({ I, LabelStudio, AtImageView, AtSidebar }) { + const params = { + config, + data, + annotations: [annotationEmpty], + }; + + I.amOnPage('/'); + + LabelStudio.setFeatureFlags({ + 'fflag_feat_front_dev_4081_magic_wand_tool': true, + }); + + I.executeScript(initLabelStudio, params); + + AtImageView.waitForImage(); + await AtImageView.lookForStage(); + I.executeScript(waitForImage); + + I.say('Making sure magic wand button is present'); + I.seeElement('.lsf-toolbar__group button[aria-label="magicwand"]'); + + I.say('Making sure Eraser button is present'); + I.seeElement('.lsf-toolbar__group button[aria-label="eraser"]'); + + I.say('Select magic wand & cloud class'); + I.pressKey('W'); + I.pressKey('4'); + + AtSidebar.seeRegions(0); + + I.say('Magic wanding clouds with cloud class in upper left of image'); + await magicWand(I, { msg: 'Fill in clouds upper left', fromX: 258, fromY: 214, toX: 650, toY: 650 }); + await magicWand(I, { msg: 'Fill in clouds lower left', fromX: 337, fromY: 777, toX: 650, toY: 650 }); + + I.say('Ensuring repeated magic wands back to back with same class collapsed into single region'); + AtSidebar.seeRegions(1); + AtSidebar.see('Cloud'); + + // Force all the magic wand regions to be a consistent color with no opacity to make testing + // magic wand pixel colors more robust. + I.say('Ensuring cloud magic wand pixels are correctly filled color'); + await I.executeScript(setKonvaLayersOpacity, [1.0]); + assertMagicWandPixel(I, 0, 0, false, CLOUD.rgbArray, + 'Far upper left corner should not have magic wand cloud class'); + assertMagicWandPixel(I, 260, 50, true, CLOUD.rgbArray, + 'Upper left should have magic wand cloud class'); + assertMagicWandPixel(I, 300, 620, true, CLOUD.rgbArray, + 'Lower left should have magic wand cloud class'); + assertMagicWandPixel(I, 675, 650, false, CLOUD.rgbArray, + 'Far lower right corner should not have magic wand cloud class'); + + // Make sure the region made from this is correct. + I.say('Ensuring magic wand brushregion was created correctly'); + const result = await I.executeScript(serialize); + const entry = result[1]; + + assert.equal(entry['from_name'], 'labels_1'); + assert.equal(entry['type'], 'labels'); + const labels = entry['value']['labels']; + + assert.equal(labels.length, 1); + assert.equal(labels[0], 'Cloud'); + assert.equal(entry['value']['rle'].length > 0, true); + + // Undo the bottom left area we just added, make sure its gone but our region list is still + // 1, then redo it and ensure its back and our region list is still 1 again. + I.say('Undoing last cloud magic wand and ensuring it worked correctly'); + I.click('button[aria-label="Undo"]'); + assertMagicWandPixel(I, 300, 620, false, CLOUD.rgbArray, + 'Undone lower left should not have magic wand cloud class anymore'); + assertMagicWandPixel(I, 260, 50, true, CLOUD.rgbArray, + 'Upper left should still have magic wand cloud class'); + AtSidebar.seeRegions(1); + + I.say('Redoing last cloud magic wand and ensuring it worked correctly'); + I.click('button[aria-label="Redo"]'); + assertMagicWandPixel(I, 300, 620, true, CLOUD.rgbArray, + 'Redone lower left should have magic wand cloud class again'); + assertMagicWandPixel(I, 260, 50, true, CLOUD.rgbArray, + 'Upper left should still have magic wand cloud class'); + AtSidebar.seeRegions(1); + + I.say('Unselecting last magic wand region'); + I.pressKey('Escape'); + + // @todo currently gallery doesn't work well with CORS, so this is not covered by test + // Change to the false color view, zoom in, and magic wand with a new class. + // I.say('Changing to false-color view'); + // I.click('[class*="gallery--"] img[src*="false_color"]'); + + I.say('Zooming in'); + I.click('button[aria-label="zoom-in"]'); + I.click('button[aria-label="zoom-in"]'); + I.click('button[aria-label="zoom-in"]'); + I.click('button[aria-label="zoom-in"]'); + I.click('button[aria-label="zoom-in"]'); + + I.say('Selecting cloud shadow class'); + I.pressKey('2'); + + I.say('Magic wanding cloud shadows with cloud shadow class in center of zoomed image'); + await magicWand(I, { msg: 'Cloud shadow in middle of image', fromX: 390, fromY: 500, toX: 500, toY: 500 }); + + I.say('Ensuring new cloud shadow magic wand region gets added to sidebar'); + AtSidebar.seeRegions(2); + AtSidebar.see('Cloud Shadow'); + + I.say('Ensuring cloud shadow magic wand pixels are correctly filled color'); + await I.executeScript(setKonvaLayersOpacity, [1.0]); + assertMagicWandPixel(I, 0, 0, false, CLOUDSHADOW.rgbArray, + 'Zoomed upper left corner should not have cloud shadow'); + assertMagicWandPixel(I, 350, 360, true, CLOUDSHADOW.rgbArray, + 'Center area should have magic wand cloud shadow class'); + + // Make sure if you have a region selected then change the class the region class changes. + I.say('Changing class of existing selected region to Haze should change it to new class'); + I.pressKey('3'); + AtSidebar.seeRegions(2); + AtSidebar.dontSee('Cloud Shadow'); + AtSidebar.see('Haze'); + await I.executeScript(setKonvaLayersOpacity, [1.0]); + assertMagicWandPixel(I, 350, 360, true, HAZE.rgbArray, + 'Center area should have magic wand haze class'); +}); \ No newline at end of file diff --git a/examples/image_magic_wand/START.md b/examples/image_magic_wand/START.md new file mode 100644 index 000000000..a07677592 --- /dev/null +++ b/examples/image_magic_wand/START.md @@ -0,0 +1,44 @@ + +# Magic Wand for Image Segmentation + +![Magic Wand](/images/screenshots/image_magic_wand.png "Magic Wand") + +# Install + +## Linux & Ubuntu guide + +Install python and virtualenv + +```bash +# install python and virtualenv +apt install python3.6 +pip3 install virtualenv + +# setup python virtual environment +virtualenv -p python3 env3 +source env3/bin/activate + +# install requirements +cd backend +pip install -r requirements.txt +``` + +## Cross Domain Image Access + +Note that if you are storing images that you'd like to apply the Magic Wand to cross-domain, such as on Google Storage Buckets, you will have to [enable CORS headers for the storage buckets to enable cross-domain pixel access](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image) so that the Magic Wand can get the raw pixel data to threshold. By default browsers block JavaScript from accessing pixel-level image data unless the right CORS headers are set. + +As an example, if you wanted to configure a Google Storage Bucket with the right headers, you might do the following: + +```bash +gsutil cors set gcp_cors_config.json gs://BUCKET-NAME +``` + +Note that in the gcp_cors_config.json example given in this directory that we have set `origin` to `*`, which means all origins can access that data, as well as set `responseHeader` to `*`, which means all HTTP response headers can be accessed. In a real scenario you probably want to think through the security ramifications of this for your own particular Label Studio setup. + +# Start + +Magic Wand for image segmentation: + +```bash +fflag_feat_front_dev_4081_magic_wand_tool=1 python server.py -c config.json -l ../examples/image_magic_wand/config.xml -i ../examples/image_magic_wand/tasks.json -o output +``` diff --git a/examples/image_magic_wand/annotations/1.json b/examples/image_magic_wand/annotations/1.json new file mode 100644 index 000000000..bb2f6e4cf --- /dev/null +++ b/examples/image_magic_wand/annotations/1.json @@ -0,0 +1,34963 @@ +{ + "annotations": [ + { + "id": 2, + "lead_time": 5.85, + "result": [ + { + "original_width": 3000, + "original_height": 2860, + "image_rotation": 0, + "value": { + "format": "rle", + "rle": [ + 2, + 11, + 174, + 128, + 57, + 27, + 255, + 6, + 107, + 0, + 224, + 79, + 255, + 251, + 12, + 3, + 129, + 113, + 255, + 237, + 48, + 14, + 6, + 95, + 255, + 192, + 204, + 192, + 56, + 24, + 63, + 255, + 30, + 119, + 0, + 224, + 79, + 255, + 251, + 12, + 3, + 129, + 113, + 255, + 237, + 48, + 14, + 6, + 95, + 255, + 192, + 204, + 192, + 56, + 24, + 63, + 255, + 30, + 119, + 0, + 224, + 79, + 255, + 250, + 204, + 3, + 129, + 121, + 255, + 237, + 48, + 14, + 6, + 207, + 255, + 192, + 190, + 192, + 56, + 24, + 63, + 255, + 30, + 119, + 0, + 224, + 79, + 255, + 250, + 188, + 3, + 129, + 123, + 255, + 237, + 48, + 14, + 6, + 215, + 255, + 192, + 189, + 192, + 56, + 24, + 63, + 255, + 30, + 119, + 0, + 224, + 79, + 255, + 250, + 188, + 3, + 129, + 123, + 255, + 237, + 48, + 14, + 6, + 215, + 255, + 192, + 189, + 192, + 56, + 24, + 63, + 255, + 30, + 119, + 0, + 224, + 79, + 255, + 250, + 188, + 3, + 129, + 123, + 255, + 237, + 48, + 14, + 6, + 215, + 255, + 192, + 189, + 192, + 56, + 24, + 63, + 255, + 30, + 119, + 0, + 224, + 79, + 255, + 250, + 188, + 3, + 129, + 123, + 255, + 237, + 48, + 14, + 6, + 215, + 255, + 192, + 189, + 192, + 56, + 24, + 63, + 255, + 30, + 119, + 0, + 224, + 79, + 255, + 250, + 44, + 3, + 129, + 149, + 255, + 235, + 48, + 14, + 7, + 31, + 255, + 192, + 184, + 192, + 56, + 24, + 223, + 255, + 30, + 99, + 0, + 224, + 79, + 255, + 250, + 28, + 3, + 129, + 153, + 255, + 234, + 176, + 14, + 7, + 39, + 255, + 192, + 184, + 192, + 56, + 24, + 223, + 255, + 30, + 99, + 0, + 224, + 79, + 255, + 250, + 28, + 3, + 129, + 153, + 255, + 234, + 176, + 14, + 7, + 39, + 255, + 192, + 184, + 192, + 56, + 24, + 223, + 255, + 30, + 99, + 0, + 224, + 79, + 255, + 250, + 28, + 3, + 129, + 153, + 255, + 234, + 176, + 14, + 7, + 39, + 255, + 192, + 184, + 192, + 56, + 24, + 223, + 255, + 30, + 99, + 0, + 224, + 79, + 255, + 250, + 28, + 3, + 129, + 153, + 255, + 234, + 176, + 14, + 7, + 39, + 255, + 192, + 184, + 192, + 56, + 24, + 223, + 255, + 30, + 99, + 0, + 224, + 79, + 255, + 249, + 220, + 3, + 129, + 179, + 255, + 228, + 240, + 14, + 8, + 7, + 255, + 192, + 170, + 192, + 56, + 26, + 159, + 255, + 30, + 43, + 0, + 224, + 79, + 255, + 249, + 220, + 3, + 129, + 179, + 255, + 228, + 240, + 14, + 8, + 7, + 255, + 192, + 170, + 192, + 56, + 26, + 191, + 255, + 30, + 39, + 0, + 224, + 79, + 255, + 249, + 220, + 3, + 129, + 179, + 255, + 228, + 240, + 14, + 8, + 7, + 255, + 192, + 170, + 192, + 56, + 26, + 191, + 255, + 30, + 39, + 0, + 224, + 79, + 255, + 249, + 204, + 3, + 129, + 181, + 255, + 228, + 240, + 14, + 8, + 7, + 255, + 192, + 170, + 192, + 56, + 26, + 191, + 255, + 30, + 39, + 0, + 224, + 79, + 255, + 249, + 204, + 3, + 129, + 181, + 255, + 228, + 240, + 14, + 8, + 7, + 255, + 192, + 170, + 192, + 56, + 26, + 191, + 255, + 30, + 39, + 0, + 224, + 79, + 255, + 249, + 204, + 3, + 131, + 233, + 255, + 240, + 41, + 112, + 14, + 7, + 223, + 255, + 199, + 99, + 192, + 56, + 19, + 255, + 254, + 115, + 0, + 224, + 250, + 127, + 252, + 10, + 92, + 3, + 129, + 247, + 255, + 241, + 216, + 240, + 14, + 4, + 255, + 255, + 156, + 192, + 56, + 62, + 159, + 255, + 2, + 151, + 0, + 224, + 125, + 255, + 252, + 118, + 60, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 167, + 255, + 192, + 165, + 192, + 56, + 31, + 127, + 255, + 29, + 143, + 0, + 224, + 79, + 255, + 249, + 204, + 3, + 131, + 233, + 255, + 240, + 41, + 112, + 14, + 7, + 223, + 255, + 199, + 99, + 192, + 56, + 19, + 255, + 254, + 115, + 0, + 224, + 252, + 255, + 252, + 10, + 12, + 3, + 130, + 1, + 255, + 241, + 215, + 176, + 14, + 4, + 255, + 255, + 156, + 192, + 56, + 63, + 63, + 255, + 2, + 131, + 0, + 224, + 128, + 127, + 252, + 117, + 236, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 207, + 255, + 192, + 160, + 192, + 56, + 32, + 31, + 255, + 29, + 123, + 0, + 224, + 79, + 255, + 249, + 204, + 3, + 131, + 243, + 255, + 240, + 40, + 48, + 14, + 8, + 7, + 255, + 199, + 94, + 192, + 56, + 19, + 255, + 254, + 115, + 0, + 224, + 252, + 255, + 252, + 10, + 12, + 3, + 130, + 1, + 255, + 241, + 215, + 176, + 14, + 4, + 255, + 255, + 156, + 192, + 56, + 63, + 223, + 255, + 2, + 127, + 0, + 224, + 131, + 127, + 252, + 117, + 76, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 159, + 192, + 56, + 32, + 223, + 255, + 29, + 83, + 0, + 224, + 79, + 255, + 249, + 204, + 3, + 131, + 253, + 255, + 240, + 40, + 48, + 14, + 8, + 47, + 255, + 199, + 84, + 192, + 56, + 19, + 255, + 254, + 115, + 0, + 224, + 255, + 127, + 252, + 10, + 12, + 3, + 130, + 11, + 255, + 241, + 213, + 48, + 14, + 4, + 255, + 255, + 156, + 192, + 56, + 63, + 223, + 255, + 2, + 131, + 0, + 224, + 130, + 255, + 252, + 117, + 76, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 53, + 127, + 254, + 231, + 0, + 224, + 131, + 127, + 252, + 116, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 53, + 127, + 254, + 231, + 0, + 224, + 131, + 127, + 252, + 116, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 53, + 127, + 254, + 231, + 0, + 224, + 131, + 127, + 252, + 116, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 53, + 127, + 254, + 231, + 0, + 224, + 131, + 127, + 252, + 116, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 54, + 95, + 255, + 1, + 47, + 0, + 224, + 124, + 255, + 252, + 115, + 236, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 54, + 191, + 255, + 1, + 35, + 0, + 224, + 125, + 255, + 252, + 115, + 204, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 54, + 191, + 255, + 1, + 35, + 0, + 224, + 125, + 255, + 252, + 115, + 204, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 54, + 191, + 255, + 1, + 35, + 0, + 224, + 125, + 255, + 252, + 115, + 204, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 54, + 191, + 255, + 1, + 35, + 0, + 224, + 125, + 255, + 252, + 115, + 204, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 31, + 255, + 186, + 192, + 55, + 191, + 255, + 1, + 35, + 0, + 224, + 138, + 127, + 252, + 113, + 252, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 31, + 255, + 185, + 192, + 55, + 223, + 255, + 1, + 35, + 0, + 224, + 138, + 127, + 252, + 113, + 252, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 31, + 255, + 185, + 192, + 55, + 223, + 255, + 1, + 35, + 0, + 224, + 138, + 127, + 252, + 113, + 252, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 31, + 255, + 185, + 192, + 55, + 223, + 255, + 1, + 35, + 0, + 224, + 138, + 255, + 252, + 113, + 236, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 31, + 255, + 185, + 192, + 55, + 223, + 255, + 1, + 35, + 0, + 224, + 138, + 255, + 252, + 113, + 236, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 138, + 127, + 252, + 113, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 138, + 127, + 252, + 113, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 138, + 127, + 252, + 113, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 138, + 127, + 252, + 113, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 138, + 127, + 252, + 113, + 252, + 3, + 129, + 43, + 255, + 232, + 112, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 140, + 255, + 252, + 113, + 172, + 3, + 129, + 43, + 255, + 232, + 112, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 140, + 255, + 252, + 113, + 172, + 3, + 129, + 43, + 255, + 232, + 112, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 140, + 255, + 252, + 113, + 172, + 3, + 129, + 43, + 255, + 232, + 112, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 140, + 255, + 252, + 113, + 172, + 3, + 129, + 43, + 255, + 232, + 112, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 140, + 255, + 252, + 111, + 220, + 3, + 129, + 101, + 255, + 232, + 112, + 14, + 16, + 111, + 255, + 175, + 192, + 55, + 223, + 255, + 1, + 75, + 0, + 224, + 138, + 127, + 252, + 111, + 220, + 3, + 129, + 101, + 255, + 232, + 112, + 14, + 16, + 111, + 255, + 175, + 192, + 55, + 223, + 255, + 1, + 75, + 0, + 224, + 138, + 127, + 252, + 111, + 220, + 3, + 129, + 101, + 255, + 232, + 176, + 14, + 16, + 103, + 255, + 175, + 192, + 55, + 223, + 255, + 1, + 75, + 0, + 224, + 138, + 127, + 252, + 111, + 220, + 3, + 129, + 101, + 255, + 232, + 176, + 14, + 16, + 103, + 255, + 175, + 192, + 55, + 223, + 255, + 1, + 75, + 0, + 224, + 138, + 127, + 252, + 111, + 220, + 3, + 129, + 101, + 255, + 232, + 176, + 14, + 16, + 103, + 255, + 175, + 192, + 55, + 223, + 255, + 1, + 75, + 0, + 224, + 138, + 127, + 252, + 111, + 220, + 3, + 129, + 101, + 255, + 233, + 176, + 14, + 16, + 103, + 255, + 166, + 192, + 56, + 8, + 127, + 255, + 1, + 75, + 0, + 224, + 140, + 255, + 252, + 111, + 140, + 3, + 129, + 101, + 255, + 233, + 176, + 14, + 16, + 103, + 255, + 166, + 192, + 56, + 8, + 127, + 255, + 1, + 75, + 0, + 224, + 140, + 255, + 252, + 111, + 140, + 3, + 129, + 101, + 255, + 233, + 176, + 14, + 16, + 103, + 255, + 166, + 192, + 56, + 8, + 127, + 255, + 1, + 75, + 0, + 224, + 140, + 255, + 252, + 111, + 140, + 3, + 129, + 101, + 255, + 233, + 176, + 14, + 16, + 103, + 255, + 166, + 192, + 56, + 8, + 127, + 255, + 1, + 75, + 0, + 224, + 140, + 255, + 252, + 111, + 140, + 3, + 129, + 101, + 255, + 233, + 176, + 14, + 16, + 103, + 255, + 166, + 192, + 56, + 8, + 127, + 255, + 1, + 75, + 0, + 224, + 140, + 255, + 252, + 111, + 140, + 3, + 133, + 205, + 255, + 232, + 176, + 14, + 2, + 63, + 255, + 152, + 192, + 52, + 63, + 254, + 95, + 0, + 224, + 143, + 127, + 252, + 111, + 60, + 3, + 133, + 205, + 255, + 232, + 176, + 14, + 2, + 63, + 255, + 152, + 192, + 52, + 63, + 254, + 95, + 0, + 224, + 143, + 127, + 252, + 111, + 60, + 3, + 133, + 205, + 255, + 232, + 176, + 14, + 2, + 63, + 255, + 152, + 192, + 52, + 63, + 254, + 95, + 0, + 224, + 143, + 127, + 252, + 111, + 60, + 3, + 133, + 205, + 255, + 232, + 176, + 14, + 2, + 63, + 255, + 152, + 192, + 52, + 63, + 254, + 95, + 0, + 224, + 143, + 127, + 252, + 111, + 60, + 3, + 133, + 205, + 255, + 232, + 176, + 14, + 2, + 63, + 255, + 152, + 192, + 52, + 63, + 254, + 107, + 0, + 224, + 141, + 255, + 252, + 111, + 60, + 3, + 133, + 215, + 255, + 230, + 48, + 14, + 2, + 103, + 255, + 152, + 192, + 52, + 63, + 254, + 135, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 215, + 255, + 230, + 48, + 14, + 2, + 103, + 255, + 152, + 192, + 52, + 63, + 254, + 135, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 215, + 255, + 230, + 48, + 14, + 2, + 103, + 255, + 152, + 192, + 52, + 63, + 254, + 135, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 215, + 255, + 230, + 48, + 14, + 2, + 103, + 255, + 152, + 192, + 52, + 63, + 254, + 135, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 225, + 255, + 227, + 176, + 14, + 2, + 143, + 255, + 147, + 192, + 53, + 95, + 254, + 119, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 225, + 255, + 227, + 176, + 14, + 2, + 143, + 255, + 147, + 192, + 53, + 127, + 254, + 115, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 225, + 255, + 227, + 176, + 14, + 2, + 143, + 255, + 147, + 192, + 53, + 127, + 254, + 115, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 225, + 255, + 227, + 176, + 14, + 2, + 143, + 255, + 147, + 192, + 53, + 127, + 254, + 115, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 225, + 255, + 227, + 176, + 14, + 2, + 143, + 255, + 147, + 192, + 53, + 127, + 254, + 115, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 134, + 163, + 255, + 228, + 240, + 13, + 95, + 255, + 161, + 192, + 56, + 33, + 255, + 255, + 27, + 207, + 0, + 225, + 168, + 255, + 249, + 60, + 3, + 87, + 255, + 232, + 112, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 106, + 63, + 254, + 79, + 0, + 213, + 255, + 250, + 28, + 3, + 130, + 31, + 255, + 241, + 188, + 240, + 14, + 26, + 143, + 255, + 147, + 192, + 53, + 127, + 254, + 135, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 134, + 163, + 255, + 228, + 240, + 13, + 95, + 255, + 161, + 192, + 56, + 33, + 255, + 255, + 27, + 207, + 0, + 225, + 173, + 255, + 248, + 76, + 3, + 105, + 255, + 231, + 112, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 107, + 127, + 254, + 19, + 0, + 218, + 127, + 249, + 220, + 3, + 130, + 31, + 255, + 241, + 188, + 240, + 14, + 26, + 223, + 255, + 132, + 192, + 54, + 159, + 254, + 119, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 134, + 183, + 255, + 225, + 48, + 13, + 175, + 255, + 156, + 192, + 56, + 33, + 255, + 255, + 27, + 207, + 0, + 225, + 173, + 255, + 248, + 76, + 3, + 107, + 255, + 231, + 48, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 115, + 255, + 254, + 79, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 135, + 63, + 255, + 228, + 240, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 115, + 255, + 254, + 79, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 135, + 63, + 255, + 228, + 240, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 115, + 255, + 254, + 79, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 135, + 63, + 255, + 228, + 240, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 115, + 255, + 254, + 79, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 135, + 63, + 255, + 228, + 240, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 115, + 255, + 254, + 79, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 135, + 63, + 255, + 228, + 240, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 117, + 223, + 254, + 19, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 135, + 93, + 255, + 225, + 48, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 117, + 223, + 254, + 19, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 135, + 93, + 255, + 225, + 48, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 117, + 223, + 254, + 19, + 0, + 224, + 135, + 255, + 252, + 111, + 124, + 3, + 137, + 127, + 255, + 241, + 189, + 240, + 14, + 37, + 255, + 255, + 198, + 247, + 192, + 56, + 151, + 255, + 255, + 27, + 223, + 0, + 226, + 95, + 255, + 252, + 111, + 124, + 3, + 137, + 59, + 255, + 241, + 198, + 112, + 14, + 36, + 239, + 255, + 199, + 25, + 192, + 56, + 147, + 191, + 255, + 28, + 103, + 0, + 226, + 78, + 255, + 252, + 113, + 156, + 3, + 137, + 59, + 255, + 241, + 198, + 112, + 14, + 36, + 199, + 255, + 199, + 30, + 192, + 56, + 147, + 31, + 255, + 28, + 123, + 0, + 226, + 76, + 127, + 252, + 113, + 236, + 3, + 137, + 49, + 255, + 241, + 199, + 176, + 14, + 36, + 199, + 255, + 199, + 30, + 192, + 56, + 147, + 31, + 255, + 28, + 123, + 0, + 226, + 76, + 127, + 252, + 113, + 236, + 3, + 137, + 49, + 255, + 241, + 199, + 176, + 14, + 36, + 199, + 255, + 199, + 30, + 192, + 56, + 147, + 31, + 255, + 28, + 123, + 0, + 226, + 78, + 255, + 252, + 113, + 156, + 3, + 137, + 59, + 255, + 241, + 198, + 112, + 14, + 36, + 239, + 255, + 199, + 25, + 192, + 56, + 147, + 191, + 255, + 28, + 103, + 0, + 226, + 78, + 255, + 252, + 113, + 156, + 3, + 137, + 59, + 255, + 241, + 198, + 112, + 14, + 36, + 239, + 255, + 199, + 25, + 192, + 56, + 147, + 191, + 255, + 28, + 103, + 0, + 226, + 78, + 255, + 252, + 113, + 156, + 3, + 137, + 59, + 255, + 241, + 198, + 112, + 14, + 36, + 239, + 255, + 199, + 25, + 192, + 56, + 147, + 191, + 255, + 28, + 103, + 0, + 226, + 78, + 255, + 252, + 113, + 156, + 3, + 137, + 59, + 255, + 241, + 198, + 176, + 14, + 36, + 231, + 255, + 199, + 30, + 192, + 56, + 147, + 31, + 255, + 28, + 123, + 0, + 226, + 76, + 127, + 252, + 113, + 236, + 3, + 137, + 49, + 255, + 241, + 199, + 176, + 14, + 36, + 199, + 255, + 199, + 30, + 192, + 56, + 147, + 31, + 255, + 28, + 123, + 0, + 226, + 76, + 127, + 252, + 113, + 236, + 3, + 137, + 49, + 255, + 241, + 199, + 176, + 14, + 36, + 199, + 255, + 199, + 30, + 192, + 56, + 147, + 31, + 255, + 28, + 183, + 0, + 226, + 68, + 255, + 252, + 114, + 220, + 3, + 137, + 19, + 255, + 241, + 203, + 112, + 14, + 36, + 79, + 255, + 199, + 45, + 192, + 56, + 145, + 63, + 255, + 28, + 183, + 0, + 226, + 68, + 255, + 252, + 115, + 44, + 3, + 137, + 9, + 255, + 241, + 204, + 176, + 14, + 36, + 39, + 255, + 199, + 50, + 192, + 56, + 144, + 159, + 255, + 28, + 203, + 0, + 226, + 66, + 127, + 252, + 115, + 44, + 3, + 137, + 9, + 255, + 241, + 206, + 240, + 14, + 35, + 223, + 255, + 199, + 59, + 192, + 56, + 143, + 127, + 255, + 28, + 239, + 0, + 226, + 61, + 255, + 252, + 115, + 188, + 3, + 136, + 247, + 255, + 241, + 206, + 240, + 14, + 35, + 223, + 255, + 199, + 59, + 192, + 56, + 143, + 127, + 255, + 28, + 239, + 0, + 226, + 61, + 255, + 252, + 115, + 188, + 3, + 136, + 247, + 255, + 241, + 206, + 240, + 14, + 35, + 223, + 255, + 199, + 60, + 192, + 56, + 143, + 95, + 255, + 29, + 3, + 0, + 226, + 56, + 255, + 252, + 116, + 92, + 3, + 136, + 227, + 255, + 241, + 209, + 112, + 14, + 35, + 143, + 255, + 199, + 69, + 192, + 56, + 142, + 63, + 255, + 29, + 27, + 0, + 226, + 56, + 127, + 252, + 116, + 172, + 3, + 136, + 217, + 255, + 241, + 210, + 176, + 14, + 35, + 103, + 255, + 199, + 74, + 192, + 56, + 141, + 159, + 255, + 29, + 43, + 0, + 226, + 54, + 127, + 252, + 116, + 172, + 3, + 136, + 215, + 255, + 241, + 210, + 240, + 14, + 35, + 23, + 255, + 199, + 84, + 192, + 56, + 140, + 95, + 255, + 29, + 83, + 0, + 226, + 49, + 127, + 252, + 117, + 76, + 3, + 136, + 197, + 255, + 241, + 213, + 48, + 14, + 34, + 207, + 255, + 199, + 93, + 192, + 56, + 139, + 63, + 255, + 29, + 119, + 0, + 226, + 44, + 255, + 252, + 117, + 220, + 3, + 136, + 179, + 255, + 241, + 215, + 112, + 14, + 34, + 207, + 255, + 199, + 98, + 192, + 56, + 136, + 191, + 255, + 29, + 199, + 0, + 226, + 34, + 255, + 252, + 119, + 28, + 3, + 136, + 139, + 255, + 241, + 220, + 112, + 14, + 34, + 47, + 255, + 199, + 113, + 192, + 56, + 136, + 191, + 255, + 29, + 219, + 0, + 226, + 32, + 127, + 252, + 119, + 108, + 3, + 136, + 129, + 255, + 241, + 221, + 176, + 14, + 34, + 7, + 255, + 199, + 118, + 192, + 56, + 136, + 31, + 255, + 29, + 219, + 0, + 226, + 32, + 127, + 252, + 119, + 108, + 3, + 136, + 129, + 255, + 241, + 221, + 176, + 14, + 34, + 7, + 255, + 199, + 118, + 192, + 56, + 136, + 31, + 255, + 29, + 219, + 0, + 226, + 32, + 127, + 252, + 119, + 108, + 3, + 136, + 129, + 255, + 241, + 224, + 48, + 14, + 33, + 103, + 255, + 199, + 138, + 192, + 56, + 133, + 159, + 255, + 30, + 43, + 0, + 226, + 22, + 127, + 252, + 120, + 172, + 3, + 136, + 89, + 255, + 241, + 226, + 176, + 14, + 33, + 103, + 255, + 199, + 138, + 192, + 56, + 133, + 159, + 255, + 30, + 43, + 0, + 226, + 22, + 127, + 252, + 120, + 172, + 3, + 136, + 89, + 255, + 241, + 226, + 176, + 14, + 33, + 103, + 255, + 199, + 138, + 192, + 56, + 133, + 159, + 255, + 30, + 59, + 0, + 226, + 20, + 127, + 252, + 120, + 236, + 3, + 136, + 81, + 255, + 241, + 227, + 240, + 14, + 33, + 63, + 255, + 199, + 143, + 192, + 56, + 132, + 255, + 255, + 30, + 79, + 0, + 226, + 15, + 127, + 252, + 121, + 140, + 3, + 136, + 61, + 255, + 241, + 230, + 48, + 14, + 32, + 247, + 255, + 199, + 152, + 192, + 56, + 131, + 223, + 255, + 30, + 99, + 0, + 226, + 15, + 127, + 252, + 121, + 140, + 3, + 136, + 53, + 255, + 241, + 231, + 48, + 14, + 32, + 215, + 255, + 199, + 156, + 192, + 56, + 131, + 95, + 255, + 30, + 115, + 0, + 226, + 13, + 127, + 252, + 121, + 204, + 3, + 136, + 53, + 255, + 241, + 232, + 112, + 14, + 32, + 175, + 255, + 199, + 161, + 192, + 56, + 130, + 191, + 255, + 30, + 135, + 0, + 226, + 10, + 255, + 252, + 122, + 28, + 3, + 136, + 43, + 255, + 241, + 232, + 112, + 14, + 32, + 175, + 255, + 199, + 161, + 192, + 56, + 130, + 191, + 255, + 30, + 135, + 0, + 226, + 10, + 255, + 252, + 122, + 28, + 3, + 136, + 43, + 255, + 241, + 232, + 112, + 14, + 32, + 175, + 255, + 199, + 161, + 192, + 56, + 130, + 191, + 255, + 30, + 155, + 0, + 226, + 8, + 127, + 252, + 122, + 108, + 3, + 136, + 33, + 255, + 241, + 233, + 176, + 14, + 32, + 135, + 255, + 199, + 166, + 192, + 56, + 130, + 31, + 255, + 30, + 155, + 0, + 226, + 8, + 127, + 252, + 122, + 188, + 3, + 136, + 23, + 255, + 241, + 234, + 240, + 14, + 32, + 95, + 255, + 199, + 171, + 192, + 56, + 129, + 127, + 255, + 30, + 175, + 0, + 226, + 5, + 255, + 252, + 122, + 188, + 3, + 136, + 23, + 255, + 241, + 238, + 176, + 14, + 31, + 231, + 255, + 199, + 186, + 192, + 56, + 127, + 159, + 255, + 30, + 235, + 0, + 225, + 254, + 127, + 252, + 123, + 172, + 3, + 135, + 249, + 255, + 241, + 239, + 176, + 14, + 31, + 159, + 255, + 199, + 195, + 192, + 56, + 126, + 127, + 255, + 31, + 15, + 0, + 225, + 249, + 255, + 252, + 124, + 60, + 3, + 135, + 231, + 255, + 241, + 240, + 240, + 14, + 31, + 159, + 255, + 199, + 249, + 192, + 56, + 118, + 127, + 255, + 32, + 15, + 0, + 225, + 217, + 255, + 252, + 128, + 60, + 3, + 135, + 103, + 255, + 242, + 0, + 240, + 14, + 29, + 159, + 255, + 200, + 3, + 192, + 56, + 118, + 127, + 255, + 32, + 227, + 0, + 225, + 186, + 127, + 252, + 132, + 44, + 3, + 134, + 233, + 255, + 242, + 16, + 176, + 14, + 27, + 167, + 255, + 200, + 66, + 192, + 56, + 110, + 159, + 255, + 33, + 11, + 0, + 225, + 186, + 127, + 252, + 132, + 44, + 3, + 134, + 205, + 255, + 242, + 20, + 48, + 14, + 27, + 55, + 255, + 200, + 80, + 192, + 56, + 108, + 223, + 255, + 33, + 67, + 0, + 225, + 179, + 127, + 252, + 133, + 12, + 3, + 134, + 205, + 255, + 242, + 21, + 112, + 14, + 26, + 151, + 255, + 200, + 100, + 192, + 56, + 106, + 95, + 255, + 33, + 147, + 0, + 225, + 169, + 127, + 252, + 134, + 76, + 3, + 134, + 165, + 255, + 242, + 25, + 48, + 14, + 26, + 151, + 255, + 200, + 100, + 192, + 56, + 49, + 63, + 254, + 39, + 0, + 224, + 225, + 255, + 252, + 133, + 252, + 3, + 131, + 19, + 255, + 226, + 112, + 14, + 14, + 31, + 255, + 200, + 95, + 192, + 56, + 49, + 63, + 254, + 39, + 0, + 224, + 225, + 255, + 252, + 133, + 252, + 3, + 131, + 19, + 255, + 226, + 112, + 14, + 14, + 31, + 255, + 200, + 95, + 192, + 56, + 49, + 63, + 254, + 39, + 0, + 224, + 225, + 255, + 252, + 133, + 252, + 3, + 129, + 143, + 255, + 228, + 176, + 14, + 5, + 79, + 255, + 142, + 192, + 56, + 56, + 127, + 255, + 33, + 127, + 0, + 224, + 99, + 255, + 249, + 44, + 3, + 129, + 83, + 255, + 227, + 176, + 14, + 14, + 31, + 255, + 200, + 95, + 192, + 56, + 24, + 255, + 254, + 75, + 0, + 224, + 84, + 255, + 248, + 236, + 3, + 131, + 135, + 255, + 242, + 23, + 240, + 14, + 6, + 63, + 255, + 146, + 192, + 56, + 21, + 63, + 254, + 59, + 0, + 224, + 225, + 255, + 252, + 133, + 252, + 3, + 129, + 143, + 255, + 228, + 240, + 14, + 5, + 71, + 255, + 143, + 192, + 56, + 56, + 95, + 255, + 33, + 127, + 0, + 224, + 99, + 255, + 249, + 204, + 3, + 129, + 63, + 255, + 228, + 240, + 14, + 13, + 247, + 255, + 200, + 95, + 192, + 56, + 24, + 255, + 254, + 115, + 0, + 224, + 79, + 255, + 249, + 60, + 3, + 131, + 125, + 255, + 242, + 23, + 240, + 14, + 6, + 63, + 255, + 156, + 192, + 56, + 19, + 255, + 254, + 79, + 0, + 224, + 223, + 127, + 252, + 133, + 252, + 3, + 129, + 143, + 255, + 231, + 48, + 14, + 4, + 255, + 255, + 147, + 192, + 56, + 55, + 223, + 255, + 33, + 127, + 0, + 224, + 94, + 255, + 250, + 188, + 3, + 129, + 43, + 255, + 230, + 48, + 14, + 13, + 247, + 255, + 200, + 95, + 192, + 56, + 23, + 191, + 254, + 175, + 0, + 224, + 74, + 255, + 249, + 140, + 3, + 131, + 125, + 255, + 242, + 23, + 240, + 14, + 5, + 239, + 255, + 171, + 192, + 56, + 18, + 191, + 254, + 99, + 0, + 224, + 223, + 127, + 252, + 133, + 252, + 3, + 129, + 123, + 255, + 234, + 240, + 14, + 4, + 175, + 255, + 152, + 192, + 56, + 55, + 223, + 255, + 33, + 127, + 0, + 224, + 94, + 255, + 250, + 188, + 3, + 129, + 43, + 255, + 230, + 48, + 14, + 13, + 247, + 255, + 200, + 95, + 192, + 56, + 23, + 31, + 254, + 211, + 0, + 224, + 70, + 127, + 250, + 44, + 3, + 131, + 115, + 255, + 242, + 23, + 240, + 14, + 5, + 199, + 255, + 180, + 192, + 56, + 17, + 159, + 254, + 139, + 0, + 224, + 220, + 255, + 252, + 133, + 252, + 3, + 129, + 113, + 255, + 237, + 48, + 14, + 4, + 103, + 255, + 162, + 192, + 56, + 55, + 63, + 255, + 33, + 127, + 0, + 224, + 92, + 127, + 251, + 76, + 3, + 129, + 25, + 255, + 232, + 176, + 14, + 13, + 207, + 255, + 200, + 95, + 192, + 56, + 23, + 31, + 254, + 211, + 0, + 224, + 70, + 127, + 250, + 44, + 3, + 131, + 115, + 255, + 242, + 23, + 240, + 14, + 5, + 47, + 255, + 192, + 71, + 192, + 56, + 17, + 31, + 254, + 155, + 0, + 224, + 223, + 127, + 252, + 133, + 172, + 3, + 129, + 75, + 255, + 240, + 17, + 240, + 14, + 4, + 71, + 255, + 166, + 192, + 56, + 55, + 223, + 255, + 33, + 107, + 0, + 224, + 82, + 255, + 252, + 4, + 124, + 3, + 129, + 17, + 255, + 233, + 176, + 14, + 13, + 247, + 255, + 200, + 90, + 192, + 56, + 20, + 159, + 255, + 1, + 35, + 0, + 224, + 68, + 127, + 250, + 108, + 3, + 131, + 125, + 255, + 242, + 22, + 176, + 14, + 5, + 39, + 255, + 192, + 73, + 192, + 56, + 16, + 255, + 254, + 155, + 0, + 224, + 223, + 127, + 252, + 133, + 172, + 3, + 129, + 55, + 255, + 240, + 22, + 240, + 14, + 3, + 207, + 255, + 171, + 192, + 56, + 55, + 223, + 255, + 33, + 107, + 0, + 224, + 77, + 255, + 252, + 5, + 188, + 3, + 128, + 243, + 255, + 234, + 240, + 14, + 13, + 247, + 255, + 200, + 90, + 192, + 56, + 19, + 127, + 255, + 1, + 111, + 0, + 224, + 60, + 255, + 250, + 188, + 3, + 131, + 125, + 255, + 242, + 22, + 176, + 14, + 4, + 223, + 255, + 192, + 91, + 192, + 56, + 15, + 63, + 254, + 175, + 0, + 224, + 223, + 127, + 252, + 133, + 172, + 3, + 129, + 55, + 255, + 240, + 22, + 240, + 14, + 3, + 207, + 255, + 171, + 192, + 56, + 55, + 223, + 255, + 33, + 107, + 0, + 224, + 75, + 127, + 252, + 12, + 108, + 3, + 29, + 255, + 236, + 48, + 14, + 13, + 247, + 255, + 200, + 90, + 192, + 56, + 18, + 223, + 255, + 3, + 27, + 0, + 199, + 127, + 251, + 12, + 3, + 131, + 125, + 255, + 242, + 22, + 176, + 14, + 4, + 183, + 255, + 192, + 198, + 192, + 49, + 223, + 254, + 195, + 0, + 224, + 223, + 127, + 252, + 133, + 172, + 3, + 129, + 45, + 255, + 240, + 49, + 176, + 12, + 119, + 255, + 176, + 192, + 56, + 55, + 223, + 255, + 33, + 107, + 0, + 224, + 75, + 127, + 252, + 12, + 108, + 3, + 29, + 255, + 236, + 48, + 14, + 13, + 247, + 255, + 200, + 95, + 192, + 56, + 17, + 159, + 255, + 4, + 63, + 0, + 224, + 221, + 127, + 252, + 133, + 252, + 3, + 129, + 25, + 255, + 240, + 67, + 240, + 14, + 13, + 215, + 255, + 200, + 95, + 192, + 56, + 17, + 159, + 255, + 4, + 63, + 0, + 224, + 221, + 127, + 252, + 133, + 252, + 3, + 129, + 25, + 255, + 240, + 67, + 240, + 14, + 13, + 215, + 255, + 200, + 95, + 192, + 56, + 17, + 159, + 255, + 4, + 63, + 0, + 224, + 221, + 127, + 252, + 133, + 252, + 3, + 97, + 255, + 226, + 48, + 14, + 2, + 111, + 255, + 193, + 20, + 192, + 56, + 55, + 95, + 255, + 33, + 127, + 0, + 216, + 127, + 248, + 140, + 3, + 128, + 155, + 255, + 240, + 69, + 48, + 14, + 13, + 215, + 255, + 200, + 95, + 192, + 54, + 31, + 254, + 35, + 0, + 224, + 38, + 255, + 252, + 17, + 76, + 3, + 131, + 117, + 255, + 242, + 23, + 240, + 13, + 135, + 255, + 136, + 192, + 56, + 9, + 191, + 255, + 4, + 83, + 0, + 224, + 221, + 127, + 252, + 134, + 76, + 3, + 87, + 255, + 226, + 48, + 14, + 2, + 111, + 255, + 193, + 20, + 192, + 56, + 55, + 95, + 255, + 33, + 147, + 0, + 213, + 255, + 248, + 140, + 3, + 128, + 155, + 255, + 240, + 69, + 48, + 14, + 13, + 215, + 255, + 200, + 100, + 192, + 53, + 127, + 254, + 35, + 0, + 224, + 38, + 255, + 252, + 17, + 76, + 3, + 131, + 117, + 255, + 242, + 25, + 48, + 13, + 95, + 255, + 136, + 192, + 56, + 9, + 191, + 255, + 4, + 83, + 0, + 224, + 221, + 127, + 252, + 134, + 76, + 3, + 87, + 255, + 226, + 48, + 14, + 2, + 111, + 255, + 193, + 20, + 192, + 56, + 55, + 95, + 255, + 34, + 123, + 0, + 224, + 33, + 255, + 252, + 17, + 156, + 3, + 131, + 107, + 255, + 242, + 40, + 240, + 14, + 2, + 31, + 255, + 193, + 25, + 192, + 56, + 54, + 191, + 255, + 34, + 143, + 0, + 224, + 33, + 255, + 252, + 17, + 156, + 3, + 131, + 107, + 255, + 242, + 40, + 240, + 14, + 2, + 31, + 255, + 193, + 25, + 192, + 56, + 54, + 191, + 255, + 34, + 143, + 0, + 224, + 33, + 255, + 252, + 17, + 156, + 3, + 131, + 107, + 255, + 242, + 42, + 48, + 13, + 207, + 255, + 193, + 30, + 192, + 56, + 54, + 191, + 255, + 34, + 163, + 0, + 220, + 255, + 252, + 17, + 236, + 3, + 131, + 107, + 255, + 242, + 42, + 48, + 13, + 207, + 255, + 193, + 30, + 192, + 56, + 54, + 191, + 255, + 34, + 163, + 0, + 220, + 255, + 252, + 17, + 236, + 3, + 131, + 107, + 255, + 242, + 42, + 48, + 13, + 207, + 255, + 193, + 30, + 192, + 56, + 54, + 191, + 255, + 34, + 163, + 0, + 220, + 255, + 252, + 17, + 236, + 3, + 129, + 211, + 255, + 227, + 112, + 14, + 6, + 95, + 255, + 200, + 154, + 192, + 55, + 63, + 255, + 4, + 123, + 0, + 224, + 116, + 255, + 248, + 220, + 3, + 129, + 153, + 255, + 242, + 38, + 112, + 13, + 207, + 255, + 193, + 30, + 192, + 56, + 29, + 63, + 254, + 55, + 0, + 224, + 102, + 127, + 252, + 137, + 156, + 3, + 115, + 255, + 240, + 71, + 176, + 14, + 7, + 79, + 255, + 141, + 192, + 56, + 25, + 159, + 255, + 34, + 103, + 0, + 220, + 255, + 252, + 17, + 236, + 3, + 129, + 211, + 255, + 227, + 112, + 14, + 6, + 103, + 255, + 200, + 173, + 192, + 52, + 191, + 255, + 4, + 123, + 0, + 224, + 116, + 255, + 249, + 124, + 3, + 129, + 151, + 255, + 242, + 41, + 48, + 13, + 47, + 255, + 193, + 30, + 192, + 56, + 29, + 63, + 254, + 95, + 0, + 224, + 101, + 255, + 252, + 138, + 76, + 3, + 75, + 255, + 240, + 71, + 176, + 14, + 7, + 79, + 255, + 151, + 192, + 56, + 25, + 127, + 255, + 34, + 147, + 0, + 210, + 255, + 252, + 17, + 236, + 3, + 129, + 211, + 255, + 229, + 240, + 14, + 6, + 95, + 255, + 200, + 164, + 192, + 52, + 191, + 255, + 4, + 123, + 0, + 224, + 116, + 255, + 249, + 124, + 3, + 129, + 151, + 255, + 242, + 45, + 240, + 12, + 119, + 255, + 193, + 34, + 192, + 56, + 29, + 63, + 254, + 115, + 0, + 224, + 101, + 255, + 252, + 139, + 44, + 3, + 29, + 255, + 240, + 72, + 176, + 14, + 7, + 79, + 255, + 156, + 192, + 56, + 25, + 127, + 255, + 34, + 203, + 0, + 199, + 127, + 252, + 18, + 44, + 3, + 129, + 211, + 255, + 231, + 48, + 14, + 6, + 95, + 255, + 200, + 178, + 192, + 49, + 223, + 255, + 4, + 139, + 0, + 224, + 116, + 255, + 249, + 204, + 3, + 129, + 151, + 255, + 242, + 44, + 176, + 12, + 111, + 255, + 193, + 35, + 192, + 56, + 29, + 31, + 254, + 119, + 0, + 224, + 101, + 255, + 252, + 158, + 76, + 3, + 129, + 201, + 255, + 233, + 176, + 14, + 6, + 95, + 255, + 201, + 223, + 192, + 56, + 28, + 159, + 254, + 155, + 0, + 224, + 101, + 255, + 252, + 157, + 252, + 3, + 129, + 201, + 255, + 233, + 176, + 14, + 6, + 95, + 255, + 201, + 223, + 192, + 56, + 28, + 159, + 254, + 155, + 0, + 224, + 101, + 255, + 252, + 158, + 76, + 3, + 129, + 191, + 255, + 234, + 240, + 14, + 6, + 55, + 255, + 201, + 228, + 192, + 56, + 27, + 255, + 254, + 175, + 0, + 224, + 99, + 127, + 252, + 158, + 76, + 3, + 129, + 191, + 255, + 234, + 240, + 14, + 6, + 55, + 255, + 201, + 228, + 192, + 56, + 27, + 255, + 254, + 175, + 0, + 224, + 99, + 127, + 252, + 158, + 76, + 3, + 129, + 191, + 255, + 234, + 240, + 14, + 6, + 55, + 255, + 201, + 228, + 192, + 56, + 27, + 255, + 254, + 211, + 0, + 224, + 94, + 255, + 252, + 158, + 76, + 3, + 129, + 191, + 255, + 237, + 48, + 14, + 5, + 239, + 255, + 201, + 228, + 192, + 56, + 27, + 255, + 254, + 211, + 0, + 224, + 94, + 255, + 252, + 158, + 76, + 3, + 129, + 191, + 255, + 237, + 48, + 14, + 5, + 239, + 255, + 201, + 228, + 192, + 55, + 223, + 252, + 96, + 28, + 9, + 255, + 255, + 105, + 128, + 112, + 47, + 127, + 254, + 79, + 38, + 1, + 166, + 255, + 243, + 152, + 7, + 2, + 111, + 255, + 220, + 224, + 28, + 11, + 143, + 255, + 147, + 201, + 128, + 105, + 191, + 252, + 230, + 1, + 192, + 155, + 255, + 247, + 56, + 7, + 2, + 227, + 255, + 228, + 242, + 96, + 26, + 111, + 255, + 57, + 128, + 112, + 38, + 255, + 253, + 206, + 1, + 192, + 184, + 255, + 249, + 60, + 152, + 6, + 155, + 255, + 206, + 96, + 28, + 9, + 191, + 255, + 115, + 128, + 112, + 46, + 63, + 254, + 79, + 38, + 1, + 166, + 255, + 243, + 152, + 7, + 2, + 111, + 255, + 220, + 224, + 28, + 11, + 143, + 255, + 147, + 201, + 128, + 104, + 127, + 253, + 14, + 1, + 192, + 155, + 255, + 247, + 56, + 7, + 2, + 227, + 255, + 228, + 242, + 96, + 26, + 31, + 255, + 67, + 128, + 112, + 38, + 255, + 253, + 206, + 1, + 192, + 184, + 255, + 249, + 60, + 152, + 6, + 135, + 255, + 208, + 224, + 28, + 9, + 191, + 255, + 115, + 128, + 112, + 46, + 63, + 254, + 79, + 38, + 1, + 161, + 255, + 244, + 56, + 7, + 2, + 111, + 255, + 220, + 224, + 28, + 11, + 143, + 255, + 147, + 201, + 128, + 104, + 127, + 253, + 14, + 1, + 192, + 155, + 255, + 247, + 56, + 7, + 2, + 227, + 255, + 228, + 242, + 96, + 26, + 31, + 255, + 67, + 128, + 112, + 38, + 255, + 253, + 94, + 1, + 192, + 198, + 255, + 249, + 60, + 152, + 6, + 135, + 255, + 208, + 224, + 28, + 9, + 191, + 255, + 87, + 128, + 112, + 49, + 191, + 254, + 79, + 38, + 1, + 161, + 255, + 244, + 56, + 7, + 2, + 111, + 255, + 213, + 224, + 28, + 12, + 111, + 255, + 147, + 201, + 128, + 104, + 127, + 253, + 14, + 1, + 192, + 155, + 255, + 245, + 120, + 7, + 3, + 27, + 255, + 228, + 242, + 96, + 26, + 31, + 255, + 67, + 128, + 112, + 38, + 255, + 253, + 94, + 1, + 192, + 198, + 255, + 249, + 60, + 152, + 6, + 135, + 255, + 208, + 224, + 28, + 6, + 255, + 255, + 128, + 175, + 128, + 112, + 49, + 191, + 254, + 79, + 38, + 1, + 161, + 255, + 244, + 56, + 7, + 1, + 191, + 255, + 224, + 43, + 224, + 28, + 12, + 111, + 255, + 147, + 201, + 128, + 104, + 127, + 253, + 14, + 1, + 192, + 111, + 255, + 248, + 10, + 248, + 7, + 3, + 27, + 255, + 228, + 242, + 96, + 26, + 31, + 255, + 67, + 128, + 112, + 27, + 255, + 254, + 2, + 190, + 1, + 192, + 198, + 255, + 249, + 60, + 152, + 6, + 135, + 255, + 208, + 224, + 28, + 6, + 255, + 255, + 128, + 175, + 128, + 112, + 49, + 191, + 254, + 79, + 78, + 1, + 151, + 255, + 244, + 216, + 7, + 1, + 135, + 255, + 224, + 43, + 96, + 28, + 13, + 95, + 255, + 147, + 211, + 128, + 101, + 255, + 253, + 54, + 1, + 192, + 97, + 255, + 248, + 10, + 216, + 7, + 3, + 87, + 255, + 228, + 244, + 224, + 25, + 127, + 255, + 77, + 128, + 112, + 24, + 127, + 254, + 2, + 182, + 1, + 192, + 213, + 255, + 249, + 61, + 56, + 6, + 95, + 255, + 211, + 96, + 28, + 6, + 15, + 255, + 128, + 175, + 128, + 112, + 53, + 127, + 254, + 79, + 86, + 1, + 150, + 255, + 244, + 248, + 7, + 1, + 127, + 255, + 224, + 43, + 224, + 28, + 13, + 95, + 255, + 148, + 111, + 128, + 112, + 16, + 255, + 254, + 3, + 46, + 1, + 192, + 213, + 255, + 249, + 70, + 248, + 7, + 1, + 15, + 255, + 224, + 50, + 224, + 28, + 13, + 95, + 255, + 148, + 111, + 128, + 112, + 16, + 255, + 254, + 3, + 46, + 1, + 192, + 213, + 255, + 249, + 70, + 248, + 7, + 1, + 15, + 255, + 224, + 50, + 224, + 28, + 13, + 95, + 255, + 149, + 187, + 128, + 112, + 56, + 191, + 254, + 86, + 158, + 1, + 192, + 228, + 255, + 249, + 90, + 88, + 7, + 3, + 147, + 255, + 229, + 105, + 96, + 28, + 14, + 79, + 255, + 149, + 165, + 128, + 112, + 57, + 63, + 254, + 86, + 150, + 1, + 192, + 232, + 255, + 249, + 89, + 216, + 7, + 3, + 167, + 255, + 229, + 102, + 224, + 28, + 14, + 159, + 255, + 149, + 155, + 128, + 112, + 58, + 127, + 254, + 86, + 110, + 1, + 192, + 233, + 255, + 249, + 89, + 184, + 7, + 3, + 167, + 255, + 229, + 102, + 224, + 28, + 14, + 159, + 255, + 149, + 155, + 128, + 112, + 58, + 127, + 254, + 86, + 110, + 1, + 192, + 233, + 255, + 249, + 89, + 184, + 7, + 3, + 167, + 255, + 229, + 102, + 224, + 28, + 15, + 127, + 255, + 39, + 128, + 106, + 191, + 254, + 84, + 6, + 1, + 192, + 247, + 255, + 242, + 120, + 6, + 171, + 255, + 229, + 64, + 96, + 28, + 15, + 127, + 255, + 39, + 128, + 106, + 191, + 254, + 84, + 6, + 1, + 192, + 247, + 255, + 242, + 120, + 6, + 171, + 255, + 229, + 64, + 96, + 28, + 15, + 127, + 255, + 39, + 128, + 106, + 191, + 254, + 84, + 6, + 1, + 192, + 252, + 255, + 240, + 152, + 6, + 231, + 255, + 229, + 61, + 224, + 28, + 15, + 207, + 255, + 9, + 128, + 110, + 127, + 254, + 83, + 222, + 1, + 192, + 252, + 255, + 240, + 152, + 6, + 231, + 255, + 229, + 61, + 224, + 28, + 15, + 207, + 255, + 9, + 128, + 110, + 127, + 254, + 83, + 222, + 1, + 192, + 252, + 255, + 240, + 152, + 6, + 231, + 255, + 229, + 61, + 224, + 28, + 20, + 15, + 255, + 148, + 237, + 128, + 112, + 80, + 63, + 254, + 83, + 182, + 1, + 193, + 64, + 255, + 249, + 78, + 216, + 7, + 5, + 3, + 255, + 229, + 59, + 96, + 28, + 20, + 15, + 255, + 148, + 237, + 128, + 112, + 80, + 63, + 254, + 83, + 182, + 1, + 193, + 64, + 255, + 249, + 78, + 216, + 7, + 5, + 3, + 255, + 229, + 59, + 96, + 28, + 20, + 15, + 255, + 148, + 237, + 128, + 112, + 80, + 63, + 254, + 83, + 182, + 1, + 193, + 64, + 255, + 249, + 78, + 216, + 7, + 5, + 3, + 255, + 229, + 59, + 96, + 28, + 20, + 15, + 255, + 148, + 237, + 128, + 112, + 80, + 63, + 254, + 83, + 182, + 1, + 192, + 184, + 255, + 244, + 56, + 7, + 1, + 151, + 255, + 229, + 59, + 96, + 28, + 11, + 143, + 255, + 67, + 128, + 112, + 25, + 127, + 254, + 83, + 182, + 1, + 192, + 184, + 255, + 244, + 56, + 7, + 1, + 151, + 255, + 229, + 59, + 96, + 28, + 11, + 143, + 255, + 67, + 128, + 112, + 25, + 127, + 254, + 83, + 182, + 1, + 192, + 184, + 255, + 244, + 56, + 7, + 1, + 151, + 255, + 229, + 59, + 96, + 28, + 9, + 191, + 255, + 128, + 135, + 128, + 112, + 24, + 63, + 254, + 83, + 182, + 1, + 192, + 155, + 255, + 248, + 8, + 120, + 7, + 1, + 131, + 255, + 229, + 59, + 96, + 28, + 9, + 191, + 255, + 128, + 135, + 128, + 112, + 24, + 63, + 254, + 83, + 182, + 1, + 192, + 155, + 255, + 248, + 8, + 120, + 7, + 1, + 131, + 255, + 229, + 59, + 96, + 28, + 9, + 191, + 255, + 128, + 135, + 128, + 112, + 24, + 63, + 254, + 83, + 182, + 1, + 192, + 145, + 255, + 248, + 10, + 88, + 7, + 1, + 111, + 255, + 229, + 59, + 96, + 28, + 9, + 31, + 255, + 128, + 165, + 128, + 112, + 22, + 255, + 254, + 83, + 182, + 1, + 192, + 145, + 255, + 248, + 10, + 88, + 7, + 1, + 111, + 255, + 229, + 59, + 96, + 28, + 9, + 31, + 255, + 128, + 165, + 128, + 112, + 22, + 255, + 254, + 83, + 182, + 1, + 192, + 145, + 255, + 248, + 10, + 88, + 7, + 1, + 111, + 255, + 229, + 59, + 96, + 28, + 8, + 207, + 255, + 128, + 185, + 128, + 112, + 21, + 191, + 254, + 83, + 182, + 1, + 192, + 140, + 255, + 248, + 11, + 152, + 7, + 1, + 91, + 255, + 229, + 59, + 96, + 28, + 8, + 207, + 255, + 128, + 185, + 128, + 112, + 21, + 191, + 254, + 83, + 182, + 1, + 192, + 140, + 255, + 248, + 11, + 152, + 7, + 1, + 91, + 255, + 229, + 59, + 96, + 28, + 8, + 207, + 255, + 128, + 185, + 128, + 112, + 21, + 191, + 254, + 83, + 182, + 1, + 192, + 140, + 255, + 248, + 12, + 24, + 7, + 1, + 75, + 255, + 229, + 59, + 96, + 28, + 8, + 207, + 255, + 128, + 193, + 128, + 112, + 20, + 191, + 254, + 83, + 182, + 1, + 192, + 140, + 255, + 248, + 12, + 24, + 7, + 1, + 75, + 255, + 229, + 59, + 96, + 28, + 8, + 207, + 255, + 128, + 193, + 128, + 112, + 20, + 191, + 254, + 83, + 182, + 1, + 192, + 140, + 255, + 248, + 12, + 24, + 7, + 1, + 75, + 255, + 229, + 59, + 96, + 28, + 8, + 127, + 255, + 128, + 203, + 128, + 112, + 20, + 191, + 254, + 83, + 182, + 1, + 192, + 135, + 255, + 248, + 12, + 184, + 7, + 1, + 75, + 255, + 229, + 59, + 96, + 28, + 8, + 127, + 255, + 128, + 203, + 128, + 112, + 20, + 191, + 254, + 83, + 182, + 1, + 192, + 135, + 255, + 248, + 12, + 184, + 7, + 1, + 75, + 255, + 229, + 59, + 96, + 28, + 8, + 47, + 255, + 128, + 213, + 128, + 112, + 20, + 191, + 254, + 83, + 182, + 1, + 192, + 130, + 255, + 248, + 13, + 88, + 7, + 1, + 75, + 255, + 229, + 59, + 96, + 28, + 8, + 47, + 255, + 128, + 213, + 128, + 112, + 20, + 191, + 254, + 83, + 182, + 1, + 192, + 130, + 255, + 248, + 13, + 88, + 7, + 1, + 75, + 255, + 229, + 59, + 96, + 28, + 8, + 47, + 255, + 128, + 213, + 128, + 112, + 20, + 191, + 254, + 83, + 182, + 1, + 192, + 130, + 255, + 248, + 13, + 248, + 7, + 1, + 55, + 255, + 229, + 59, + 96, + 28, + 8, + 47, + 255, + 128, + 223, + 128, + 112, + 19, + 127, + 254, + 83, + 182, + 1, + 192, + 130, + 255, + 248, + 13, + 248, + 7, + 1, + 55, + 255, + 229, + 59, + 96, + 28, + 8, + 47, + 255, + 128, + 223, + 128, + 112, + 19, + 127, + 254, + 83, + 182, + 1, + 192, + 130, + 255, + 248, + 13, + 248, + 7, + 1, + 55, + 255, + 229, + 61, + 224, + 28, + 7, + 223, + 255, + 128, + 233, + 128, + 112, + 18, + 63, + 254, + 83, + 222, + 1, + 192, + 125, + 255, + 248, + 14, + 152, + 7, + 1, + 35, + 255, + 229, + 61, + 224, + 28, + 7, + 223, + 255, + 128, + 233, + 128, + 112, + 18, + 63, + 254, + 83, + 222, + 1, + 192, + 125, + 255, + 248, + 14, + 152, + 7, + 1, + 35, + 255, + 229, + 61, + 224, + 28, + 7, + 223, + 255, + 128, + 233, + 128, + 112, + 18, + 63, + 254, + 84, + 6, + 1, + 192, + 116, + 255, + 248, + 15, + 24, + 6, + 235, + 255, + 229, + 71, + 96, + 28, + 7, + 79, + 255, + 128, + 241, + 128, + 110, + 191, + 254, + 84, + 118, + 1, + 192, + 116, + 255, + 248, + 15, + 24, + 6, + 235, + 255, + 229, + 71, + 96, + 28, + 7, + 79, + 255, + 128, + 241, + 128, + 110, + 127, + 254, + 84, + 126, + 1, + 192, + 116, + 255, + 248, + 15, + 24, + 6, + 231, + 255, + 229, + 71, + 224, + 27, + 15, + 255, + 129, + 121, + 128, + 106, + 255, + 254, + 84, + 238, + 1, + 176, + 255, + 248, + 23, + 152, + 6, + 175, + 255, + 229, + 78, + 224, + 27, + 15, + 255, + 129, + 121, + 128, + 106, + 255, + 254, + 84, + 238, + 1, + 176, + 255, + 248, + 23, + 152, + 6, + 175, + 255, + 229, + 78, + 224, + 26, + 255, + 255, + 129, + 123, + 128, + 106, + 255, + 254, + 92, + 134, + 1, + 161, + 255, + 249, + 114, + 184, + 6, + 135, + 255, + 229, + 202, + 224, + 26, + 31, + 255, + 151, + 43, + 128, + 104, + 127, + 254, + 92, + 174, + 1, + 151, + 255, + 227, + 0, + 196, + 127, + 255, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 168, + 79, + 128, + 0 + ] + }, + "id": "PNCeI7jyxe", + "from_name": "magicwand_tool_1", + "to_name": "image_1", + "type": "magicwand", + "origin": "manual" + }, + { + "original_width": 3000, + "original_height": 2860, + "image_rotation": 0, + "value": { + "format": "rle", + "rle": [ + 2, + 11, + 174, + 128, + 57, + 27, + 255, + 6, + 107, + 0, + 224, + 79, + 255, + 251, + 12, + 3, + 129, + 113, + 255, + 237, + 48, + 14, + 6, + 95, + 255, + 192, + 204, + 192, + 56, + 24, + 63, + 255, + 30, + 119, + 0, + 224, + 79, + 255, + 251, + 12, + 3, + 129, + 113, + 255, + 237, + 48, + 14, + 6, + 95, + 255, + 192, + 204, + 192, + 56, + 24, + 63, + 255, + 30, + 119, + 0, + 224, + 79, + 255, + 250, + 204, + 3, + 129, + 121, + 255, + 237, + 48, + 14, + 6, + 207, + 255, + 192, + 190, + 192, + 56, + 24, + 63, + 255, + 30, + 119, + 0, + 224, + 79, + 255, + 250, + 188, + 3, + 129, + 123, + 255, + 237, + 48, + 14, + 6, + 215, + 255, + 192, + 189, + 192, + 56, + 24, + 63, + 255, + 30, + 119, + 0, + 224, + 79, + 255, + 250, + 188, + 3, + 129, + 123, + 255, + 237, + 48, + 14, + 6, + 215, + 255, + 192, + 189, + 192, + 56, + 24, + 63, + 255, + 30, + 119, + 0, + 224, + 79, + 255, + 250, + 188, + 3, + 129, + 123, + 255, + 237, + 48, + 14, + 6, + 215, + 255, + 192, + 189, + 192, + 56, + 24, + 63, + 255, + 30, + 119, + 0, + 224, + 79, + 255, + 250, + 188, + 3, + 129, + 123, + 255, + 237, + 48, + 14, + 6, + 215, + 255, + 192, + 189, + 192, + 56, + 24, + 63, + 255, + 30, + 119, + 0, + 224, + 79, + 255, + 250, + 44, + 3, + 129, + 149, + 255, + 235, + 48, + 14, + 7, + 31, + 255, + 192, + 184, + 192, + 56, + 24, + 223, + 255, + 30, + 99, + 0, + 224, + 79, + 255, + 250, + 28, + 3, + 129, + 153, + 255, + 234, + 176, + 14, + 7, + 39, + 255, + 192, + 184, + 192, + 56, + 24, + 223, + 255, + 30, + 99, + 0, + 224, + 79, + 255, + 250, + 28, + 3, + 129, + 153, + 255, + 234, + 176, + 14, + 7, + 39, + 255, + 192, + 184, + 192, + 56, + 24, + 223, + 255, + 30, + 99, + 0, + 224, + 79, + 255, + 250, + 28, + 3, + 129, + 153, + 255, + 234, + 176, + 14, + 7, + 39, + 255, + 192, + 184, + 192, + 56, + 24, + 223, + 255, + 30, + 99, + 0, + 224, + 79, + 255, + 250, + 28, + 3, + 129, + 153, + 255, + 234, + 176, + 14, + 7, + 39, + 255, + 192, + 184, + 192, + 56, + 24, + 223, + 255, + 30, + 99, + 0, + 224, + 79, + 255, + 249, + 220, + 3, + 129, + 179, + 255, + 228, + 240, + 14, + 8, + 7, + 255, + 192, + 170, + 192, + 56, + 26, + 159, + 255, + 30, + 43, + 0, + 224, + 79, + 255, + 249, + 220, + 3, + 129, + 179, + 255, + 228, + 240, + 14, + 8, + 7, + 255, + 192, + 170, + 192, + 56, + 26, + 191, + 255, + 30, + 39, + 0, + 224, + 79, + 255, + 249, + 220, + 3, + 129, + 179, + 255, + 228, + 240, + 14, + 8, + 7, + 255, + 192, + 170, + 192, + 56, + 26, + 191, + 255, + 30, + 39, + 0, + 224, + 79, + 255, + 249, + 204, + 3, + 129, + 181, + 255, + 228, + 240, + 14, + 8, + 7, + 255, + 192, + 170, + 192, + 56, + 26, + 191, + 255, + 30, + 39, + 0, + 224, + 79, + 255, + 249, + 204, + 3, + 129, + 181, + 255, + 228, + 240, + 14, + 8, + 7, + 255, + 192, + 170, + 192, + 56, + 26, + 191, + 255, + 30, + 39, + 0, + 224, + 79, + 255, + 249, + 204, + 3, + 131, + 233, + 255, + 240, + 41, + 112, + 14, + 7, + 223, + 255, + 199, + 99, + 192, + 56, + 19, + 255, + 254, + 115, + 0, + 224, + 250, + 127, + 252, + 10, + 92, + 3, + 129, + 247, + 255, + 241, + 216, + 240, + 14, + 4, + 255, + 255, + 156, + 192, + 56, + 62, + 159, + 255, + 2, + 151, + 0, + 224, + 125, + 255, + 252, + 118, + 60, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 167, + 255, + 192, + 165, + 192, + 56, + 31, + 127, + 255, + 29, + 143, + 0, + 224, + 79, + 255, + 249, + 204, + 3, + 131, + 233, + 255, + 240, + 41, + 112, + 14, + 7, + 223, + 255, + 199, + 99, + 192, + 56, + 19, + 255, + 254, + 115, + 0, + 224, + 252, + 255, + 252, + 10, + 12, + 3, + 130, + 1, + 255, + 241, + 215, + 176, + 14, + 4, + 255, + 255, + 156, + 192, + 56, + 63, + 63, + 255, + 2, + 131, + 0, + 224, + 128, + 127, + 252, + 117, + 236, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 207, + 255, + 192, + 160, + 192, + 56, + 32, + 31, + 255, + 29, + 123, + 0, + 224, + 79, + 255, + 249, + 204, + 3, + 131, + 243, + 255, + 240, + 40, + 48, + 14, + 8, + 7, + 255, + 199, + 94, + 192, + 56, + 19, + 255, + 254, + 115, + 0, + 224, + 252, + 255, + 252, + 10, + 12, + 3, + 130, + 1, + 255, + 241, + 215, + 176, + 14, + 4, + 255, + 255, + 156, + 192, + 56, + 63, + 223, + 255, + 2, + 127, + 0, + 224, + 131, + 127, + 252, + 117, + 76, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 159, + 192, + 56, + 32, + 223, + 255, + 29, + 83, + 0, + 224, + 79, + 255, + 249, + 204, + 3, + 131, + 253, + 255, + 240, + 40, + 48, + 14, + 8, + 47, + 255, + 199, + 84, + 192, + 56, + 19, + 255, + 254, + 115, + 0, + 224, + 255, + 127, + 252, + 10, + 12, + 3, + 130, + 11, + 255, + 241, + 213, + 48, + 14, + 4, + 255, + 255, + 156, + 192, + 56, + 63, + 223, + 255, + 2, + 131, + 0, + 224, + 130, + 255, + 252, + 117, + 76, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 53, + 127, + 254, + 231, + 0, + 224, + 131, + 127, + 252, + 116, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 53, + 127, + 254, + 231, + 0, + 224, + 131, + 127, + 252, + 116, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 53, + 127, + 254, + 231, + 0, + 224, + 131, + 127, + 252, + 116, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 53, + 127, + 254, + 231, + 0, + 224, + 131, + 127, + 252, + 116, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 54, + 95, + 255, + 1, + 47, + 0, + 224, + 124, + 255, + 252, + 115, + 236, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 54, + 191, + 255, + 1, + 35, + 0, + 224, + 125, + 255, + 252, + 115, + 204, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 54, + 191, + 255, + 1, + 35, + 0, + 224, + 125, + 255, + 252, + 115, + 204, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 54, + 191, + 255, + 1, + 35, + 0, + 224, + 125, + 255, + 252, + 115, + 204, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 15, + 247, + 255, + 192, + 67, + 192, + 54, + 191, + 255, + 1, + 35, + 0, + 224, + 125, + 255, + 252, + 115, + 204, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 31, + 255, + 186, + 192, + 55, + 191, + 255, + 1, + 35, + 0, + 224, + 138, + 127, + 252, + 113, + 252, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 31, + 255, + 185, + 192, + 55, + 223, + 255, + 1, + 35, + 0, + 224, + 138, + 127, + 252, + 113, + 252, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 31, + 255, + 185, + 192, + 55, + 223, + 255, + 1, + 35, + 0, + 224, + 138, + 127, + 252, + 113, + 252, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 31, + 255, + 185, + 192, + 55, + 223, + 255, + 1, + 35, + 0, + 224, + 138, + 255, + 252, + 113, + 236, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 31, + 255, + 185, + 192, + 55, + 223, + 255, + 1, + 35, + 0, + 224, + 138, + 255, + 252, + 113, + 236, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 138, + 127, + 252, + 113, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 138, + 127, + 252, + 113, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 138, + 127, + 252, + 113, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 138, + 127, + 252, + 113, + 172, + 3, + 129, + 63, + 255, + 231, + 48, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 138, + 127, + 252, + 113, + 252, + 3, + 129, + 43, + 255, + 232, + 112, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 140, + 255, + 252, + 113, + 172, + 3, + 129, + 43, + 255, + 232, + 112, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 140, + 255, + 252, + 113, + 172, + 3, + 129, + 43, + 255, + 232, + 112, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 140, + 255, + 252, + 113, + 172, + 3, + 129, + 43, + 255, + 232, + 112, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 140, + 255, + 252, + 113, + 172, + 3, + 129, + 43, + 255, + 232, + 112, + 14, + 16, + 71, + 255, + 180, + 192, + 55, + 223, + 255, + 1, + 55, + 0, + 224, + 140, + 255, + 252, + 111, + 220, + 3, + 129, + 101, + 255, + 232, + 112, + 14, + 16, + 111, + 255, + 175, + 192, + 55, + 223, + 255, + 1, + 75, + 0, + 224, + 138, + 127, + 252, + 111, + 220, + 3, + 129, + 101, + 255, + 232, + 112, + 14, + 16, + 111, + 255, + 175, + 192, + 55, + 223, + 255, + 1, + 75, + 0, + 224, + 138, + 127, + 252, + 111, + 220, + 3, + 129, + 101, + 255, + 232, + 176, + 14, + 16, + 103, + 255, + 175, + 192, + 55, + 223, + 255, + 1, + 75, + 0, + 224, + 138, + 127, + 252, + 111, + 220, + 3, + 129, + 101, + 255, + 232, + 176, + 14, + 16, + 103, + 255, + 175, + 192, + 55, + 223, + 255, + 1, + 75, + 0, + 224, + 138, + 127, + 252, + 111, + 220, + 3, + 129, + 101, + 255, + 232, + 176, + 14, + 16, + 103, + 255, + 175, + 192, + 55, + 223, + 255, + 1, + 75, + 0, + 224, + 138, + 127, + 252, + 111, + 220, + 3, + 129, + 101, + 255, + 233, + 176, + 14, + 16, + 103, + 255, + 166, + 192, + 56, + 8, + 127, + 255, + 1, + 75, + 0, + 224, + 140, + 255, + 252, + 111, + 140, + 3, + 129, + 101, + 255, + 233, + 176, + 14, + 16, + 103, + 255, + 166, + 192, + 56, + 8, + 127, + 255, + 1, + 75, + 0, + 224, + 140, + 255, + 252, + 111, + 140, + 3, + 129, + 101, + 255, + 233, + 176, + 14, + 16, + 103, + 255, + 166, + 192, + 56, + 8, + 127, + 255, + 1, + 75, + 0, + 224, + 140, + 255, + 252, + 111, + 140, + 3, + 129, + 101, + 255, + 233, + 176, + 14, + 16, + 103, + 255, + 166, + 192, + 56, + 8, + 127, + 255, + 1, + 75, + 0, + 224, + 140, + 255, + 252, + 111, + 140, + 3, + 129, + 101, + 255, + 233, + 176, + 14, + 16, + 103, + 255, + 166, + 192, + 56, + 8, + 127, + 255, + 1, + 75, + 0, + 224, + 140, + 255, + 252, + 111, + 140, + 3, + 133, + 205, + 255, + 232, + 176, + 14, + 2, + 63, + 255, + 152, + 192, + 52, + 63, + 254, + 95, + 0, + 224, + 143, + 127, + 252, + 111, + 60, + 3, + 133, + 205, + 255, + 232, + 176, + 14, + 2, + 63, + 255, + 152, + 192, + 52, + 63, + 254, + 95, + 0, + 224, + 143, + 127, + 252, + 111, + 60, + 3, + 133, + 205, + 255, + 232, + 176, + 14, + 2, + 63, + 255, + 152, + 192, + 52, + 63, + 254, + 95, + 0, + 224, + 143, + 127, + 252, + 111, + 60, + 3, + 133, + 205, + 255, + 232, + 176, + 14, + 2, + 63, + 255, + 152, + 192, + 52, + 63, + 254, + 95, + 0, + 224, + 143, + 127, + 252, + 111, + 60, + 3, + 133, + 205, + 255, + 232, + 176, + 14, + 2, + 63, + 255, + 152, + 192, + 52, + 63, + 254, + 107, + 0, + 224, + 141, + 255, + 252, + 111, + 60, + 3, + 133, + 215, + 255, + 230, + 48, + 14, + 2, + 103, + 255, + 152, + 192, + 52, + 63, + 254, + 135, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 215, + 255, + 230, + 48, + 14, + 2, + 103, + 255, + 152, + 192, + 52, + 63, + 254, + 135, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 215, + 255, + 230, + 48, + 14, + 2, + 103, + 255, + 152, + 192, + 52, + 63, + 254, + 135, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 215, + 255, + 230, + 48, + 14, + 2, + 103, + 255, + 152, + 192, + 52, + 63, + 254, + 135, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 225, + 255, + 227, + 176, + 14, + 2, + 143, + 255, + 147, + 192, + 53, + 95, + 254, + 119, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 225, + 255, + 227, + 176, + 14, + 2, + 143, + 255, + 147, + 192, + 53, + 127, + 254, + 115, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 225, + 255, + 227, + 176, + 14, + 2, + 143, + 255, + 147, + 192, + 53, + 127, + 254, + 115, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 225, + 255, + 227, + 176, + 14, + 2, + 143, + 255, + 147, + 192, + 53, + 127, + 254, + 115, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 133, + 225, + 255, + 227, + 176, + 14, + 2, + 143, + 255, + 147, + 192, + 53, + 127, + 254, + 115, + 0, + 224, + 138, + 127, + 252, + 111, + 60, + 3, + 134, + 163, + 255, + 228, + 240, + 13, + 95, + 255, + 161, + 192, + 56, + 33, + 255, + 255, + 27, + 207, + 0, + 225, + 168, + 255, + 249, + 60, + 3, + 87, + 255, + 232, + 112, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 106, + 63, + 254, + 79, + 0, + 213, + 255, + 250, + 28, + 3, + 130, + 31, + 255, + 241, + 188, + 240, + 14, + 26, + 143, + 255, + 147, + 192, + 53, + 127, + 254, + 135, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 134, + 163, + 255, + 228, + 240, + 13, + 95, + 255, + 161, + 192, + 56, + 33, + 255, + 255, + 27, + 207, + 0, + 225, + 173, + 255, + 248, + 76, + 3, + 105, + 255, + 231, + 112, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 107, + 127, + 254, + 19, + 0, + 218, + 127, + 249, + 220, + 3, + 130, + 31, + 255, + 241, + 188, + 240, + 14, + 26, + 223, + 255, + 132, + 192, + 54, + 159, + 254, + 119, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 134, + 183, + 255, + 225, + 48, + 13, + 175, + 255, + 156, + 192, + 56, + 33, + 255, + 255, + 27, + 207, + 0, + 225, + 173, + 255, + 248, + 76, + 3, + 107, + 255, + 231, + 48, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 115, + 255, + 254, + 79, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 135, + 63, + 255, + 228, + 240, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 115, + 255, + 254, + 79, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 135, + 63, + 255, + 228, + 240, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 115, + 255, + 254, + 79, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 135, + 63, + 255, + 228, + 240, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 115, + 255, + 254, + 79, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 135, + 63, + 255, + 228, + 240, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 115, + 255, + 254, + 79, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 135, + 63, + 255, + 228, + 240, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 117, + 223, + 254, + 19, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 135, + 93, + 255, + 225, + 48, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 117, + 223, + 254, + 19, + 0, + 224, + 135, + 255, + 252, + 111, + 60, + 3, + 135, + 93, + 255, + 225, + 48, + 14, + 8, + 127, + 255, + 198, + 243, + 192, + 56, + 117, + 223, + 254, + 19, + 0, + 224, + 135, + 255, + 252, + 111, + 124, + 3, + 137, + 127, + 255, + 241, + 189, + 240, + 14, + 37, + 255, + 255, + 198, + 247, + 192, + 56, + 151, + 255, + 255, + 27, + 223, + 0, + 226, + 95, + 255, + 252, + 111, + 124, + 3, + 137, + 59, + 255, + 241, + 198, + 112, + 14, + 36, + 239, + 255, + 199, + 25, + 192, + 56, + 147, + 191, + 255, + 28, + 103, + 0, + 226, + 78, + 255, + 252, + 113, + 156, + 3, + 137, + 59, + 255, + 241, + 198, + 112, + 14, + 36, + 199, + 255, + 199, + 30, + 192, + 56, + 147, + 31, + 255, + 28, + 123, + 0, + 226, + 76, + 127, + 252, + 113, + 236, + 3, + 137, + 49, + 255, + 241, + 199, + 176, + 14, + 36, + 199, + 255, + 199, + 30, + 192, + 56, + 147, + 31, + 255, + 28, + 123, + 0, + 226, + 76, + 127, + 252, + 113, + 236, + 3, + 137, + 49, + 255, + 241, + 199, + 176, + 14, + 36, + 199, + 255, + 199, + 30, + 192, + 56, + 147, + 31, + 255, + 28, + 123, + 0, + 226, + 78, + 255, + 252, + 113, + 156, + 3, + 137, + 59, + 255, + 241, + 198, + 112, + 14, + 36, + 239, + 255, + 199, + 25, + 192, + 56, + 147, + 191, + 255, + 28, + 103, + 0, + 226, + 78, + 255, + 252, + 113, + 156, + 3, + 137, + 59, + 255, + 241, + 198, + 112, + 14, + 36, + 239, + 255, + 199, + 25, + 192, + 56, + 147, + 191, + 255, + 28, + 103, + 0, + 226, + 78, + 255, + 252, + 113, + 156, + 3, + 137, + 59, + 255, + 241, + 198, + 112, + 14, + 36, + 239, + 255, + 199, + 25, + 192, + 56, + 147, + 191, + 255, + 28, + 103, + 0, + 226, + 78, + 255, + 252, + 113, + 156, + 3, + 137, + 59, + 255, + 241, + 198, + 176, + 14, + 36, + 231, + 255, + 199, + 30, + 192, + 56, + 147, + 31, + 255, + 28, + 123, + 0, + 226, + 76, + 127, + 252, + 113, + 236, + 3, + 137, + 49, + 255, + 241, + 199, + 176, + 14, + 36, + 199, + 255, + 199, + 30, + 192, + 56, + 147, + 31, + 255, + 28, + 123, + 0, + 226, + 76, + 127, + 252, + 113, + 236, + 3, + 137, + 49, + 255, + 241, + 199, + 176, + 14, + 36, + 199, + 255, + 199, + 30, + 192, + 56, + 147, + 31, + 255, + 28, + 183, + 0, + 226, + 68, + 255, + 252, + 114, + 220, + 3, + 137, + 19, + 255, + 241, + 203, + 112, + 14, + 36, + 79, + 255, + 199, + 45, + 192, + 56, + 145, + 63, + 255, + 28, + 183, + 0, + 226, + 68, + 255, + 252, + 115, + 44, + 3, + 137, + 9, + 255, + 241, + 204, + 176, + 14, + 36, + 39, + 255, + 199, + 50, + 192, + 56, + 144, + 159, + 255, + 28, + 203, + 0, + 226, + 66, + 127, + 252, + 115, + 44, + 3, + 137, + 9, + 255, + 241, + 206, + 240, + 14, + 35, + 223, + 255, + 199, + 59, + 192, + 56, + 143, + 127, + 255, + 28, + 239, + 0, + 226, + 61, + 255, + 252, + 115, + 188, + 3, + 136, + 247, + 255, + 241, + 206, + 240, + 14, + 35, + 223, + 255, + 199, + 59, + 192, + 56, + 143, + 127, + 255, + 28, + 239, + 0, + 226, + 61, + 255, + 252, + 115, + 188, + 3, + 136, + 247, + 255, + 241, + 206, + 240, + 14, + 35, + 223, + 255, + 199, + 60, + 192, + 56, + 143, + 95, + 255, + 29, + 3, + 0, + 226, + 56, + 255, + 252, + 116, + 92, + 3, + 136, + 227, + 255, + 241, + 209, + 112, + 14, + 35, + 143, + 255, + 199, + 69, + 192, + 56, + 142, + 63, + 255, + 29, + 27, + 0, + 226, + 56, + 127, + 252, + 116, + 172, + 3, + 136, + 217, + 255, + 241, + 210, + 176, + 14, + 35, + 103, + 255, + 199, + 74, + 192, + 56, + 141, + 159, + 255, + 29, + 43, + 0, + 226, + 54, + 127, + 252, + 116, + 172, + 3, + 136, + 215, + 255, + 241, + 210, + 240, + 14, + 35, + 23, + 255, + 199, + 84, + 192, + 56, + 140, + 95, + 255, + 29, + 83, + 0, + 226, + 49, + 127, + 252, + 117, + 76, + 3, + 136, + 197, + 255, + 241, + 213, + 48, + 14, + 34, + 207, + 255, + 199, + 93, + 192, + 56, + 139, + 63, + 255, + 29, + 119, + 0, + 226, + 44, + 255, + 252, + 117, + 220, + 3, + 136, + 179, + 255, + 241, + 215, + 112, + 14, + 34, + 207, + 255, + 199, + 98, + 192, + 56, + 136, + 191, + 255, + 29, + 199, + 0, + 226, + 34, + 255, + 252, + 119, + 28, + 3, + 136, + 139, + 255, + 241, + 220, + 112, + 14, + 34, + 47, + 255, + 199, + 113, + 192, + 56, + 136, + 191, + 255, + 29, + 219, + 0, + 226, + 32, + 127, + 252, + 119, + 108, + 3, + 136, + 129, + 255, + 241, + 221, + 176, + 14, + 34, + 7, + 255, + 199, + 118, + 192, + 56, + 136, + 31, + 255, + 29, + 219, + 0, + 226, + 32, + 127, + 252, + 119, + 108, + 3, + 136, + 129, + 255, + 241, + 221, + 176, + 14, + 34, + 7, + 255, + 199, + 118, + 192, + 56, + 136, + 31, + 255, + 29, + 219, + 0, + 226, + 32, + 127, + 252, + 119, + 108, + 3, + 136, + 129, + 255, + 241, + 224, + 48, + 14, + 33, + 103, + 255, + 199, + 138, + 192, + 56, + 133, + 159, + 255, + 30, + 43, + 0, + 226, + 22, + 127, + 252, + 120, + 172, + 3, + 136, + 89, + 255, + 241, + 226, + 176, + 14, + 33, + 103, + 255, + 199, + 138, + 192, + 56, + 133, + 159, + 255, + 30, + 43, + 0, + 226, + 22, + 127, + 252, + 120, + 172, + 3, + 136, + 89, + 255, + 241, + 226, + 176, + 14, + 33, + 103, + 255, + 199, + 138, + 192, + 56, + 133, + 159, + 255, + 30, + 59, + 0, + 226, + 20, + 127, + 252, + 120, + 236, + 3, + 136, + 81, + 255, + 241, + 227, + 240, + 14, + 33, + 63, + 255, + 199, + 143, + 192, + 56, + 132, + 255, + 255, + 30, + 79, + 0, + 226, + 15, + 127, + 252, + 121, + 140, + 3, + 136, + 61, + 255, + 241, + 230, + 48, + 14, + 32, + 247, + 255, + 199, + 152, + 192, + 56, + 131, + 223, + 255, + 30, + 99, + 0, + 226, + 15, + 127, + 252, + 121, + 140, + 3, + 136, + 53, + 255, + 241, + 231, + 48, + 14, + 32, + 215, + 255, + 199, + 156, + 192, + 56, + 131, + 95, + 255, + 30, + 115, + 0, + 226, + 13, + 127, + 252, + 121, + 204, + 3, + 136, + 53, + 255, + 241, + 232, + 112, + 14, + 32, + 175, + 255, + 199, + 161, + 192, + 56, + 130, + 191, + 255, + 30, + 135, + 0, + 226, + 10, + 255, + 252, + 122, + 28, + 3, + 136, + 43, + 255, + 241, + 232, + 112, + 14, + 32, + 175, + 255, + 199, + 161, + 192, + 56, + 130, + 191, + 255, + 30, + 135, + 0, + 226, + 10, + 255, + 252, + 122, + 28, + 3, + 136, + 43, + 255, + 241, + 232, + 112, + 14, + 32, + 175, + 255, + 199, + 161, + 192, + 56, + 130, + 191, + 255, + 30, + 155, + 0, + 226, + 8, + 127, + 252, + 122, + 108, + 3, + 136, + 33, + 255, + 241, + 233, + 176, + 14, + 32, + 135, + 255, + 199, + 166, + 192, + 56, + 130, + 31, + 255, + 30, + 155, + 0, + 226, + 8, + 127, + 252, + 122, + 188, + 3, + 136, + 23, + 255, + 241, + 234, + 240, + 14, + 32, + 95, + 255, + 199, + 171, + 192, + 56, + 129, + 127, + 255, + 30, + 175, + 0, + 226, + 5, + 255, + 252, + 122, + 188, + 3, + 136, + 23, + 255, + 241, + 238, + 176, + 14, + 31, + 231, + 255, + 199, + 186, + 192, + 56, + 127, + 159, + 255, + 30, + 235, + 0, + 225, + 254, + 127, + 252, + 123, + 172, + 3, + 135, + 249, + 255, + 241, + 239, + 176, + 14, + 31, + 159, + 255, + 199, + 195, + 192, + 56, + 126, + 127, + 255, + 31, + 15, + 0, + 225, + 249, + 255, + 252, + 124, + 60, + 3, + 135, + 231, + 255, + 241, + 240, + 240, + 14, + 31, + 159, + 255, + 199, + 249, + 192, + 56, + 118, + 127, + 255, + 32, + 15, + 0, + 225, + 217, + 255, + 252, + 128, + 60, + 3, + 135, + 103, + 255, + 242, + 0, + 240, + 14, + 29, + 159, + 255, + 200, + 3, + 192, + 56, + 118, + 127, + 255, + 32, + 227, + 0, + 225, + 186, + 127, + 252, + 132, + 44, + 3, + 134, + 233, + 255, + 242, + 16, + 176, + 14, + 27, + 167, + 255, + 200, + 66, + 192, + 56, + 110, + 159, + 255, + 33, + 11, + 0, + 225, + 186, + 127, + 252, + 132, + 44, + 3, + 134, + 205, + 255, + 242, + 20, + 48, + 14, + 27, + 55, + 255, + 200, + 80, + 192, + 56, + 108, + 223, + 255, + 33, + 67, + 0, + 225, + 179, + 127, + 252, + 133, + 12, + 3, + 134, + 205, + 255, + 242, + 21, + 112, + 14, + 26, + 151, + 255, + 200, + 100, + 192, + 56, + 106, + 95, + 255, + 33, + 147, + 0, + 225, + 169, + 127, + 252, + 134, + 76, + 3, + 134, + 165, + 255, + 242, + 25, + 48, + 14, + 26, + 151, + 255, + 200, + 100, + 192, + 56, + 49, + 63, + 254, + 39, + 0, + 224, + 225, + 255, + 252, + 133, + 252, + 3, + 131, + 19, + 255, + 226, + 112, + 14, + 14, + 31, + 255, + 200, + 95, + 192, + 56, + 49, + 63, + 254, + 39, + 0, + 224, + 225, + 255, + 252, + 133, + 252, + 3, + 131, + 19, + 255, + 226, + 112, + 14, + 14, + 31, + 255, + 200, + 95, + 192, + 56, + 49, + 63, + 254, + 39, + 0, + 224, + 225, + 255, + 252, + 133, + 252, + 3, + 129, + 143, + 255, + 228, + 176, + 14, + 5, + 79, + 255, + 142, + 192, + 56, + 56, + 127, + 255, + 33, + 127, + 0, + 224, + 99, + 255, + 249, + 44, + 3, + 129, + 83, + 255, + 227, + 176, + 14, + 14, + 31, + 255, + 200, + 95, + 192, + 56, + 24, + 255, + 254, + 75, + 0, + 224, + 84, + 255, + 248, + 236, + 3, + 131, + 135, + 255, + 242, + 23, + 240, + 14, + 6, + 63, + 255, + 146, + 192, + 56, + 21, + 63, + 254, + 59, + 0, + 224, + 225, + 255, + 252, + 133, + 252, + 3, + 129, + 143, + 255, + 228, + 240, + 14, + 5, + 71, + 255, + 143, + 192, + 56, + 56, + 95, + 255, + 33, + 127, + 0, + 224, + 99, + 255, + 249, + 204, + 3, + 129, + 63, + 255, + 228, + 240, + 14, + 13, + 247, + 255, + 200, + 95, + 192, + 56, + 24, + 255, + 254, + 115, + 0, + 224, + 79, + 255, + 249, + 60, + 3, + 131, + 125, + 255, + 242, + 23, + 240, + 14, + 6, + 63, + 255, + 156, + 192, + 56, + 19, + 255, + 254, + 79, + 0, + 224, + 223, + 127, + 252, + 133, + 252, + 3, + 129, + 143, + 255, + 231, + 48, + 14, + 4, + 255, + 255, + 147, + 192, + 56, + 55, + 223, + 255, + 33, + 127, + 0, + 224, + 94, + 255, + 250, + 188, + 3, + 129, + 43, + 255, + 230, + 48, + 14, + 13, + 247, + 255, + 200, + 95, + 192, + 56, + 23, + 191, + 254, + 175, + 0, + 224, + 74, + 255, + 249, + 140, + 3, + 131, + 125, + 255, + 242, + 23, + 240, + 14, + 5, + 239, + 255, + 171, + 192, + 56, + 18, + 191, + 254, + 99, + 0, + 224, + 223, + 127, + 252, + 133, + 252, + 3, + 129, + 123, + 255, + 234, + 240, + 14, + 4, + 175, + 255, + 152, + 192, + 56, + 55, + 223, + 255, + 33, + 127, + 0, + 224, + 94, + 255, + 250, + 188, + 3, + 129, + 43, + 255, + 230, + 48, + 14, + 13, + 247, + 255, + 200, + 95, + 192, + 56, + 23, + 31, + 254, + 211, + 0, + 224, + 70, + 127, + 250, + 44, + 3, + 131, + 115, + 255, + 242, + 23, + 240, + 14, + 5, + 199, + 255, + 180, + 192, + 56, + 17, + 159, + 254, + 139, + 0, + 224, + 220, + 255, + 252, + 133, + 252, + 3, + 129, + 113, + 255, + 237, + 48, + 14, + 4, + 103, + 255, + 162, + 192, + 56, + 55, + 63, + 255, + 33, + 127, + 0, + 224, + 92, + 127, + 251, + 76, + 3, + 129, + 25, + 255, + 232, + 176, + 14, + 13, + 207, + 255, + 200, + 95, + 192, + 56, + 23, + 31, + 254, + 211, + 0, + 224, + 70, + 127, + 250, + 44, + 3, + 131, + 115, + 255, + 242, + 23, + 240, + 14, + 5, + 47, + 255, + 192, + 71, + 192, + 56, + 17, + 31, + 254, + 155, + 0, + 224, + 223, + 127, + 252, + 133, + 172, + 3, + 129, + 75, + 255, + 240, + 17, + 240, + 14, + 4, + 71, + 255, + 166, + 192, + 56, + 55, + 223, + 255, + 33, + 107, + 0, + 224, + 82, + 255, + 252, + 4, + 124, + 3, + 129, + 17, + 255, + 233, + 176, + 14, + 13, + 247, + 255, + 200, + 90, + 192, + 56, + 20, + 159, + 255, + 1, + 35, + 0, + 224, + 68, + 127, + 250, + 108, + 3, + 131, + 125, + 255, + 242, + 22, + 176, + 14, + 5, + 39, + 255, + 192, + 73, + 192, + 56, + 16, + 255, + 254, + 155, + 0, + 224, + 223, + 127, + 252, + 133, + 172, + 3, + 129, + 55, + 255, + 240, + 22, + 240, + 14, + 3, + 207, + 255, + 171, + 192, + 56, + 55, + 223, + 255, + 33, + 107, + 0, + 224, + 77, + 255, + 252, + 5, + 188, + 3, + 128, + 243, + 255, + 234, + 240, + 14, + 13, + 247, + 255, + 200, + 90, + 192, + 56, + 19, + 127, + 255, + 1, + 111, + 0, + 224, + 60, + 255, + 250, + 188, + 3, + 131, + 125, + 255, + 242, + 22, + 176, + 14, + 4, + 223, + 255, + 192, + 91, + 192, + 56, + 15, + 63, + 254, + 175, + 0, + 224, + 223, + 127, + 252, + 133, + 172, + 3, + 129, + 55, + 255, + 240, + 22, + 240, + 14, + 3, + 207, + 255, + 171, + 192, + 56, + 55, + 223, + 255, + 33, + 107, + 0, + 224, + 75, + 127, + 252, + 12, + 108, + 3, + 29, + 255, + 236, + 48, + 14, + 13, + 247, + 255, + 200, + 90, + 192, + 56, + 18, + 223, + 255, + 3, + 27, + 0, + 199, + 127, + 251, + 12, + 3, + 131, + 125, + 255, + 242, + 22, + 176, + 14, + 4, + 183, + 255, + 192, + 198, + 192, + 49, + 223, + 254, + 195, + 0, + 224, + 223, + 127, + 252, + 133, + 172, + 3, + 129, + 45, + 255, + 240, + 49, + 176, + 12, + 119, + 255, + 176, + 192, + 56, + 55, + 223, + 255, + 33, + 107, + 0, + 224, + 75, + 127, + 252, + 12, + 108, + 3, + 29, + 255, + 236, + 48, + 14, + 13, + 247, + 255, + 200, + 95, + 192, + 56, + 17, + 159, + 255, + 4, + 63, + 0, + 224, + 221, + 127, + 252, + 133, + 252, + 3, + 129, + 25, + 255, + 240, + 67, + 240, + 14, + 13, + 215, + 255, + 200, + 95, + 192, + 56, + 17, + 159, + 255, + 4, + 63, + 0, + 224, + 221, + 127, + 252, + 133, + 252, + 3, + 129, + 25, + 255, + 240, + 67, + 240, + 14, + 13, + 215, + 255, + 200, + 95, + 192, + 56, + 17, + 159, + 255, + 4, + 63, + 0, + 224, + 221, + 127, + 252, + 133, + 252, + 3, + 97, + 255, + 226, + 48, + 14, + 2, + 111, + 255, + 193, + 20, + 192, + 56, + 55, + 95, + 255, + 33, + 127, + 0, + 216, + 127, + 248, + 140, + 3, + 128, + 155, + 255, + 240, + 69, + 48, + 14, + 13, + 215, + 255, + 200, + 95, + 192, + 54, + 31, + 254, + 35, + 0, + 224, + 38, + 255, + 252, + 17, + 76, + 3, + 131, + 117, + 255, + 242, + 23, + 240, + 13, + 135, + 255, + 136, + 192, + 56, + 9, + 191, + 255, + 4, + 83, + 0, + 224, + 221, + 127, + 252, + 134, + 76, + 3, + 87, + 255, + 226, + 48, + 14, + 2, + 111, + 255, + 193, + 20, + 192, + 56, + 55, + 95, + 255, + 33, + 147, + 0, + 213, + 255, + 248, + 140, + 3, + 128, + 155, + 255, + 240, + 69, + 48, + 14, + 13, + 215, + 255, + 200, + 100, + 192, + 53, + 127, + 254, + 35, + 0, + 224, + 38, + 255, + 252, + 17, + 76, + 3, + 131, + 117, + 255, + 242, + 25, + 48, + 13, + 95, + 255, + 136, + 192, + 56, + 9, + 191, + 255, + 4, + 83, + 0, + 224, + 221, + 127, + 252, + 134, + 76, + 3, + 87, + 255, + 226, + 48, + 14, + 2, + 111, + 255, + 193, + 20, + 192, + 56, + 55, + 95, + 255, + 34, + 123, + 0, + 224, + 33, + 255, + 252, + 17, + 156, + 3, + 131, + 107, + 255, + 242, + 40, + 240, + 14, + 2, + 31, + 255, + 193, + 25, + 192, + 56, + 54, + 191, + 255, + 34, + 143, + 0, + 224, + 33, + 255, + 252, + 17, + 156, + 3, + 131, + 107, + 255, + 242, + 40, + 240, + 14, + 2, + 31, + 255, + 193, + 25, + 192, + 56, + 54, + 191, + 255, + 34, + 143, + 0, + 224, + 33, + 255, + 252, + 17, + 156, + 3, + 131, + 107, + 255, + 242, + 42, + 48, + 13, + 207, + 255, + 193, + 30, + 192, + 56, + 54, + 191, + 255, + 34, + 163, + 0, + 220, + 255, + 252, + 17, + 236, + 3, + 131, + 107, + 255, + 242, + 42, + 48, + 13, + 207, + 255, + 193, + 30, + 192, + 56, + 54, + 191, + 255, + 34, + 163, + 0, + 220, + 255, + 252, + 17, + 236, + 3, + 131, + 107, + 255, + 242, + 42, + 48, + 13, + 207, + 255, + 193, + 30, + 192, + 56, + 54, + 191, + 255, + 34, + 163, + 0, + 220, + 255, + 252, + 17, + 236, + 3, + 129, + 211, + 255, + 227, + 112, + 14, + 6, + 95, + 255, + 200, + 154, + 192, + 55, + 63, + 255, + 4, + 123, + 0, + 224, + 116, + 255, + 248, + 220, + 3, + 129, + 153, + 255, + 242, + 38, + 112, + 13, + 207, + 255, + 193, + 30, + 192, + 56, + 29, + 63, + 254, + 55, + 0, + 224, + 102, + 127, + 252, + 137, + 156, + 3, + 115, + 255, + 240, + 71, + 176, + 14, + 7, + 79, + 255, + 141, + 192, + 56, + 25, + 159, + 255, + 34, + 103, + 0, + 220, + 255, + 252, + 17, + 236, + 3, + 129, + 211, + 255, + 227, + 112, + 14, + 6, + 103, + 255, + 200, + 173, + 192, + 52, + 191, + 255, + 4, + 123, + 0, + 224, + 116, + 255, + 249, + 124, + 3, + 129, + 151, + 255, + 242, + 41, + 48, + 13, + 47, + 255, + 193, + 30, + 192, + 56, + 29, + 63, + 254, + 95, + 0, + 224, + 101, + 255, + 252, + 138, + 76, + 3, + 75, + 255, + 240, + 71, + 176, + 14, + 7, + 79, + 255, + 151, + 192, + 56, + 25, + 127, + 255, + 34, + 147, + 0, + 210, + 255, + 252, + 17, + 236, + 3, + 129, + 211, + 255, + 229, + 240, + 14, + 6, + 95, + 255, + 200, + 164, + 192, + 52, + 191, + 255, + 4, + 123, + 0, + 224, + 116, + 255, + 249, + 124, + 3, + 129, + 151, + 255, + 242, + 45, + 240, + 12, + 119, + 255, + 193, + 34, + 192, + 56, + 29, + 63, + 254, + 115, + 0, + 224, + 101, + 255, + 252, + 139, + 44, + 3, + 29, + 255, + 240, + 72, + 176, + 14, + 7, + 79, + 255, + 156, + 192, + 56, + 25, + 127, + 255, + 34, + 203, + 0, + 199, + 127, + 252, + 18, + 44, + 3, + 129, + 211, + 255, + 231, + 48, + 14, + 6, + 95, + 255, + 200, + 178, + 192, + 49, + 223, + 255, + 4, + 139, + 0, + 224, + 116, + 255, + 249, + 204, + 3, + 129, + 151, + 255, + 242, + 44, + 176, + 12, + 111, + 255, + 193, + 35, + 192, + 56, + 29, + 31, + 254, + 119, + 0, + 224, + 101, + 255, + 252, + 158, + 76, + 3, + 129, + 201, + 255, + 233, + 176, + 14, + 6, + 95, + 255, + 201, + 223, + 192, + 56, + 28, + 159, + 254, + 155, + 0, + 224, + 101, + 255, + 252, + 157, + 252, + 3, + 129, + 201, + 255, + 233, + 176, + 14, + 6, + 95, + 255, + 201, + 223, + 192, + 56, + 28, + 159, + 254, + 155, + 0, + 224, + 101, + 255, + 252, + 158, + 76, + 3, + 129, + 191, + 255, + 234, + 240, + 14, + 6, + 55, + 255, + 201, + 228, + 192, + 56, + 27, + 255, + 254, + 175, + 0, + 224, + 99, + 127, + 252, + 158, + 76, + 3, + 129, + 191, + 255, + 234, + 240, + 14, + 6, + 55, + 255, + 201, + 228, + 192, + 56, + 27, + 255, + 254, + 175, + 0, + 224, + 99, + 127, + 252, + 158, + 76, + 3, + 129, + 191, + 255, + 234, + 240, + 14, + 6, + 55, + 255, + 201, + 228, + 192, + 56, + 27, + 255, + 254, + 211, + 0, + 224, + 94, + 255, + 252, + 158, + 76, + 3, + 129, + 191, + 255, + 237, + 48, + 14, + 5, + 239, + 255, + 201, + 228, + 192, + 56, + 27, + 255, + 254, + 211, + 0, + 224, + 94, + 255, + 252, + 158, + 76, + 3, + 129, + 191, + 255, + 237, + 48, + 14, + 5, + 239, + 255, + 201, + 228, + 192, + 55, + 223, + 252, + 96, + 28, + 9, + 255, + 255, + 105, + 128, + 112, + 47, + 127, + 254, + 79, + 38, + 1, + 166, + 255, + 243, + 152, + 7, + 2, + 111, + 255, + 220, + 224, + 28, + 11, + 143, + 255, + 147, + 201, + 128, + 105, + 191, + 252, + 230, + 1, + 192, + 155, + 255, + 247, + 56, + 7, + 2, + 227, + 255, + 228, + 242, + 96, + 26, + 111, + 255, + 57, + 128, + 112, + 38, + 255, + 253, + 206, + 1, + 192, + 184, + 255, + 249, + 60, + 152, + 6, + 155, + 255, + 206, + 96, + 28, + 9, + 191, + 255, + 115, + 128, + 112, + 46, + 63, + 254, + 79, + 38, + 1, + 166, + 255, + 243, + 152, + 7, + 2, + 111, + 255, + 220, + 224, + 28, + 11, + 143, + 255, + 147, + 201, + 128, + 104, + 127, + 253, + 14, + 1, + 192, + 155, + 255, + 247, + 56, + 7, + 2, + 227, + 255, + 228, + 242, + 96, + 26, + 31, + 255, + 67, + 128, + 112, + 38, + 255, + 253, + 206, + 1, + 192, + 184, + 255, + 249, + 60, + 152, + 6, + 135, + 255, + 208, + 224, + 28, + 9, + 191, + 255, + 115, + 128, + 112, + 46, + 63, + 254, + 79, + 38, + 1, + 161, + 255, + 244, + 56, + 7, + 2, + 111, + 255, + 220, + 224, + 28, + 11, + 143, + 255, + 147, + 201, + 128, + 104, + 127, + 253, + 14, + 1, + 192, + 155, + 255, + 247, + 56, + 7, + 2, + 227, + 255, + 228, + 242, + 96, + 26, + 31, + 255, + 67, + 128, + 112, + 38, + 255, + 253, + 94, + 1, + 192, + 198, + 255, + 249, + 60, + 152, + 6, + 135, + 255, + 208, + 224, + 28, + 9, + 191, + 255, + 87, + 128, + 112, + 49, + 191, + 254, + 79, + 38, + 1, + 161, + 255, + 244, + 56, + 7, + 2, + 111, + 255, + 213, + 224, + 28, + 12, + 111, + 255, + 147, + 201, + 128, + 104, + 127, + 253, + 14, + 1, + 192, + 155, + 255, + 245, + 120, + 7, + 3, + 27, + 255, + 228, + 242, + 96, + 26, + 31, + 255, + 67, + 128, + 112, + 38, + 255, + 253, + 94, + 1, + 192, + 198, + 255, + 249, + 60, + 152, + 6, + 135, + 255, + 208, + 224, + 28, + 6, + 255, + 255, + 128, + 175, + 128, + 112, + 49, + 191, + 254, + 79, + 38, + 1, + 161, + 255, + 244, + 56, + 7, + 1, + 191, + 255, + 224, + 43, + 224, + 28, + 12, + 111, + 255, + 147, + 201, + 128, + 104, + 127, + 253, + 14, + 1, + 192, + 111, + 255, + 248, + 10, + 248, + 7, + 3, + 27, + 255, + 228, + 242, + 96, + 26, + 31, + 255, + 67, + 128, + 112, + 27, + 255, + 254, + 2, + 190, + 1, + 192, + 198, + 255, + 249, + 60, + 152, + 6, + 135, + 255, + 208, + 224, + 28, + 6, + 255, + 255, + 128, + 175, + 128, + 112, + 49, + 191, + 254, + 79, + 78, + 1, + 151, + 255, + 244, + 216, + 7, + 1, + 135, + 255, + 224, + 43, + 96, + 28, + 13, + 95, + 255, + 147, + 211, + 128, + 101, + 255, + 253, + 54, + 1, + 192, + 97, + 255, + 248, + 10, + 216, + 7, + 3, + 87, + 255, + 228, + 244, + 224, + 25, + 127, + 255, + 77, + 128, + 112, + 24, + 127, + 254, + 2, + 182, + 1, + 192, + 213, + 255, + 249, + 61, + 56, + 6, + 95, + 255, + 211, + 96, + 28, + 6, + 15, + 255, + 128, + 175, + 128, + 112, + 53, + 127, + 254, + 79, + 86, + 1, + 150, + 255, + 244, + 248, + 7, + 1, + 127, + 255, + 224, + 43, + 224, + 28, + 13, + 95, + 255, + 148, + 111, + 128, + 112, + 16, + 255, + 254, + 3, + 46, + 1, + 192, + 213, + 255, + 249, + 70, + 248, + 7, + 1, + 15, + 255, + 224, + 50, + 224, + 28, + 13, + 95, + 255, + 148, + 111, + 128, + 112, + 16, + 255, + 254, + 3, + 46, + 1, + 192, + 213, + 255, + 249, + 70, + 248, + 7, + 1, + 15, + 255, + 224, + 50, + 224, + 28, + 13, + 95, + 255, + 149, + 187, + 128, + 112, + 56, + 191, + 254, + 86, + 158, + 1, + 192, + 228, + 255, + 249, + 90, + 88, + 7, + 3, + 147, + 255, + 229, + 105, + 96, + 28, + 14, + 79, + 255, + 149, + 165, + 128, + 112, + 57, + 63, + 254, + 86, + 150, + 1, + 192, + 232, + 255, + 249, + 89, + 216, + 7, + 3, + 167, + 255, + 229, + 102, + 224, + 28, + 14, + 159, + 255, + 149, + 155, + 128, + 112, + 58, + 127, + 254, + 86, + 110, + 1, + 192, + 233, + 255, + 249, + 89, + 184, + 7, + 3, + 167, + 255, + 229, + 102, + 224, + 28, + 14, + 159, + 255, + 149, + 155, + 128, + 112, + 58, + 127, + 254, + 86, + 110, + 1, + 192, + 233, + 255, + 249, + 89, + 184, + 7, + 3, + 167, + 255, + 229, + 102, + 224, + 28, + 15, + 127, + 255, + 39, + 128, + 106, + 191, + 254, + 84, + 6, + 1, + 192, + 247, + 255, + 242, + 120, + 6, + 171, + 255, + 229, + 64, + 96, + 28, + 15, + 127, + 255, + 39, + 128, + 106, + 191, + 254, + 84, + 6, + 1, + 192, + 247, + 255, + 242, + 120, + 6, + 171, + 255, + 229, + 64, + 96, + 28, + 15, + 127, + 255, + 39, + 128, + 106, + 191, + 254, + 84, + 6, + 1, + 192, + 252, + 255, + 240, + 152, + 6, + 231, + 255, + 229, + 61, + 224, + 28, + 15, + 207, + 255, + 9, + 128, + 110, + 127, + 254, + 83, + 222, + 1, + 192, + 252, + 255, + 240, + 152, + 6, + 231, + 255, + 229, + 61, + 224, + 28, + 15, + 207, + 255, + 9, + 128, + 110, + 127, + 254, + 83, + 222, + 1, + 192, + 252, + 255, + 240, + 152, + 6, + 231, + 255, + 229, + 61, + 224, + 28, + 20, + 15, + 255, + 148, + 237, + 128, + 112, + 80, + 63, + 254, + 83, + 182, + 1, + 193, + 64, + 255, + 249, + 78, + 216, + 7, + 5, + 3, + 255, + 229, + 59, + 96, + 28, + 20, + 15, + 255, + 148, + 237, + 128, + 112, + 80, + 63, + 254, + 83, + 182, + 1, + 193, + 64, + 255, + 249, + 78, + 216, + 7, + 5, + 3, + 255, + 229, + 59, + 96, + 28, + 20, + 15, + 255, + 148, + 237, + 128, + 112, + 80, + 63, + 254, + 83, + 182, + 1, + 193, + 64, + 255, + 249, + 78, + 216, + 7, + 5, + 3, + 255, + 229, + 59, + 96, + 28, + 20, + 15, + 255, + 148, + 237, + 128, + 112, + 80, + 63, + 254, + 83, + 182, + 1, + 192, + 184, + 255, + 244, + 56, + 7, + 1, + 151, + 255, + 229, + 59, + 96, + 28, + 11, + 143, + 255, + 67, + 128, + 112, + 25, + 127, + 254, + 83, + 182, + 1, + 192, + 184, + 255, + 244, + 56, + 7, + 1, + 151, + 255, + 229, + 59, + 96, + 28, + 11, + 143, + 255, + 67, + 128, + 112, + 25, + 127, + 254, + 83, + 182, + 1, + 192, + 184, + 255, + 244, + 56, + 7, + 1, + 151, + 255, + 229, + 59, + 96, + 28, + 9, + 191, + 255, + 128, + 135, + 128, + 112, + 24, + 63, + 254, + 83, + 182, + 1, + 192, + 155, + 255, + 248, + 8, + 120, + 7, + 1, + 131, + 255, + 229, + 59, + 96, + 28, + 9, + 191, + 255, + 128, + 135, + 128, + 112, + 24, + 63, + 254, + 83, + 182, + 1, + 192, + 155, + 255, + 248, + 8, + 120, + 7, + 1, + 131, + 255, + 229, + 59, + 96, + 28, + 9, + 191, + 255, + 128, + 135, + 128, + 112, + 24, + 63, + 254, + 83, + 182, + 1, + 192, + 145, + 255, + 248, + 10, + 88, + 7, + 1, + 111, + 255, + 229, + 59, + 96, + 28, + 9, + 31, + 255, + 128, + 165, + 128, + 112, + 22, + 255, + 254, + 83, + 182, + 1, + 192, + 145, + 255, + 248, + 10, + 88, + 7, + 1, + 111, + 255, + 229, + 59, + 96, + 28, + 9, + 31, + 255, + 128, + 165, + 128, + 112, + 22, + 255, + 254, + 83, + 182, + 1, + 192, + 145, + 255, + 248, + 10, + 88, + 7, + 1, + 111, + 255, + 229, + 59, + 96, + 28, + 8, + 207, + 255, + 128, + 185, + 128, + 112, + 21, + 191, + 254, + 83, + 182, + 1, + 192, + 140, + 255, + 248, + 11, + 152, + 7, + 1, + 91, + 255, + 229, + 59, + 96, + 28, + 8, + 207, + 255, + 128, + 185, + 128, + 112, + 21, + 191, + 254, + 83, + 182, + 1, + 192, + 140, + 255, + 248, + 11, + 152, + 7, + 1, + 91, + 255, + 229, + 59, + 96, + 28, + 8, + 207, + 255, + 128, + 185, + 128, + 112, + 21, + 191, + 254, + 83, + 182, + 1, + 192, + 140, + 255, + 248, + 12, + 24, + 7, + 1, + 75, + 255, + 229, + 59, + 96, + 28, + 8, + 207, + 255, + 128, + 193, + 128, + 112, + 20, + 191, + 254, + 83, + 182, + 1, + 192, + 140, + 255, + 248, + 12, + 24, + 7, + 1, + 75, + 255, + 229, + 59, + 96, + 28, + 8, + 207, + 255, + 128, + 193, + 128, + 112, + 20, + 191, + 254, + 83, + 182, + 1, + 192, + 140, + 255, + 248, + 12, + 24, + 7, + 1, + 75, + 255, + 229, + 59, + 96, + 28, + 8, + 127, + 255, + 128, + 203, + 128, + 112, + 20, + 191, + 254, + 83, + 182, + 1, + 192, + 135, + 255, + 248, + 12, + 184, + 7, + 1, + 75, + 255, + 229, + 59, + 96, + 28, + 8, + 127, + 255, + 128, + 203, + 128, + 112, + 20, + 191, + 254, + 83, + 182, + 1, + 192, + 135, + 255, + 248, + 12, + 184, + 7, + 1, + 75, + 255, + 229, + 59, + 96, + 28, + 8, + 47, + 255, + 128, + 213, + 128, + 112, + 20, + 191, + 254, + 83, + 182, + 1, + 192, + 130, + 255, + 248, + 13, + 88, + 7, + 1, + 75, + 255, + 229, + 59, + 96, + 28, + 8, + 47, + 255, + 128, + 213, + 128, + 112, + 20, + 191, + 254, + 83, + 182, + 1, + 192, + 130, + 255, + 248, + 13, + 88, + 7, + 1, + 75, + 255, + 229, + 59, + 96, + 28, + 8, + 47, + 255, + 128, + 213, + 128, + 112, + 20, + 191, + 254, + 83, + 182, + 1, + 192, + 130, + 255, + 248, + 13, + 248, + 7, + 1, + 55, + 255, + 229, + 59, + 96, + 28, + 8, + 47, + 255, + 128, + 223, + 128, + 112, + 19, + 127, + 254, + 83, + 182, + 1, + 192, + 130, + 255, + 248, + 13, + 248, + 7, + 1, + 55, + 255, + 229, + 59, + 96, + 28, + 8, + 47, + 255, + 128, + 223, + 128, + 112, + 19, + 127, + 254, + 83, + 182, + 1, + 192, + 130, + 255, + 248, + 13, + 248, + 7, + 1, + 55, + 255, + 229, + 61, + 224, + 28, + 7, + 223, + 255, + 128, + 233, + 128, + 112, + 18, + 63, + 254, + 83, + 222, + 1, + 192, + 125, + 255, + 248, + 14, + 152, + 7, + 1, + 35, + 255, + 229, + 61, + 224, + 28, + 7, + 223, + 255, + 128, + 233, + 128, + 112, + 18, + 63, + 254, + 83, + 222, + 1, + 192, + 125, + 255, + 248, + 14, + 152, + 7, + 1, + 35, + 255, + 229, + 61, + 224, + 28, + 7, + 223, + 255, + 128, + 233, + 128, + 112, + 18, + 63, + 254, + 84, + 6, + 1, + 192, + 116, + 255, + 248, + 15, + 24, + 6, + 235, + 255, + 229, + 71, + 96, + 28, + 7, + 79, + 255, + 128, + 241, + 128, + 110, + 191, + 254, + 84, + 118, + 1, + 192, + 116, + 255, + 248, + 15, + 24, + 6, + 235, + 255, + 229, + 71, + 96, + 28, + 7, + 79, + 255, + 128, + 241, + 128, + 110, + 127, + 254, + 84, + 126, + 1, + 192, + 116, + 255, + 248, + 15, + 24, + 6, + 231, + 255, + 229, + 71, + 224, + 27, + 15, + 255, + 129, + 121, + 128, + 106, + 255, + 254, + 84, + 238, + 1, + 176, + 255, + 248, + 23, + 152, + 6, + 175, + 255, + 229, + 78, + 224, + 27, + 15, + 255, + 129, + 121, + 128, + 106, + 255, + 254, + 84, + 238, + 1, + 176, + 255, + 248, + 23, + 152, + 6, + 175, + 255, + 229, + 78, + 224, + 26, + 255, + 255, + 129, + 123, + 128, + 106, + 255, + 254, + 92, + 134, + 1, + 161, + 255, + 249, + 114, + 184, + 6, + 135, + 255, + 229, + 202, + 224, + 26, + 31, + 255, + 151, + 43, + 128, + 104, + 127, + 254, + 92, + 174, + 1, + 151, + 255, + 227, + 0, + 196, + 127, + 255, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 168, + 79, + 128, + 0 + ], + "labels": [ + "Cloud" + ] + }, + "id": "PNCeI7jyxe", + "from_name": "labels_1", + "to_name": "image_1", + "type": "labels", + "origin": "manual" + }, + { + "original_width": 3000, + "original_height": 2860, + "image_rotation": 0, + "value": { + "format": "rle", + "rle": [ + 2, + 11, + 174, + 128, + 57, + 27, + 255, + 4, + 55, + 0, + 224, + 70, + 127, + 252, + 178, + 172, + 3, + 129, + 25, + 255, + 242, + 201, + 176, + 14, + 4, + 135, + 255, + 203, + 37, + 192, + 56, + 18, + 63, + 255, + 44, + 151, + 0, + 224, + 72, + 255, + 252, + 178, + 92, + 3, + 129, + 35, + 255, + 242, + 201, + 112, + 14, + 4, + 143, + 255, + 203, + 37, + 192, + 56, + 18, + 63, + 255, + 44, + 151, + 0, + 224, + 72, + 255, + 252, + 178, + 92, + 3, + 129, + 35, + 255, + 242, + 201, + 112, + 14, + 4, + 143, + 255, + 203, + 37, + 192, + 56, + 18, + 63, + 255, + 44, + 131, + 0, + 224, + 75, + 127, + 252, + 178, + 12, + 3, + 129, + 45, + 255, + 242, + 200, + 48, + 14, + 4, + 183, + 255, + 203, + 32, + 192, + 56, + 18, + 223, + 255, + 44, + 131, + 0, + 224, + 75, + 127, + 252, + 178, + 12, + 3, + 129, + 45, + 255, + 242, + 200, + 48, + 14, + 4, + 183, + 255, + 203, + 32, + 192, + 56, + 18, + 223, + 255, + 44, + 131, + 0, + 224, + 75, + 127, + 252, + 178, + 12, + 3, + 129, + 45, + 255, + 242, + 200, + 48, + 14, + 4, + 183, + 255, + 203, + 32, + 192, + 56, + 18, + 223, + 255, + 44, + 131, + 0, + 224, + 75, + 127, + 252, + 178, + 12, + 3, + 129, + 45, + 255, + 242, + 200, + 48, + 14, + 4, + 183, + 255, + 202, + 215, + 192, + 50, + 255, + 254, + 155, + 0, + 224, + 80, + 127, + 252, + 173, + 124, + 3, + 47, + 255, + 233, + 176, + 14, + 5, + 7, + 255, + 202, + 215, + 192, + 50, + 255, + 254, + 155, + 0, + 224, + 80, + 127, + 252, + 173, + 124, + 3, + 47, + 255, + 233, + 176, + 14, + 5, + 7, + 255, + 202, + 215, + 192, + 50, + 255, + 254, + 155, + 0, + 224, + 80, + 127, + 252, + 173, + 124, + 3, + 129, + 191, + 255, + 242, + 181, + 240, + 14, + 6, + 255, + 255, + 202, + 215, + 192, + 56, + 27, + 255, + 255, + 43, + 95, + 0, + 224, + 111, + 255, + 252, + 173, + 204, + 3, + 129, + 181, + 255, + 242, + 183, + 48, + 14, + 6, + 215, + 255, + 202, + 220, + 192, + 56, + 27, + 95, + 255, + 43, + 115, + 0, + 224, + 109, + 127, + 252, + 173, + 204, + 3, + 129, + 181, + 255, + 242, + 183, + 48, + 14, + 5, + 159, + 255, + 142, + 192, + 50, + 255, + 255, + 43, + 115, + 0, + 224, + 89, + 255, + 248, + 236, + 3, + 47, + 255, + 242, + 183, + 48, + 14, + 5, + 159, + 255, + 142, + 192, + 50, + 255, + 255, + 43, + 115, + 0, + 224, + 89, + 255, + 248, + 236, + 3, + 47, + 255, + 242, + 183, + 48, + 14, + 5, + 159, + 255, + 142, + 192, + 50, + 255, + 255, + 43, + 155, + 0, + 196, + 127, + 241, + 128, + 112, + 39, + 255, + 254, + 88, + 110, + 1, + 136, + 255, + 227, + 0, + 224, + 79, + 255, + 252, + 176, + 220, + 3, + 17, + 255, + 198, + 1, + 192, + 159, + 255, + 249, + 97, + 184, + 6, + 35, + 255, + 140, + 3, + 129, + 63, + 255, + 242, + 195, + 112, + 12, + 71, + 255, + 24, + 7, + 2, + 127, + 255, + 229, + 134, + 224, + 28, + 10, + 239, + 255, + 150, + 17, + 128, + 112, + 43, + 191, + 254, + 88, + 70, + 1, + 192, + 174, + 255, + 249, + 97, + 24, + 7, + 2, + 187, + 255, + 229, + 132, + 96, + 28, + 10, + 239, + 255, + 150, + 17, + 128, + 112, + 44, + 255, + 254, + 88, + 30, + 1, + 192, + 179, + 255, + 249, + 96, + 120, + 7, + 2, + 207, + 255, + 229, + 129, + 224, + 28, + 11, + 63, + 255, + 150, + 7, + 128, + 112, + 44, + 255, + 254, + 87, + 126, + 1, + 192, + 199, + 255, + 249, + 93, + 248, + 7, + 3, + 31, + 255, + 229, + 119, + 224, + 28, + 12, + 127, + 255, + 149, + 223, + 128, + 112, + 49, + 255, + 254, + 87, + 126, + 1, + 192, + 199, + 255, + 249, + 91, + 152, + 7, + 3, + 107, + 255, + 229, + 110, + 96, + 28, + 13, + 175, + 255, + 149, + 185, + 128, + 112, + 54, + 191, + 254, + 86, + 230, + 1, + 192, + 218, + 255, + 249, + 91, + 152, + 7, + 3, + 107, + 255, + 229, + 102, + 224, + 28, + 14, + 159, + 255, + 149, + 155, + 128, + 112, + 58, + 127, + 254, + 86, + 110, + 1, + 192, + 233, + 255, + 249, + 89, + 184, + 7, + 3, + 167, + 255, + 229, + 93, + 96, + 28, + 15, + 207, + 255, + 149, + 117, + 128, + 112, + 63, + 63, + 254, + 85, + 214, + 1, + 192, + 252, + 255, + 249, + 87, + 88, + 7, + 3, + 243, + 255, + 229, + 93, + 96, + 28, + 15, + 207, + 255, + 149, + 79, + 128, + 112, + 67, + 255, + 254, + 85, + 54, + 1, + 193, + 16, + 255, + 249, + 84, + 216, + 7, + 4, + 67, + 255, + 229, + 83, + 96, + 28, + 17, + 15, + 255, + 149, + 77, + 128, + 112, + 68, + 63, + 254, + 85, + 22, + 1, + 193, + 20, + 255, + 249, + 84, + 88, + 7, + 4, + 83, + 255, + 229, + 81, + 96, + 28, + 17, + 79, + 255, + 149, + 69, + 128, + 112, + 69, + 63, + 254, + 85, + 22, + 1, + 193, + 20, + 255, + 249, + 84, + 88, + 7, + 4, + 83, + 255, + 229, + 81, + 96, + 28, + 17, + 79, + 255, + 149, + 69, + 128, + 112, + 69, + 63, + 254, + 85, + 22, + 1, + 193, + 20, + 255, + 249, + 84, + 88, + 7, + 4, + 83, + 255, + 229, + 78, + 224, + 28, + 17, + 159, + 255, + 149, + 59, + 128, + 112, + 70, + 127, + 254, + 84, + 238, + 1, + 193, + 25, + 255, + 249, + 83, + 184, + 7, + 4, + 103, + 255, + 229, + 78, + 224, + 28, + 17, + 143, + 255, + 149, + 61, + 128, + 112, + 54, + 127, + 252, + 118, + 1, + 166, + 255, + 249, + 84, + 248, + 7, + 3, + 103, + 255, + 199, + 96, + 26, + 111, + 255, + 149, + 79, + 128, + 112, + 54, + 127, + 252, + 118, + 1, + 166, + 255, + 249, + 84, + 248, + 7, + 3, + 103, + 255, + 199, + 96, + 26, + 111, + 255, + 149, + 79, + 128, + 112, + 54, + 127, + 252, + 126, + 1, + 164, + 255, + 249, + 85, + 24, + 7, + 3, + 103, + 255, + 229, + 110, + 224, + 28, + 13, + 159, + 255, + 149, + 187, + 128, + 112, + 54, + 127, + 254, + 86, + 238, + 1, + 192, + 217, + 255, + 249, + 90, + 152, + 7, + 3, + 139, + 255, + 229, + 105, + 224, + 28, + 14, + 63, + 255, + 149, + 167, + 128, + 112, + 56, + 255, + 254, + 86, + 158, + 1, + 192, + 227, + 255, + 249, + 90, + 120, + 7, + 3, + 143, + 255, + 229, + 105, + 224, + 28, + 13, + 255, + 255, + 149, + 175, + 128, + 112, + 55, + 255, + 254, + 86, + 190, + 1, + 192, + 223, + 255, + 249, + 90, + 248, + 7, + 3, + 127, + 255, + 229, + 107, + 224, + 28, + 13, + 255, + 255, + 149, + 165, + 128, + 112, + 57, + 63, + 254, + 86, + 150, + 1, + 192, + 228, + 255, + 249, + 90, + 88, + 7, + 3, + 147, + 255, + 229, + 105, + 96, + 28, + 14, + 79, + 255, + 149, + 165, + 128, + 112, + 57, + 63, + 254, + 86, + 110, + 1, + 192, + 228, + 255, + 243, + 152, + 6, + 75, + 255, + 194, + 96, + 25, + 63, + 255, + 149, + 19, + 128, + 112, + 57, + 63, + 252, + 230, + 1, + 146, + 255, + 240, + 152, + 6, + 79, + 255, + 229, + 68, + 224, + 28, + 14, + 79, + 255, + 57, + 128, + 100, + 191, + 252, + 38, + 1, + 147, + 255, + 249, + 81, + 56, + 7, + 3, + 147, + 255, + 206, + 96, + 25, + 47, + 255, + 9, + 128, + 100, + 255, + 254, + 84, + 78, + 1, + 192, + 228, + 255, + 243, + 152, + 6, + 75, + 255, + 194, + 96, + 25, + 63, + 255, + 149, + 19, + 128, + 112, + 55, + 255, + 252, + 190, + 1, + 185, + 255, + 249, + 80, + 184, + 7, + 3, + 127, + 255, + 203, + 224, + 27, + 175, + 255, + 149, + 9, + 128, + 112, + 55, + 255, + 252, + 190, + 1, + 186, + 255, + 249, + 80, + 152, + 7, + 3, + 127, + 255, + 203, + 224, + 27, + 175, + 255, + 149, + 9, + 128, + 112, + 55, + 255, + 252, + 190, + 1, + 186, + 255, + 249, + 80, + 152, + 7, + 3, + 147, + 255, + 201, + 96, + 28, + 4, + 63, + 255, + 148, + 247, + 128, + 112, + 57, + 63, + 252, + 150, + 1, + 192, + 67, + 255, + 249, + 79, + 120, + 7, + 3, + 147, + 255, + 201, + 96, + 28, + 4, + 63, + 255, + 148, + 247, + 128, + 112, + 57, + 63, + 252, + 150, + 1, + 192, + 67, + 255, + 249, + 79, + 120, + 7, + 3, + 147, + 255, + 201, + 96, + 28, + 4, + 63, + 255, + 148, + 247, + 128, + 112, + 57, + 63, + 252, + 110, + 1, + 192, + 82, + 255, + 249, + 78, + 56, + 7, + 3, + 147, + 255, + 198, + 224, + 28, + 5, + 47, + 255, + 148, + 227, + 128, + 112, + 57, + 63, + 252, + 110, + 1, + 192, + 82, + 255, + 249, + 78, + 56, + 7, + 3, + 147, + 255, + 198, + 224, + 28, + 5, + 47, + 255, + 148, + 227, + 128, + 112, + 57, + 191, + 252, + 38, + 1, + 192, + 106, + 255, + 249, + 76, + 24, + 7, + 5, + 99, + 255, + 229, + 47, + 96, + 28, + 21, + 143, + 255, + 148, + 189, + 128, + 112, + 86, + 63, + 254, + 82, + 246, + 1, + 193, + 88, + 255, + 249, + 75, + 216, + 7, + 5, + 119, + 255, + 229, + 44, + 224, + 28, + 21, + 223, + 255, + 148, + 179, + 128, + 112, + 87, + 127, + 254, + 82, + 206, + 1, + 193, + 93, + 255, + 249, + 75, + 56, + 7, + 5, + 119, + 255, + 229, + 42, + 224, + 28, + 22, + 31, + 255, + 148, + 169, + 128, + 112, + 88, + 191, + 254, + 82, + 166, + 1, + 193, + 98, + 255, + 249, + 74, + 152, + 7, + 5, + 139, + 255, + 229, + 42, + 96, + 28, + 22, + 47, + 255, + 148, + 161, + 128, + 112, + 89, + 191, + 254, + 82, + 134, + 1, + 193, + 102, + 255, + 249, + 74, + 24, + 7, + 5, + 155, + 255, + 229, + 40, + 96, + 28, + 22, + 111, + 255, + 148, + 161, + 128, + 112, + 89, + 191, + 254, + 82, + 134, + 1, + 193, + 107, + 255, + 249, + 73, + 120, + 7, + 5, + 175, + 255, + 229, + 37, + 224, + 28, + 22, + 191, + 255, + 148, + 151, + 128, + 112, + 90, + 255, + 254, + 82, + 94, + 1, + 193, + 107, + 255, + 249, + 72, + 216, + 7, + 5, + 215, + 255, + 229, + 32, + 224, + 28, + 23, + 95, + 255, + 148, + 131, + 128, + 112, + 93, + 127, + 254, + 82, + 14, + 1, + 193, + 117, + 255, + 249, + 72, + 56, + 7, + 5, + 215, + 255, + 229, + 27, + 224, + 28, + 24, + 79, + 255, + 148, + 101, + 128, + 112, + 97, + 63, + 254, + 81, + 150, + 1, + 193, + 132, + 255, + 249, + 70, + 88, + 7, + 6, + 19, + 255, + 229, + 25, + 96, + 28, + 24, + 79, + 255, + 148, + 71, + 128, + 112, + 100, + 255, + 254, + 81, + 30, + 1, + 193, + 147, + 255, + 249, + 68, + 120, + 7, + 6, + 79, + 255, + 229, + 17, + 224, + 28, + 25, + 63, + 255, + 148, + 15, + 128, + 112, + 108, + 255, + 254, + 80, + 22, + 1, + 193, + 181, + 255, + 249, + 64, + 56, + 7, + 6, + 215, + 255, + 229, + 0, + 224, + 28, + 27, + 95, + 255, + 148, + 3, + 128, + 112, + 109, + 127, + 254, + 79, + 230, + 1, + 193, + 186, + 255, + 249, + 63, + 152, + 7, + 6, + 235, + 255, + 228, + 254, + 96, + 28, + 27, + 175, + 255, + 147, + 249, + 128, + 112, + 110, + 191, + 254, + 79, + 230, + 1, + 193, + 186, + 255, + 249, + 63, + 24, + 7, + 6, + 251, + 255, + 228, + 251, + 224, + 28, + 27, + 255, + 255, + 147, + 239, + 128, + 112, + 111, + 255, + 254, + 79, + 190, + 1, + 193, + 191, + 255, + 249, + 62, + 248, + 7, + 6, + 255, + 255, + 228, + 250, + 224, + 28, + 28, + 111, + 255, + 147, + 225, + 128, + 112, + 113, + 191, + 254, + 79, + 134, + 1, + 193, + 198, + 255, + 249, + 62, + 24, + 7, + 7, + 27, + 255, + 228, + 248, + 96, + 28, + 28, + 111, + 255, + 147, + 225, + 128, + 112, + 113, + 191, + 254, + 79, + 134, + 1, + 193, + 198, + 255, + 249, + 62, + 24, + 7, + 7, + 27, + 255, + 228, + 248, + 96, + 28, + 28, + 111, + 255, + 147, + 225, + 128, + 112, + 113, + 191, + 254, + 79, + 134, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 29, + 159, + 255, + 147, + 187, + 128, + 112, + 118, + 127, + 254, + 78, + 238, + 1, + 193, + 217, + 255, + 249, + 59, + 184, + 7, + 7, + 103, + 255, + 228, + 238, + 224, + 28, + 29, + 159, + 255, + 147, + 187, + 128, + 112, + 118, + 127, + 254, + 78, + 238, + 1, + 193, + 217, + 255, + 249, + 59, + 184, + 7, + 7, + 103, + 255, + 228, + 238, + 224, + 28, + 29, + 159, + 255, + 147, + 187, + 128, + 112, + 118, + 127, + 254, + 78, + 238, + 1, + 193, + 207, + 255, + 249, + 60, + 248, + 7, + 7, + 63, + 255, + 228, + 243, + 224, + 28, + 28, + 255, + 255, + 147, + 207, + 128, + 112, + 115, + 255, + 254, + 79, + 62, + 1, + 193, + 207, + 255, + 249, + 60, + 248, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 134, + 255, + 241, + 56, + 7, + 6, + 215, + 255, + 216, + 96, + 25, + 31, + 254, + 48, + 13, + 7, + 255, + 201, + 139, + 192, + 48, + 223, + 254, + 39, + 0, + 224, + 218, + 255, + 250, + 252, + 3, + 107, + 255, + 242, + 98, + 176, + 12, + 55, + 255, + 137, + 192, + 56, + 54, + 191, + 254, + 191, + 0, + 218, + 255, + 252, + 152, + 172, + 3, + 13, + 255, + 226, + 112, + 14, + 13, + 175, + 255, + 175, + 192, + 54, + 191, + 255, + 38, + 43, + 0, + 195, + 127, + 248, + 156, + 3, + 131, + 107, + 255, + 235, + 240, + 13, + 175, + 255, + 201, + 138, + 192, + 48, + 223, + 254, + 19, + 0, + 224, + 206, + 127, + 252, + 4, + 76, + 3, + 128, + 143, + 255, + 242, + 96, + 112, + 12, + 55, + 255, + 132, + 192, + 56, + 51, + 159, + 255, + 1, + 19, + 0, + 224, + 35, + 255, + 252, + 152, + 28, + 3, + 13, + 255, + 225, + 48, + 14, + 12, + 231, + 255, + 192, + 68, + 192, + 56, + 8, + 255, + 255, + 38, + 7, + 0, + 195, + 127, + 248, + 76, + 3, + 131, + 57, + 255, + 240, + 17, + 48, + 14, + 2, + 63, + 255, + 201, + 129, + 192, + 48, + 223, + 254, + 19, + 0, + 224, + 206, + 127, + 252, + 4, + 76, + 3, + 128, + 143, + 255, + 242, + 96, + 112, + 14, + 12, + 255, + 255, + 156, + 192, + 51, + 159, + 254, + 39, + 0, + 196, + 127, + 241, + 128, + 112, + 19, + 63, + 254, + 75, + 230, + 1, + 193, + 159, + 255, + 243, + 152, + 6, + 115, + 255, + 196, + 224, + 24, + 143, + 254, + 48, + 14, + 2, + 103, + 255, + 201, + 124, + 192, + 56, + 51, + 255, + 254, + 115, + 0, + 206, + 127, + 248, + 156, + 3, + 17, + 255, + 198, + 1, + 192, + 76, + 255, + 249, + 47, + 152, + 7, + 6, + 127, + 255, + 206, + 96, + 25, + 207, + 255, + 19, + 128, + 112, + 21, + 191, + 254, + 75, + 230, + 1, + 193, + 159, + 255, + 243, + 152, + 6, + 115, + 255, + 196, + 224, + 28, + 5, + 111, + 255, + 146, + 249, + 128, + 112, + 103, + 255, + 252, + 190, + 1, + 192, + 135, + 255, + 249, + 46, + 248, + 7, + 6, + 127, + 255, + 203, + 224, + 28, + 8, + 127, + 255, + 146, + 239, + 128, + 112, + 103, + 255, + 252, + 190, + 1, + 192, + 135, + 255, + 249, + 46, + 248, + 7, + 6, + 127, + 255, + 203, + 224, + 28, + 8, + 127, + 255, + 146, + 239, + 128, + 112, + 103, + 255, + 252, + 190, + 1, + 192, + 135, + 255, + 249, + 46, + 248, + 7, + 6, + 107, + 255, + 206, + 96, + 28, + 10, + 159, + 255, + 129, + 133, + 128, + 99, + 127, + 254, + 68, + 38, + 1, + 193, + 154, + 255, + 243, + 152, + 7, + 2, + 167, + 255, + 224, + 97, + 96, + 24, + 223, + 255, + 145, + 9, + 128, + 112, + 102, + 191, + 252, + 230, + 1, + 192, + 169, + 255, + 248, + 24, + 88, + 6, + 55, + 255, + 228, + 66, + 96, + 28, + 25, + 175, + 255, + 57, + 128, + 112, + 42, + 127, + 254, + 6, + 22, + 1, + 141, + 255, + 249, + 16, + 152, + 7, + 6, + 107, + 255, + 206, + 96, + 28, + 10, + 159, + 255, + 129, + 133, + 128, + 99, + 127, + 254, + 68, + 38, + 1, + 193, + 154, + 255, + 243, + 152, + 7, + 2, + 187, + 255, + 224, + 87, + 96, + 25, + 207, + 255, + 145, + 9, + 128, + 112, + 102, + 191, + 252, + 230, + 1, + 192, + 174, + 255, + 248, + 21, + 216, + 6, + 115, + 255, + 228, + 66, + 96, + 28, + 25, + 175, + 255, + 57, + 128, + 112, + 43, + 191, + 254, + 5, + 118, + 1, + 156, + 255, + 249, + 16, + 152, + 7, + 6, + 107, + 255, + 206, + 96, + 28, + 10, + 239, + 255, + 129, + 93, + 128, + 103, + 63, + 254, + 68, + 38, + 1, + 193, + 154, + 255, + 243, + 152, + 7, + 2, + 187, + 255, + 224, + 87, + 96, + 25, + 207, + 255, + 145, + 9, + 128, + 112, + 102, + 191, + 252, + 230, + 1, + 192, + 174, + 255, + 248, + 20, + 152, + 6, + 175, + 255, + 228, + 63, + 224, + 28, + 25, + 175, + 255, + 57, + 128, + 112, + 43, + 191, + 254, + 5, + 38, + 1, + 171, + 255, + 249, + 15, + 248, + 7, + 6, + 107, + 255, + 206, + 96, + 28, + 10, + 239, + 255, + 129, + 73, + 128, + 106, + 255, + 254, + 67, + 254, + 1, + 193, + 154, + 255, + 243, + 152, + 7, + 2, + 187, + 255, + 224, + 82, + 96, + 26, + 191, + 255, + 144, + 255, + 128, + 112, + 102, + 191, + 252, + 230, + 1, + 192, + 178, + 255, + 248, + 19, + 152, + 6, + 211, + 255, + 228, + 61, + 96, + 28, + 25, + 175, + 255, + 57, + 128, + 112, + 44, + 255, + 254, + 4, + 222, + 1, + 180, + 255, + 249, + 15, + 88, + 7, + 6, + 107, + 255, + 206, + 96, + 28, + 11, + 63, + 255, + 129, + 55, + 128, + 109, + 63, + 254, + 67, + 214, + 1, + 193, + 154, + 255, + 243, + 152, + 7, + 2, + 207, + 255, + 224, + 77, + 224, + 27, + 79, + 255, + 144, + 245, + 128, + 112, + 102, + 191, + 252, + 230, + 1, + 192, + 179, + 255, + 248, + 19, + 120, + 6, + 211, + 255, + 228, + 61, + 96, + 28, + 25, + 175, + 255, + 57, + 128, + 112, + 44, + 255, + 254, + 4, + 182, + 1, + 185, + 255, + 249, + 15, + 88, + 7, + 6, + 107, + 255, + 206, + 96, + 28, + 11, + 63, + 255, + 129, + 45, + 128, + 110, + 127, + 254, + 67, + 214, + 1, + 193, + 154, + 255, + 243, + 152, + 7, + 2, + 207, + 255, + 224, + 75, + 96, + 27, + 159, + 255, + 144, + 245, + 128, + 112, + 102, + 191, + 252, + 230, + 1, + 192, + 179, + 255, + 248, + 18, + 216, + 6, + 231, + 255, + 228, + 61, + 96, + 28, + 25, + 175, + 255, + 57, + 128, + 112, + 44, + 255, + 254, + 4, + 182, + 1, + 185, + 255, + 249, + 15, + 88, + 7, + 6, + 107, + 255, + 203, + 224, + 28, + 11, + 143, + 255, + 129, + 25, + 128, + 112, + 16, + 255, + 254, + 67, + 214, + 1, + 193, + 154, + 255, + 242, + 248, + 7, + 2, + 227, + 255, + 224, + 70, + 96, + 28, + 4, + 63, + 255, + 144, + 245, + 128, + 112, + 102, + 191, + 252, + 190, + 1, + 192, + 184, + 255, + 248, + 17, + 152, + 7, + 1, + 15, + 255, + 228, + 61, + 96, + 28, + 25, + 175, + 255, + 47, + 128, + 112, + 46, + 63, + 254, + 4, + 102, + 1, + 192, + 67, + 255, + 249, + 15, + 88, + 7, + 6, + 107, + 255, + 203, + 224, + 28, + 11, + 143, + 255, + 129, + 25, + 128, + 112, + 16, + 255, + 254, + 67, + 214, + 1, + 193, + 159, + 255, + 242, + 88, + 7, + 2, + 227, + 255, + 224, + 65, + 96, + 28, + 4, + 143, + 255, + 144, + 255, + 128, + 112, + 103, + 255, + 252, + 150, + 1, + 192, + 184, + 255, + 248, + 16, + 88, + 7, + 1, + 35, + 255, + 228, + 63, + 224, + 28, + 25, + 255, + 255, + 37, + 128, + 112, + 46, + 63, + 254, + 4, + 22, + 1, + 192, + 72, + 255, + 249, + 15, + 248, + 7, + 6, + 127, + 255, + 201, + 96, + 28, + 11, + 143, + 255, + 129, + 5, + 128, + 112, + 18, + 63, + 254, + 67, + 254, + 1, + 193, + 159, + 255, + 242, + 88, + 7, + 2, + 227, + 255, + 224, + 65, + 96, + 28, + 4, + 143, + 255, + 144, + 255, + 128, + 112, + 105, + 63, + 252, + 38, + 1, + 192, + 193, + 255, + 248, + 15, + 184, + 7, + 1, + 15, + 255, + 228, + 68, + 224, + 28, + 26, + 79, + 254, + 248, + 7, + 3, + 11, + 255, + 224, + 62, + 224, + 28, + 4, + 63, + 255, + 145, + 19, + 128, + 112, + 105, + 63, + 251, + 224, + 28, + 12, + 47, + 255, + 128, + 251, + 128, + 112, + 16, + 255, + 254, + 68, + 78, + 1, + 193, + 164, + 255, + 239, + 128, + 112, + 48, + 191, + 254, + 3, + 238, + 1, + 192, + 67, + 255, + 249, + 17, + 56, + 7, + 6, + 147, + 255, + 190, + 1, + 192, + 194, + 255, + 248, + 15, + 184, + 7, + 1, + 15, + 255, + 228, + 68, + 224, + 28, + 38, + 191, + 255, + 128, + 251, + 128, + 111, + 255, + 254, + 68, + 110, + 1, + 194, + 107, + 255, + 248, + 15, + 184, + 6, + 255, + 255, + 228, + 70, + 224, + 28, + 38, + 191, + 255, + 128, + 251, + 128, + 111, + 255, + 254, + 68, + 110, + 1, + 194, + 107, + 255, + 248, + 15, + 184, + 6, + 255, + 255, + 228, + 70, + 224, + 28, + 38, + 191, + 255, + 128, + 251, + 128, + 111, + 191, + 254, + 68, + 254, + 1, + 194, + 90, + 255, + 248, + 15, + 184, + 6, + 235, + 255, + 228, + 81, + 224, + 28, + 37, + 175, + 255, + 128, + 251, + 128, + 110, + 191, + 254, + 69, + 30, + 1, + 194, + 90, + 255, + 248, + 15, + 184, + 6, + 235, + 255, + 228, + 81, + 224, + 28, + 37, + 175, + 255, + 128, + 251, + 128, + 110, + 191, + 254, + 69, + 30, + 1, + 194, + 90, + 255, + 248, + 15, + 184, + 6, + 215, + 255, + 228, + 84, + 96, + 28, + 37, + 175, + 255, + 128, + 251, + 128, + 109, + 127, + 254, + 69, + 70, + 1, + 194, + 90, + 255, + 248, + 15, + 184, + 6, + 215, + 255, + 228, + 84, + 96, + 28, + 37, + 175, + 255, + 128, + 251, + 128, + 109, + 127, + 254, + 69, + 70, + 1, + 194, + 90, + 255, + 248, + 15, + 184, + 6, + 215, + 255, + 228, + 86, + 224, + 28, + 37, + 95, + 255, + 128, + 251, + 128, + 109, + 127, + 254, + 69, + 110, + 1, + 194, + 85, + 255, + 248, + 15, + 184, + 6, + 215, + 255, + 228, + 86, + 224, + 28, + 37, + 95, + 255, + 128, + 251, + 128, + 109, + 127, + 254, + 69, + 110, + 1, + 194, + 85, + 255, + 248, + 15, + 184, + 6, + 215, + 255, + 228, + 86, + 224, + 28, + 37, + 95, + 255, + 128, + 251, + 128, + 109, + 127, + 254, + 69, + 110, + 1, + 194, + 90, + 255, + 248, + 14, + 152, + 6, + 251, + 255, + 228, + 84, + 96, + 28, + 37, + 175, + 255, + 128, + 233, + 128, + 111, + 191, + 254, + 69, + 70, + 1, + 194, + 90, + 255, + 248, + 14, + 152, + 6, + 251, + 255, + 228, + 84, + 96, + 28, + 37, + 175, + 255, + 128, + 233, + 128, + 111, + 191, + 254, + 69, + 70, + 1, + 194, + 90, + 255, + 248, + 14, + 152, + 6, + 251, + 255, + 228, + 84, + 96, + 28, + 37, + 175, + 255, + 128, + 223, + 128, + 112, + 16, + 255, + 254, + 69, + 70, + 1, + 194, + 90, + 255, + 248, + 13, + 248, + 7, + 1, + 15, + 255, + 228, + 84, + 96, + 28, + 37, + 175, + 255, + 128, + 223, + 128, + 112, + 16, + 255, + 254, + 69, + 70, + 1, + 194, + 90, + 255, + 248, + 13, + 248, + 7, + 1, + 15, + 255, + 228, + 84, + 96, + 28, + 37, + 175, + 255, + 128, + 223, + 128, + 112, + 16, + 255, + 254, + 69, + 70, + 1, + 194, + 90, + 255, + 248, + 13, + 88, + 7, + 1, + 51, + 255, + 194, + 224, + 26, + 15, + 255, + 144, + 251, + 128, + 112, + 150, + 191, + 254, + 3, + 86, + 1, + 192, + 77, + 255, + 239, + 128, + 104, + 127, + 254, + 67, + 238, + 1, + 194, + 90, + 255, + 248, + 13, + 88, + 7, + 1, + 55, + 255, + 190, + 1, + 161, + 255, + 249, + 15, + 184, + 7, + 9, + 107, + 255, + 224, + 53, + 96, + 28, + 4, + 223, + 254, + 248, + 6, + 135, + 255, + 228, + 62, + 224, + 28, + 37, + 175, + 255, + 128, + 213, + 128, + 112, + 19, + 127, + 251, + 224, + 26, + 31, + 255, + 144, + 251, + 128, + 112, + 151, + 255, + 254, + 3, + 46, + 1, + 192, + 115, + 255, + 249, + 15, + 184, + 7, + 9, + 127, + 255, + 224, + 50, + 224, + 28, + 7, + 63, + 255, + 144, + 251, + 128, + 112, + 151, + 255, + 254, + 3, + 46, + 1, + 192, + 115, + 255, + 249, + 15, + 184, + 7, + 9, + 127, + 255, + 224, + 50, + 224, + 28, + 7, + 63, + 255, + 144, + 251, + 128, + 112, + 151, + 255, + 254, + 3, + 46, + 1, + 192, + 115, + 255, + 249, + 15, + 184, + 7, + 9, + 143, + 255, + 224, + 46, + 96, + 28, + 7, + 143, + 255, + 144, + 251, + 128, + 112, + 152, + 255, + 254, + 2, + 230, + 1, + 192, + 120, + 255, + 249, + 15, + 184, + 7, + 9, + 147, + 255, + 224, + 45, + 224, + 28, + 7, + 143, + 255, + 144, + 251, + 128, + 112, + 153, + 63, + 254, + 2, + 222, + 1, + 192, + 120, + 255, + 249, + 16, + 88, + 7, + 9, + 127, + 255, + 224, + 45, + 224, + 28, + 7, + 143, + 255, + 145, + 5, + 128, + 112, + 151, + 255, + 254, + 2, + 142, + 1, + 192, + 130, + 255, + 249, + 16, + 88, + 7, + 9, + 127, + 255, + 224, + 40, + 224, + 28, + 8, + 47, + 255, + 145, + 5, + 128, + 112, + 151, + 255, + 254, + 2, + 142, + 1, + 192, + 130, + 255, + 249, + 16, + 88, + 7, + 9, + 127, + 255, + 224, + 40, + 224, + 28, + 8, + 47, + 255, + 144, + 241, + 128, + 112, + 156, + 191, + 254, + 2, + 70, + 1, + 192, + 130, + 255, + 249, + 15, + 24, + 7, + 9, + 203, + 255, + 224, + 36, + 96, + 28, + 8, + 47, + 255, + 144, + 241, + 128, + 112, + 156, + 191, + 254, + 2, + 70, + 1, + 192, + 130, + 255, + 249, + 15, + 24, + 7, + 9, + 203, + 255, + 224, + 36, + 96, + 28, + 8, + 47, + 255, + 144, + 241, + 128, + 112, + 156, + 191, + 254, + 2, + 70, + 1, + 192, + 130, + 255, + 249, + 14, + 120, + 7, + 10, + 63, + 255, + 213, + 224, + 28, + 8, + 127, + 255, + 29, + 128, + 106, + 255, + 254, + 2, + 150, + 1, + 170, + 255, + 248, + 247, + 88, + 7, + 10, + 67, + 255, + 213, + 96, + 28, + 8, + 127, + 255, + 29, + 128, + 106, + 255, + 254, + 2, + 142, + 1, + 171, + 255, + 248, + 247, + 88, + 7, + 10, + 67, + 255, + 213, + 96, + 28, + 8, + 127, + 255, + 29, + 128, + 106, + 255, + 254, + 2, + 142, + 1, + 171, + 255, + 248, + 247, + 88, + 7, + 10, + 67, + 255, + 213, + 96, + 28, + 8, + 127, + 255, + 29, + 128, + 106, + 255, + 254, + 2, + 142, + 1, + 171, + 255, + 248, + 247, + 88, + 7, + 10, + 67, + 255, + 213, + 96, + 28, + 8, + 127, + 255, + 29, + 128, + 106, + 255, + 254, + 2, + 142, + 1, + 171, + 255, + 248, + 246, + 56, + 7, + 10, + 119, + 255, + 206, + 224, + 28, + 8, + 207, + 255, + 37, + 128, + 108, + 63, + 253, + 206, + 1, + 190, + 255, + 248, + 246, + 24, + 7, + 10, + 123, + 255, + 206, + 224, + 28, + 8, + 207, + 255, + 37, + 128, + 108, + 63, + 253, + 206, + 1, + 190, + 255, + 248, + 246, + 24, + 7, + 10, + 123, + 255, + 206, + 224, + 28, + 8, + 207, + 255, + 37, + 128, + 108, + 63, + 253, + 206, + 1, + 190, + 255, + 248, + 246, + 24, + 7, + 10, + 123, + 255, + 206, + 224, + 28, + 8, + 207, + 255, + 37, + 128, + 108, + 63, + 253, + 206, + 1, + 190, + 255, + 248, + 246, + 24, + 7, + 10, + 123, + 255, + 206, + 224, + 28, + 8, + 207, + 255, + 37, + 128, + 108, + 63, + 253, + 206, + 1, + 190, + 255, + 248, + 245, + 216, + 7, + 3, + 175, + 255, + 194, + 96, + 28, + 26, + 255, + 255, + 49, + 128, + 112, + 36, + 127, + 252, + 150, + 1, + 176, + 255, + 244, + 56, + 6, + 35, + 255, + 140, + 3, + 128, + 153, + 255, + 240, + 38, + 240, + 13, + 167, + 255, + 198, + 221, + 192, + 56, + 29, + 127, + 254, + 19, + 0, + 224, + 215, + 255, + 249, + 140, + 3, + 129, + 35, + 255, + 228, + 176, + 13, + 135, + 255, + 161, + 192, + 56, + 10, + 223, + 255, + 2, + 111, + 0, + 218, + 127, + 252, + 109, + 220, + 3, + 129, + 97, + 255, + 198, + 1, + 185, + 255, + 240, + 152, + 7, + 6, + 191, + 255, + 204, + 96, + 28, + 9, + 31, + 255, + 37, + 128, + 108, + 63, + 253, + 14, + 1, + 192, + 86, + 255, + 248, + 19, + 120, + 6, + 211, + 255, + 227, + 110, + 224, + 28, + 11, + 15, + 254, + 48, + 13, + 207, + 255, + 132, + 192, + 56, + 53, + 255, + 254, + 99, + 0, + 224, + 72, + 255, + 249, + 44, + 3, + 97, + 255, + 232, + 112, + 14, + 2, + 183, + 255, + 192, + 155, + 192, + 54, + 159, + 255, + 27, + 119, + 0, + 224, + 88, + 127, + 241, + 128, + 110, + 127, + 252, + 38, + 1, + 193, + 175, + 255, + 243, + 24, + 7, + 2, + 71, + 255, + 201, + 96, + 27, + 15, + 255, + 67, + 128, + 112, + 21, + 191, + 254, + 4, + 222, + 1, + 180, + 255, + 248, + 219, + 184, + 7, + 2, + 59, + 255, + 224, + 51, + 96, + 28, + 26, + 175, + 255, + 49, + 128, + 112, + 36, + 127, + 252, + 110, + 1, + 181, + 255, + 243, + 152, + 7, + 1, + 111, + 255, + 224, + 70, + 96, + 28, + 4, + 143, + 255, + 141, + 177, + 128, + 112, + 35, + 191, + 254, + 3, + 54, + 1, + 193, + 170, + 255, + 243, + 24, + 7, + 2, + 71, + 255, + 198, + 224, + 27, + 95, + 255, + 57, + 128, + 112, + 22, + 255, + 254, + 4, + 102, + 1, + 192, + 72, + 255, + 248, + 219, + 24, + 7, + 2, + 59, + 255, + 224, + 51, + 96, + 28, + 26, + 175, + 255, + 49, + 128, + 112, + 36, + 127, + 252, + 110, + 1, + 181, + 255, + 243, + 152, + 7, + 1, + 111, + 255, + 224, + 70, + 96, + 28, + 4, + 143, + 255, + 141, + 177, + 128, + 112, + 35, + 191, + 254, + 3, + 54, + 1, + 193, + 170, + 255, + 243, + 24, + 7, + 2, + 71, + 255, + 198, + 224, + 27, + 95, + 255, + 57, + 128, + 112, + 22, + 255, + 254, + 4, + 102, + 1, + 192, + 72, + 255, + 248, + 219, + 24, + 7, + 2, + 59, + 255, + 224, + 51, + 96, + 28, + 26, + 175, + 255, + 49, + 128, + 112, + 36, + 127, + 252, + 110, + 1, + 180, + 255, + 243, + 184, + 7, + 1, + 111, + 255, + 224, + 70, + 96, + 28, + 4, + 143, + 255, + 141, + 177, + 128, + 112, + 23, + 191, + 254, + 4, + 214, + 1, + 192, + 252, + 255, + 241, + 216, + 7, + 2, + 107, + 255, + 201, + 224, + 28, + 9, + 175, + 255, + 19, + 128, + 106, + 255, + 252, + 118, + 1, + 192, + 135, + 255, + 247, + 216, + 7, + 2, + 107, + 255, + 227, + 96, + 96, + 28, + 5, + 239, + 255, + 129, + 53, + 128, + 112, + 63, + 63, + 252, + 118, + 1, + 192, + 154, + 255, + 242, + 120, + 7, + 2, + 107, + 255, + 196, + 224, + 26, + 191, + 255, + 29, + 128, + 112, + 33, + 255, + 253, + 246, + 1, + 192, + 154, + 255, + 248, + 216, + 24, + 7, + 1, + 123, + 255, + 224, + 77, + 96, + 28, + 15, + 207, + 255, + 29, + 128, + 112, + 38, + 191, + 252, + 158, + 1, + 192, + 154, + 255, + 241, + 56, + 6, + 175, + 255, + 199, + 96, + 28, + 8, + 127, + 255, + 125, + 128, + 112, + 38, + 191, + 254, + 54, + 6, + 1, + 192, + 94, + 255, + 248, + 19, + 88, + 7, + 3, + 243, + 255, + 199, + 96, + 28, + 9, + 175, + 255, + 39, + 128, + 112, + 38, + 191, + 252, + 78, + 1, + 171, + 255, + 241, + 216, + 7, + 2, + 31, + 255, + 223, + 96, + 28, + 9, + 175, + 255, + 141, + 129, + 128, + 112, + 23, + 191, + 254, + 4, + 222, + 1, + 192, + 250, + 255, + 241, + 248, + 7, + 2, + 107, + 255, + 201, + 224, + 28, + 9, + 175, + 255, + 19, + 128, + 106, + 191, + 252, + 126, + 1, + 192, + 135, + 255, + 247, + 216, + 7, + 2, + 107, + 255, + 227, + 96, + 96, + 28, + 5, + 239, + 255, + 129, + 63, + 128, + 112, + 31, + 191, + 252, + 38, + 1, + 192, + 106, + 255, + 242, + 248, + 7, + 2, + 107, + 255, + 199, + 96, + 28, + 36, + 111, + 255, + 141, + 129, + 128, + 112, + 23, + 191, + 254, + 4, + 254, + 1, + 192, + 126, + 255, + 240, + 152, + 7, + 1, + 171, + 255, + 203, + 224, + 28, + 9, + 175, + 255, + 29, + 128, + 112, + 145, + 191, + 254, + 54, + 6, + 1, + 192, + 94, + 255, + 248, + 19, + 248, + 7, + 1, + 251, + 255, + 194, + 96, + 28, + 6, + 159, + 255, + 49, + 128, + 112, + 38, + 191, + 252, + 118, + 1, + 194, + 70, + 255, + 248, + 216, + 24, + 7, + 1, + 123, + 255, + 224, + 79, + 224, + 28, + 7, + 239, + 255, + 9, + 128, + 112, + 26, + 127, + 252, + 198, + 1, + 192, + 154, + 255, + 241, + 216, + 7, + 9, + 27, + 255, + 227, + 96, + 96, + 28, + 5, + 239, + 255, + 129, + 73, + 128, + 112, + 26, + 191, + 252, + 158, + 1, + 192, + 101, + 255, + 243, + 152, + 7, + 2, + 127, + 255, + 194, + 224, + 28, + 37, + 79, + 255, + 141, + 109, + 128, + 112, + 23, + 191, + 254, + 5, + 38, + 1, + 192, + 106, + 255, + 242, + 120, + 7, + 1, + 151, + 255, + 206, + 96, + 28, + 9, + 255, + 255, + 9, + 128, + 112, + 149, + 127, + 254, + 53, + 182, + 1, + 192, + 94, + 255, + 248, + 20, + 152, + 7, + 1, + 171, + 255, + 201, + 224, + 28, + 6, + 95, + 255, + 57, + 128, + 112, + 39, + 255, + 252, + 38, + 1, + 194, + 85, + 255, + 248, + 214, + 216, + 7, + 1, + 123, + 255, + 224, + 82, + 96, + 28, + 6, + 175, + 255, + 39, + 128, + 112, + 25, + 127, + 252, + 230, + 1, + 192, + 159, + 255, + 240, + 152, + 7, + 9, + 87, + 255, + 227, + 91, + 96, + 28, + 5, + 239, + 255, + 129, + 73, + 128, + 112, + 26, + 191, + 252, + 158, + 1, + 192, + 101, + 255, + 243, + 152, + 7, + 2, + 127, + 255, + 194, + 96, + 28, + 37, + 95, + 255, + 141, + 109, + 128, + 112, + 23, + 191, + 254, + 5, + 118, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 131, + 255, + 208, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 23, + 191, + 254, + 5, + 118, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 131, + 255, + 208, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 23, + 191, + 254, + 5, + 118, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 131, + 255, + 208, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 23, + 191, + 254, + 5, + 118, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 131, + 255, + 208, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 23, + 191, + 254, + 5, + 118, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 131, + 255, + 208, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 19, + 255, + 254, + 5, + 238, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 111, + 255, + 211, + 96, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 19, + 255, + 254, + 5, + 238, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 111, + 255, + 211, + 96, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 19, + 255, + 254, + 5, + 238, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 111, + 255, + 211, + 96, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 19, + 255, + 254, + 5, + 238, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 111, + 255, + 211, + 96, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 19, + 255, + 254, + 5, + 238, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 111, + 255, + 211, + 96, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 108, + 191, + 254, + 6, + 254, + 1, + 192, + 81, + 255, + 243, + 184, + 7, + 1, + 91, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 108, + 191, + 254, + 6, + 254, + 1, + 192, + 81, + 255, + 243, + 184, + 7, + 1, + 91, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 108, + 191, + 254, + 6, + 254, + 1, + 192, + 81, + 255, + 243, + 184, + 7, + 1, + 91, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 108, + 191, + 254, + 6, + 254, + 1, + 192, + 81, + 255, + 243, + 184, + 7, + 1, + 91, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 108, + 191, + 254, + 6, + 254, + 1, + 192, + 81, + 255, + 243, + 184, + 7, + 1, + 91, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 107, + 127, + 254, + 7, + 78, + 1, + 192, + 76, + 255, + 244, + 56, + 7, + 1, + 75, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 107, + 127, + 254, + 7, + 78, + 1, + 192, + 76, + 255, + 244, + 56, + 7, + 1, + 75, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 107, + 127, + 254, + 7, + 78, + 1, + 192, + 76, + 255, + 244, + 56, + 7, + 1, + 75, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 107, + 127, + 254, + 7, + 78, + 1, + 192, + 76, + 255, + 244, + 56, + 7, + 1, + 75, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 107, + 127, + 254, + 7, + 78, + 1, + 192, + 76, + 255, + 244, + 88, + 7, + 1, + 71, + 255, + 213, + 224, + 24, + 143, + 254, + 48, + 14, + 23, + 175, + 255, + 198, + 177, + 192, + 53, + 31, + 255, + 3, + 187, + 0, + 224, + 33, + 255, + 250, + 252, + 3, + 128, + 145, + 255, + 239, + 176, + 14, + 23, + 143, + 255, + 198, + 177, + 192, + 53, + 31, + 255, + 3, + 187, + 0, + 224, + 33, + 255, + 250, + 252, + 3, + 128, + 145, + 255, + 239, + 176, + 14, + 23, + 143, + 255, + 198, + 177, + 192, + 53, + 31, + 255, + 3, + 187, + 0, + 224, + 33, + 255, + 250, + 252, + 3, + 128, + 145, + 255, + 239, + 176, + 14, + 23, + 143, + 255, + 198, + 177, + 192, + 53, + 31, + 255, + 3, + 187, + 0, + 224, + 33, + 255, + 250, + 252, + 3, + 128, + 145, + 255, + 239, + 176, + 14, + 23, + 143, + 255, + 198, + 177, + 192, + 53, + 31, + 255, + 3, + 187, + 0, + 224, + 33, + 127, + 251, + 28, + 3, + 128, + 143, + 255, + 239, + 176, + 14, + 23, + 143, + 255, + 198, + 177, + 192, + 52, + 127, + 255, + 3, + 223, + 0, + 221, + 127, + 251, + 236, + 3, + 115, + 255, + 238, + 176, + 14, + 23, + 175, + 255, + 198, + 182, + 192, + 52, + 127, + 255, + 3, + 223, + 0, + 221, + 127, + 251, + 236, + 3, + 115, + 255, + 238, + 176, + 14, + 23, + 175, + 255, + 198, + 182, + 192, + 52, + 127, + 255, + 3, + 223, + 0, + 221, + 127, + 251, + 236, + 3, + 115, + 255, + 238, + 176, + 14, + 23, + 175, + 255, + 198, + 182, + 192, + 52, + 127, + 255, + 3, + 223, + 0, + 221, + 127, + 251, + 236, + 3, + 115, + 255, + 238, + 176, + 14, + 23, + 175, + 255, + 198, + 182, + 192, + 52, + 127, + 255, + 3, + 171, + 0, + 224, + 33, + 127, + 252, + 4, + 140, + 3, + 105, + 255, + 238, + 176, + 14, + 16, + 215, + 255, + 137, + 192, + 52, + 223, + 254, + 75, + 0, + 224, + 75, + 127, + 252, + 107, + 108, + 3, + 71, + 255, + 240, + 58, + 112, + 14, + 2, + 31, + 255, + 192, + 72, + 192, + 54, + 159, + 254, + 235, + 0, + 225, + 13, + 127, + 248, + 156, + 3, + 77, + 255, + 228, + 176, + 14, + 4, + 183, + 255, + 198, + 182, + 192, + 52, + 127, + 255, + 3, + 167, + 0, + 224, + 33, + 255, + 252, + 4, + 140, + 3, + 105, + 255, + 238, + 176, + 14, + 16, + 215, + 255, + 137, + 192, + 52, + 223, + 254, + 75, + 0, + 224, + 75, + 127, + 252, + 107, + 108, + 3, + 71, + 255, + 240, + 58, + 112, + 14, + 2, + 31, + 255, + 192, + 72, + 192, + 54, + 159, + 254, + 235, + 0, + 225, + 13, + 127, + 248, + 156, + 3, + 77, + 255, + 228, + 176, + 14, + 4, + 183, + 255, + 198, + 182, + 192, + 52, + 127, + 255, + 3, + 167, + 0, + 224, + 33, + 255, + 252, + 4, + 140, + 3, + 105, + 255, + 238, + 176, + 14, + 16, + 215, + 255, + 137, + 192, + 52, + 223, + 254, + 75, + 0, + 224, + 75, + 127, + 252, + 107, + 108, + 3, + 63, + 255, + 240, + 58, + 48, + 14, + 2, + 71, + 255, + 192, + 72, + 192, + 54, + 159, + 255, + 1, + 15, + 0, + 224, + 252, + 255, + 252, + 5, + 188, + 3, + 129, + 45, + 255, + 241, + 173, + 176, + 12, + 255, + 255, + 192, + 232, + 192, + 56, + 9, + 31, + 255, + 1, + 35, + 0, + 218, + 127, + 252, + 4, + 60, + 3, + 131, + 243, + 255, + 240, + 22, + 240, + 14, + 4, + 183, + 255, + 198, + 182, + 192, + 51, + 255, + 255, + 3, + 163, + 0, + 224, + 36, + 127, + 252, + 4, + 140, + 3, + 105, + 255, + 240, + 16, + 240, + 14, + 15, + 207, + 255, + 192, + 91, + 192, + 56, + 18, + 223, + 255, + 26, + 219, + 0, + 207, + 255, + 252, + 14, + 140, + 3, + 128, + 145, + 255, + 240, + 18, + 48, + 13, + 167, + 255, + 192, + 67, + 192, + 56, + 63, + 63, + 255, + 1, + 111, + 0, + 224, + 75, + 127, + 252, + 107, + 108, + 3, + 63, + 255, + 240, + 58, + 48, + 14, + 2, + 71, + 255, + 192, + 72, + 192, + 54, + 159, + 255, + 1, + 15, + 0, + 208, + 255, + 241, + 128, + 112, + 117, + 191, + 254, + 2, + 222, + 1, + 192, + 150, + 255, + 248, + 214, + 216, + 6, + 127, + 255, + 224, + 111, + 96, + 28, + 4, + 223, + 255, + 128, + 165, + 128, + 107, + 255, + 254, + 2, + 30, + 1, + 157, + 255, + 246, + 152, + 6, + 175, + 255, + 194, + 96, + 28, + 22, + 111, + 255, + 128, + 205, + 128, + 112, + 38, + 191, + 254, + 53, + 182, + 1, + 159, + 255, + 248, + 27, + 216, + 7, + 1, + 55, + 255, + 224, + 41, + 96, + 26, + 255, + 255, + 128, + 135, + 128, + 103, + 127, + 253, + 166, + 1, + 171, + 255, + 240, + 152, + 7, + 5, + 155, + 255, + 224, + 51, + 96, + 28, + 9, + 175, + 255, + 141, + 109, + 128, + 103, + 255, + 254, + 6, + 246, + 1, + 192, + 77, + 255, + 248, + 10, + 88, + 6, + 191, + 255, + 224, + 33, + 224, + 25, + 223, + 255, + 105, + 128, + 106, + 255, + 252, + 38, + 1, + 193, + 102, + 255, + 248, + 12, + 216, + 7, + 2, + 107, + 255, + 227, + 91, + 96, + 25, + 255, + 255, + 129, + 189, + 128, + 112, + 19, + 127, + 254, + 2, + 150, + 1, + 175, + 255, + 248, + 8, + 120, + 6, + 119, + 255, + 218, + 96, + 26, + 191, + 255, + 9, + 128, + 112, + 89, + 191, + 254, + 3, + 54, + 1, + 192, + 154, + 255, + 248, + 214, + 216, + 6, + 127, + 255, + 224, + 111, + 96, + 28, + 4, + 223, + 255, + 128, + 165, + 128, + 107, + 255, + 254, + 2, + 38, + 1, + 156, + 255, + 246, + 152, + 6, + 175, + 255, + 194, + 96, + 28, + 22, + 111, + 255, + 128, + 205, + 128, + 112, + 38, + 191, + 254, + 53, + 182, + 1, + 159, + 255, + 248, + 27, + 216, + 7, + 1, + 55, + 255, + 224, + 43, + 224, + 26, + 95, + 255, + 129, + 55, + 128, + 103, + 63, + 252, + 198, + 1, + 193, + 39, + 255, + 241, + 216, + 6, + 155, + 255, + 224, + 53, + 96, + 28, + 9, + 175, + 255, + 141, + 109, + 128, + 103, + 255, + 254, + 6, + 246, + 1, + 192, + 77, + 255, + 248, + 10, + 248, + 6, + 151, + 255, + 224, + 77, + 224, + 25, + 207, + 255, + 49, + 128, + 112, + 73, + 255, + 252, + 118, + 1, + 166, + 255, + 248, + 13, + 88, + 7, + 2, + 107, + 255, + 227, + 91, + 96, + 25, + 255, + 255, + 129, + 189, + 128, + 112, + 19, + 127, + 254, + 2, + 190, + 1, + 165, + 255, + 248, + 19, + 120, + 6, + 115, + 255, + 204, + 96, + 28, + 18, + 127, + 255, + 29, + 128, + 105, + 191, + 254, + 3, + 86, + 1, + 192, + 154, + 255, + 248, + 214, + 216, + 6, + 127, + 255, + 224, + 111, + 96, + 28, + 4, + 223, + 255, + 128, + 175, + 128, + 105, + 127, + 254, + 4, + 222, + 1, + 156, + 255, + 243, + 24, + 7, + 4, + 159, + 255, + 199, + 96, + 26, + 111, + 255, + 128, + 213, + 128, + 112, + 38, + 191, + 254, + 53, + 182, + 1, + 159, + 255, + 248, + 27, + 216, + 7, + 1, + 55, + 255, + 224, + 43, + 224, + 26, + 95, + 255, + 129, + 55, + 128, + 103, + 63, + 252, + 198, + 1, + 193, + 39, + 255, + 241, + 216, + 6, + 155, + 255, + 224, + 53, + 96, + 28, + 9, + 175, + 255, + 141, + 109, + 128, + 103, + 255, + 254, + 6, + 246, + 1, + 192, + 77, + 255, + 248, + 35, + 56, + 6, + 115, + 255, + 206, + 96, + 28, + 8, + 63, + 255, + 125, + 128, + 112, + 19, + 127, + 254, + 5, + 158, + 1, + 192, + 154, + 255, + 248, + 214, + 216, + 6, + 127, + 255, + 224, + 111, + 96, + 28, + 4, + 223, + 255, + 130, + 51, + 128, + 103, + 63, + 252, + 230, + 1, + 192, + 131, + 255, + 247, + 216, + 7, + 1, + 55, + 255, + 224, + 89, + 224, + 28, + 9, + 175, + 255, + 141, + 109, + 128, + 103, + 255, + 254, + 6, + 246, + 1, + 192, + 77, + 255, + 248, + 35, + 56, + 6, + 115, + 255, + 206, + 96, + 28, + 8, + 63, + 255, + 125, + 128, + 112, + 19, + 127, + 254, + 5, + 158, + 1, + 192, + 154, + 255, + 248, + 214, + 216, + 6, + 127, + 255, + 224, + 111, + 96, + 28, + 4, + 223, + 255, + 130, + 51, + 128, + 103, + 63, + 252, + 230, + 1, + 192, + 131, + 255, + 247, + 216, + 7, + 1, + 55, + 255, + 224, + 89, + 224, + 28, + 9, + 175, + 255, + 141, + 109, + 128, + 103, + 255, + 254, + 6, + 246, + 1, + 192, + 77, + 255, + 248, + 35, + 56, + 6, + 115, + 255, + 206, + 224, + 28, + 8, + 47, + 255, + 125, + 128, + 112, + 19, + 127, + 254, + 5, + 158, + 1, + 192, + 154, + 255, + 248, + 214, + 216, + 6, + 127, + 255, + 224, + 111, + 96, + 28, + 4, + 223, + 255, + 130, + 51, + 128, + 103, + 63, + 253, + 54, + 1, + 176, + 255, + 242, + 88, + 6, + 195, + 255, + 224, + 38, + 224, + 26, + 255, + 255, + 129, + 133, + 128, + 112, + 41, + 63, + 254, + 53, + 142, + 1, + 159, + 255, + 248, + 27, + 216, + 7, + 1, + 55, + 255, + 224, + 140, + 224, + 25, + 207, + 255, + 77, + 128, + 108, + 63, + 252, + 150, + 1, + 176, + 255, + 248, + 9, + 184, + 6, + 191, + 255, + 224, + 97, + 96, + 28, + 10, + 79, + 255, + 141, + 99, + 128, + 103, + 255, + 254, + 6, + 246, + 1, + 192, + 77, + 255, + 248, + 35, + 56, + 6, + 115, + 255, + 211, + 96, + 27, + 15, + 255, + 37, + 128, + 108, + 63, + 254, + 2, + 110, + 1, + 175, + 255, + 248, + 24, + 88, + 7, + 2, + 147, + 255, + 227, + 88, + 224, + 25, + 255, + 255, + 129, + 189, + 128, + 112, + 19, + 127, + 254, + 8, + 206, + 1, + 156, + 255, + 244, + 216, + 6, + 195, + 255, + 201, + 96, + 27, + 15, + 255, + 128, + 155, + 128, + 107, + 255, + 254, + 6, + 22, + 1, + 192, + 164, + 255, + 248, + 214, + 56, + 6, + 123, + 255, + 224, + 112, + 96, + 28, + 4, + 207, + 255, + 130, + 51, + 128, + 103, + 63, + 253, + 54, + 1, + 175, + 255, + 242, + 120, + 6, + 195, + 255, + 224, + 38, + 224, + 26, + 255, + 255, + 129, + 133, + 128, + 112, + 41, + 63, + 254, + 53, + 142, + 1, + 154, + 255, + 248, + 29, + 24, + 7, + 1, + 15, + 255, + 224, + 148, + 96, + 24, + 159, + 255, + 95, + 128, + 104, + 127, + 252, + 198, + 1, + 180, + 255, + 248, + 40, + 24, + 7, + 2, + 187, + 255, + 224, + 62, + 224, + 27, + 15, + 255, + 139, + 251, + 128, + 102, + 191, + 254, + 7, + 70, + 1, + 192, + 67, + 255, + 248, + 37, + 24, + 6, + 39, + 255, + 215, + 224, + 26, + 31, + 255, + 49, + 128, + 109, + 63, + 254, + 10, + 6, + 1, + 192, + 174, + 255, + 248, + 15, + 184, + 6, + 195, + 255, + 226, + 254, + 224, + 25, + 175, + 255, + 129, + 209, + 128, + 112, + 16, + 255, + 254, + 9, + 70, + 1, + 136, + 255, + 246, + 24, + 6, + 135, + 255, + 204, + 96, + 27, + 79, + 255, + 130, + 129, + 128, + 112, + 43, + 191, + 254, + 3, + 238, + 1, + 176, + 255, + 248, + 191, + 184, + 6, + 107, + 255, + 224, + 116, + 96, + 28, + 4, + 63, + 255, + 130, + 81, + 128, + 98, + 63, + 253, + 134, + 1, + 161, + 255, + 243, + 24, + 6, + 211, + 255, + 224, + 160, + 96, + 28, + 10, + 239, + 255, + 128, + 251, + 128, + 108, + 63, + 254, + 56, + 14, + 1, + 190, + 255, + 248, + 45, + 152, + 6, + 95, + 255, + 206, + 224, + 27, + 79, + 255, + 130, + 129, + 128, + 112, + 43, + 191, + 254, + 3, + 238, + 1, + 176, + 255, + 248, + 224, + 56, + 6, + 251, + 255, + 224, + 182, + 96, + 25, + 127, + 255, + 59, + 128, + 110, + 127, + 254, + 9, + 222, + 1, + 192, + 174, + 255, + 248, + 15, + 184, + 6, + 235, + 255, + 227, + 123, + 224, + 27, + 239, + 255, + 130, + 217, + 128, + 101, + 255, + 252, + 238, + 1, + 185, + 255, + 248, + 39, + 120, + 7, + 2, + 187, + 255, + 224, + 62, + 224, + 27, + 175, + 255, + 141, + 239, + 128, + 111, + 191, + 254, + 11, + 102, + 1, + 151, + 255, + 243, + 184, + 6, + 231, + 255, + 224, + 157, + 224, + 28, + 10, + 239, + 255, + 128, + 251, + 128, + 110, + 191, + 254, + 55, + 190, + 1, + 190, + 255, + 248, + 45, + 152, + 6, + 95, + 255, + 206, + 224, + 27, + 159, + 255, + 130, + 119, + 128, + 112, + 43, + 191, + 254, + 3, + 238, + 1, + 186, + 255, + 248, + 222, + 248, + 6, + 251, + 255, + 224, + 184, + 224, + 25, + 47, + 255, + 59, + 128, + 110, + 127, + 254, + 9, + 222, + 1, + 192, + 178, + 255, + 248, + 14, + 184, + 6, + 251, + 255, + 227, + 123, + 224, + 27, + 239, + 255, + 130, + 227, + 128, + 100, + 191, + 252, + 238, + 1, + 185, + 255, + 248, + 39, + 120, + 7, + 2, + 207, + 255, + 224, + 58, + 96, + 27, + 239, + 255, + 141, + 239, + 128, + 111, + 191, + 254, + 11, + 142, + 1, + 146, + 255, + 243, + 184, + 6, + 231, + 255, + 224, + 157, + 224, + 28, + 11, + 63, + 255, + 128, + 233, + 128, + 111, + 191, + 254, + 55, + 190, + 1, + 190, + 255, + 248, + 46, + 56, + 6, + 75, + 255, + 206, + 224, + 27, + 159, + 255, + 130, + 119, + 128, + 112, + 44, + 255, + 254, + 3, + 158, + 1, + 191, + 255, + 248, + 222, + 248, + 6, + 251, + 255, + 224, + 184, + 224, + 25, + 47, + 255, + 59, + 128, + 110, + 127, + 254, + 9, + 222, + 1, + 192, + 179, + 255, + 248, + 14, + 120, + 6, + 255, + 255, + 227, + 126, + 96, + 26, + 191, + 255, + 131, + 97, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 192, + 183, + 255, + 248, + 13, + 248, + 7, + 1, + 15, + 255, + 227, + 124, + 96, + 26, + 191, + 255, + 131, + 97, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 192, + 184, + 255, + 248, + 13, + 216, + 7, + 1, + 19, + 255, + 227, + 123, + 224, + 26, + 191, + 255, + 131, + 97, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 192, + 184, + 255, + 248, + 13, + 216, + 7, + 1, + 19, + 255, + 227, + 123, + 224, + 26, + 191, + 255, + 131, + 97, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 192, + 184, + 255, + 248, + 13, + 216, + 7, + 1, + 19, + 255, + 227, + 123, + 224, + 26, + 191, + 255, + 131, + 97, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 192, + 184, + 255, + 248, + 13, + 216, + 7, + 1, + 19, + 255, + 228, + 106, + 96, + 27, + 239, + 255, + 130, + 109, + 128, + 112, + 48, + 127, + 254, + 3, + 46, + 1, + 192, + 68, + 255, + 249, + 26, + 152, + 6, + 251, + 255, + 224, + 155, + 96, + 28, + 12, + 31, + 255, + 128, + 203, + 128, + 112, + 17, + 63, + 254, + 70, + 166, + 1, + 190, + 255, + 248, + 38, + 216, + 7, + 3, + 7, + 255, + 224, + 50, + 224, + 28, + 4, + 79, + 255, + 145, + 169, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 192, + 193, + 255, + 248, + 12, + 184, + 7, + 1, + 19, + 255, + 228, + 106, + 96, + 27, + 239, + 255, + 130, + 109, + 128, + 112, + 48, + 127, + 254, + 3, + 46, + 1, + 192, + 68, + 255, + 249, + 26, + 152, + 7, + 1, + 11, + 255, + 224, + 153, + 96, + 28, + 16, + 15, + 255, + 69, + 128, + 112, + 18, + 63, + 254, + 70, + 166, + 1, + 192, + 67, + 255, + 248, + 38, + 56, + 7, + 4, + 7, + 255, + 208, + 224, + 28, + 4, + 143, + 255, + 145, + 169, + 128, + 112, + 16, + 255, + 254, + 9, + 142, + 1, + 193, + 1, + 255, + 244, + 56, + 7, + 1, + 35, + 255, + 228, + 106, + 96, + 28, + 4, + 63, + 255, + 130, + 99, + 128, + 112, + 64, + 127, + 253, + 14, + 1, + 192, + 72, + 255, + 249, + 26, + 152, + 7, + 1, + 15, + 255, + 224, + 152, + 224, + 28, + 16, + 31, + 255, + 67, + 128, + 112, + 18, + 63, + 254, + 70, + 166, + 1, + 192, + 67, + 255, + 248, + 38, + 56, + 7, + 4, + 83, + 255, + 199, + 96, + 28, + 4, + 207, + 255, + 145, + 161, + 128, + 112, + 16, + 255, + 254, + 9, + 142, + 1, + 193, + 20, + 255, + 241, + 216, + 7, + 1, + 51, + 255, + 228, + 104, + 96, + 28, + 4, + 63, + 255, + 130, + 99, + 128, + 112, + 69, + 63, + 252, + 118, + 1, + 192, + 76, + 255, + 249, + 26, + 24, + 7, + 1, + 15, + 255, + 224, + 152, + 224, + 28, + 17, + 79, + 255, + 29, + 128, + 112, + 19, + 63, + 254, + 70, + 134, + 1, + 192, + 67, + 255, + 248, + 38, + 56, + 7, + 4, + 83, + 255, + 199, + 96, + 28, + 4, + 207, + 255, + 145, + 161, + 128, + 112, + 16, + 255, + 254, + 9, + 142, + 1, + 193, + 117, + 255, + 249, + 25, + 120, + 7, + 1, + 15, + 255, + 224, + 152, + 224, + 28, + 23, + 95, + 255, + 145, + 151, + 128, + 112, + 16, + 255, + 254, + 9, + 142, + 1, + 193, + 117, + 255, + 249, + 25, + 120, + 7, + 1, + 15, + 255, + 224, + 152, + 224, + 28, + 23, + 95, + 255, + 145, + 151, + 128, + 112, + 16, + 191, + 254, + 9, + 150, + 1, + 193, + 117, + 255, + 249, + 25, + 120, + 6, + 251, + 255, + 224, + 155, + 96, + 28, + 23, + 95, + 255, + 145, + 151, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 193, + 117, + 255, + 249, + 25, + 120, + 6, + 251, + 255, + 224, + 155, + 96, + 28, + 23, + 95, + 255, + 145, + 151, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 193, + 117, + 255, + 249, + 25, + 120, + 6, + 231, + 255, + 224, + 164, + 224, + 28, + 22, + 127, + 255, + 145, + 151, + 128, + 110, + 127, + 254, + 10, + 78, + 1, + 193, + 103, + 255, + 249, + 25, + 120, + 6, + 231, + 255, + 224, + 164, + 224, + 28, + 22, + 127, + 255, + 145, + 151, + 128, + 110, + 127, + 254, + 10, + 78, + 1, + 193, + 103, + 255, + 249, + 25, + 120, + 6, + 231, + 255, + 224, + 165, + 96, + 28, + 22, + 111, + 255, + 145, + 151, + 128, + 106, + 191, + 254, + 10, + 238, + 1, + 191, + 255, + 239, + 128, + 112, + 74, + 63, + 254, + 70, + 14, + 1, + 170, + 255, + 248, + 43, + 184, + 6, + 255, + 255, + 190, + 1, + 193, + 40, + 255, + 249, + 24, + 56, + 6, + 171, + 255, + 224, + 174, + 224, + 27, + 255, + 254, + 248, + 7, + 4, + 163, + 255, + 228, + 96, + 224, + 26, + 175, + 255, + 130, + 187, + 128, + 111, + 255, + 251, + 224, + 28, + 18, + 143, + 255, + 145, + 131, + 128, + 106, + 191, + 254, + 10, + 238, + 1, + 190, + 255, + 240, + 152, + 7, + 4, + 163, + 255, + 228, + 101, + 96, + 25, + 207, + 255, + 130, + 207, + 128, + 106, + 255, + 253, + 166, + 1, + 193, + 6, + 255, + 249, + 25, + 88, + 6, + 115, + 255, + 224, + 179, + 224, + 26, + 191, + 255, + 105, + 128, + 112, + 65, + 191, + 254, + 70, + 86, + 1, + 156, + 255, + 248, + 44, + 248, + 6, + 175, + 255, + 218, + 96, + 28, + 16, + 111, + 255, + 145, + 149, + 128, + 103, + 63, + 254, + 11, + 62, + 1, + 171, + 255, + 246, + 152, + 7, + 4, + 27, + 255, + 228, + 101, + 96, + 25, + 207, + 255, + 130, + 207, + 128, + 106, + 255, + 253, + 174, + 1, + 193, + 5, + 255, + 249, + 75, + 56, + 6, + 75, + 255, + 224, + 43, + 224, + 28, + 15, + 47, + 255, + 148, + 179, + 128, + 100, + 191, + 254, + 2, + 190, + 1, + 192, + 242, + 255, + 249, + 75, + 56, + 6, + 75, + 255, + 224, + 43, + 224, + 28, + 15, + 47, + 255, + 148, + 179, + 128, + 100, + 191, + 254, + 2, + 190, + 1, + 192, + 242, + 255, + 249, + 75, + 56, + 6, + 75, + 255, + 224, + 43, + 224, + 28, + 15, + 47, + 255, + 149, + 157, + 128, + 112, + 58, + 63, + 254, + 86, + 118, + 1, + 192, + 232, + 255, + 249, + 89, + 216, + 7, + 3, + 163, + 255, + 229, + 103, + 96, + 28, + 14, + 143, + 255, + 149, + 157, + 128, + 112, + 58, + 63, + 254, + 86, + 150, + 1, + 192, + 228, + 255, + 249, + 90, + 88, + 7, + 3, + 147, + 255, + 229, + 105, + 224, + 28, + 14, + 63, + 255, + 149, + 167, + 128, + 112, + 56, + 255, + 254, + 86, + 158, + 1, + 192, + 227, + 255, + 249, + 92, + 216, + 7, + 2, + 111, + 255, + 198, + 224, + 24, + 159, + 255, + 9, + 128, + 99, + 127, + 254, + 87, + 134, + 1, + 192, + 155, + 255, + 241, + 184, + 6, + 39, + 255, + 194, + 96, + 24, + 223, + 255, + 149, + 225, + 128, + 112, + 38, + 191, + 252, + 118, + 1, + 137, + 255, + 240, + 152, + 6, + 55, + 255, + 229, + 120, + 96, + 28, + 9, + 175, + 255, + 29, + 128, + 98, + 127, + 252, + 38, + 1, + 141, + 255, + 249, + 102, + 152, + 7, + 1, + 55, + 255, + 229, + 180, + 224, + 28, + 4, + 223, + 255, + 150, + 211, + 128, + 112, + 19, + 127, + 254, + 91, + 78, + 1, + 192, + 77, + 255, + 249, + 109, + 56, + 7, + 1, + 55, + 255, + 229, + 185, + 224, + 28, + 4, + 63, + 255, + 150, + 231, + 128, + 112, + 16, + 255, + 254, + 91, + 158, + 1, + 192, + 67, + 255, + 249, + 110, + 120, + 7, + 1, + 15, + 255, + 229, + 185, + 224, + 28, + 4, + 63, + 255, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 30, + 121, + 44, + 0 + ] + }, + "id": "zhJYp7Ak94", + "from_name": "magicwand_tool_1", + "to_name": "image_1", + "type": "magicwand", + "origin": "manual" + }, + { + "original_width": 3000, + "original_height": 2860, + "image_rotation": 0, + "value": { + "format": "rle", + "rle": [ + 2, + 11, + 174, + 128, + 57, + 27, + 255, + 4, + 55, + 0, + 224, + 70, + 127, + 252, + 178, + 172, + 3, + 129, + 25, + 255, + 242, + 201, + 176, + 14, + 4, + 135, + 255, + 203, + 37, + 192, + 56, + 18, + 63, + 255, + 44, + 151, + 0, + 224, + 72, + 255, + 252, + 178, + 92, + 3, + 129, + 35, + 255, + 242, + 201, + 112, + 14, + 4, + 143, + 255, + 203, + 37, + 192, + 56, + 18, + 63, + 255, + 44, + 151, + 0, + 224, + 72, + 255, + 252, + 178, + 92, + 3, + 129, + 35, + 255, + 242, + 201, + 112, + 14, + 4, + 143, + 255, + 203, + 37, + 192, + 56, + 18, + 63, + 255, + 44, + 131, + 0, + 224, + 75, + 127, + 252, + 178, + 12, + 3, + 129, + 45, + 255, + 242, + 200, + 48, + 14, + 4, + 183, + 255, + 203, + 32, + 192, + 56, + 18, + 223, + 255, + 44, + 131, + 0, + 224, + 75, + 127, + 252, + 178, + 12, + 3, + 129, + 45, + 255, + 242, + 200, + 48, + 14, + 4, + 183, + 255, + 203, + 32, + 192, + 56, + 18, + 223, + 255, + 44, + 131, + 0, + 224, + 75, + 127, + 252, + 178, + 12, + 3, + 129, + 45, + 255, + 242, + 200, + 48, + 14, + 4, + 183, + 255, + 203, + 32, + 192, + 56, + 18, + 223, + 255, + 44, + 131, + 0, + 224, + 75, + 127, + 252, + 178, + 12, + 3, + 129, + 45, + 255, + 242, + 200, + 48, + 14, + 4, + 183, + 255, + 202, + 215, + 192, + 50, + 255, + 254, + 155, + 0, + 224, + 80, + 127, + 252, + 173, + 124, + 3, + 47, + 255, + 233, + 176, + 14, + 5, + 7, + 255, + 202, + 215, + 192, + 50, + 255, + 254, + 155, + 0, + 224, + 80, + 127, + 252, + 173, + 124, + 3, + 47, + 255, + 233, + 176, + 14, + 5, + 7, + 255, + 202, + 215, + 192, + 50, + 255, + 254, + 155, + 0, + 224, + 80, + 127, + 252, + 173, + 124, + 3, + 129, + 191, + 255, + 242, + 181, + 240, + 14, + 6, + 255, + 255, + 202, + 215, + 192, + 56, + 27, + 255, + 255, + 43, + 95, + 0, + 224, + 111, + 255, + 252, + 173, + 204, + 3, + 129, + 181, + 255, + 242, + 183, + 48, + 14, + 6, + 215, + 255, + 202, + 220, + 192, + 56, + 27, + 95, + 255, + 43, + 115, + 0, + 224, + 109, + 127, + 252, + 173, + 204, + 3, + 129, + 181, + 255, + 242, + 183, + 48, + 14, + 5, + 159, + 255, + 142, + 192, + 50, + 255, + 255, + 43, + 115, + 0, + 224, + 89, + 255, + 248, + 236, + 3, + 47, + 255, + 242, + 183, + 48, + 14, + 5, + 159, + 255, + 142, + 192, + 50, + 255, + 255, + 43, + 115, + 0, + 224, + 89, + 255, + 248, + 236, + 3, + 47, + 255, + 242, + 183, + 48, + 14, + 5, + 159, + 255, + 142, + 192, + 50, + 255, + 255, + 43, + 155, + 0, + 196, + 127, + 241, + 128, + 112, + 39, + 255, + 254, + 88, + 110, + 1, + 136, + 255, + 227, + 0, + 224, + 79, + 255, + 252, + 176, + 220, + 3, + 17, + 255, + 198, + 1, + 192, + 159, + 255, + 249, + 97, + 184, + 6, + 35, + 255, + 140, + 3, + 129, + 63, + 255, + 242, + 195, + 112, + 12, + 71, + 255, + 24, + 7, + 2, + 127, + 255, + 229, + 134, + 224, + 28, + 10, + 239, + 255, + 150, + 17, + 128, + 112, + 43, + 191, + 254, + 88, + 70, + 1, + 192, + 174, + 255, + 249, + 97, + 24, + 7, + 2, + 187, + 255, + 229, + 132, + 96, + 28, + 10, + 239, + 255, + 150, + 17, + 128, + 112, + 44, + 255, + 254, + 88, + 30, + 1, + 192, + 179, + 255, + 249, + 96, + 120, + 7, + 2, + 207, + 255, + 229, + 129, + 224, + 28, + 11, + 63, + 255, + 150, + 7, + 128, + 112, + 44, + 255, + 254, + 87, + 126, + 1, + 192, + 199, + 255, + 249, + 93, + 248, + 7, + 3, + 31, + 255, + 229, + 119, + 224, + 28, + 12, + 127, + 255, + 149, + 223, + 128, + 112, + 49, + 255, + 254, + 87, + 126, + 1, + 192, + 199, + 255, + 249, + 91, + 152, + 7, + 3, + 107, + 255, + 229, + 110, + 96, + 28, + 13, + 175, + 255, + 149, + 185, + 128, + 112, + 54, + 191, + 254, + 86, + 230, + 1, + 192, + 218, + 255, + 249, + 91, + 152, + 7, + 3, + 107, + 255, + 229, + 102, + 224, + 28, + 14, + 159, + 255, + 149, + 155, + 128, + 112, + 58, + 127, + 254, + 86, + 110, + 1, + 192, + 233, + 255, + 249, + 89, + 184, + 7, + 3, + 167, + 255, + 229, + 93, + 96, + 28, + 15, + 207, + 255, + 149, + 117, + 128, + 112, + 63, + 63, + 254, + 85, + 214, + 1, + 192, + 252, + 255, + 249, + 87, + 88, + 7, + 3, + 243, + 255, + 229, + 93, + 96, + 28, + 15, + 207, + 255, + 149, + 79, + 128, + 112, + 67, + 255, + 254, + 85, + 54, + 1, + 193, + 16, + 255, + 249, + 84, + 216, + 7, + 4, + 67, + 255, + 229, + 83, + 96, + 28, + 17, + 15, + 255, + 149, + 77, + 128, + 112, + 68, + 63, + 254, + 85, + 22, + 1, + 193, + 20, + 255, + 249, + 84, + 88, + 7, + 4, + 83, + 255, + 229, + 81, + 96, + 28, + 17, + 79, + 255, + 149, + 69, + 128, + 112, + 69, + 63, + 254, + 85, + 22, + 1, + 193, + 20, + 255, + 249, + 84, + 88, + 7, + 4, + 83, + 255, + 229, + 81, + 96, + 28, + 17, + 79, + 255, + 149, + 69, + 128, + 112, + 69, + 63, + 254, + 85, + 22, + 1, + 193, + 20, + 255, + 249, + 84, + 88, + 7, + 4, + 83, + 255, + 229, + 78, + 224, + 28, + 17, + 159, + 255, + 149, + 59, + 128, + 112, + 70, + 127, + 254, + 84, + 238, + 1, + 193, + 25, + 255, + 249, + 83, + 184, + 7, + 4, + 103, + 255, + 229, + 78, + 224, + 28, + 17, + 143, + 255, + 149, + 61, + 128, + 112, + 54, + 127, + 252, + 118, + 1, + 166, + 255, + 249, + 84, + 248, + 7, + 3, + 103, + 255, + 199, + 96, + 26, + 111, + 255, + 149, + 79, + 128, + 112, + 54, + 127, + 252, + 118, + 1, + 166, + 255, + 249, + 84, + 248, + 7, + 3, + 103, + 255, + 199, + 96, + 26, + 111, + 255, + 149, + 79, + 128, + 112, + 54, + 127, + 252, + 126, + 1, + 164, + 255, + 249, + 85, + 24, + 7, + 3, + 103, + 255, + 229, + 110, + 224, + 28, + 13, + 159, + 255, + 149, + 187, + 128, + 112, + 54, + 127, + 254, + 86, + 238, + 1, + 192, + 217, + 255, + 249, + 90, + 152, + 7, + 3, + 139, + 255, + 229, + 105, + 224, + 28, + 14, + 63, + 255, + 149, + 167, + 128, + 112, + 56, + 255, + 254, + 86, + 158, + 1, + 192, + 227, + 255, + 249, + 90, + 120, + 7, + 3, + 143, + 255, + 229, + 105, + 224, + 28, + 13, + 255, + 255, + 149, + 175, + 128, + 112, + 55, + 255, + 254, + 86, + 190, + 1, + 192, + 223, + 255, + 249, + 90, + 248, + 7, + 3, + 127, + 255, + 229, + 107, + 224, + 28, + 13, + 255, + 255, + 149, + 165, + 128, + 112, + 57, + 63, + 254, + 86, + 150, + 1, + 192, + 228, + 255, + 249, + 90, + 88, + 7, + 3, + 147, + 255, + 229, + 105, + 96, + 28, + 14, + 79, + 255, + 149, + 165, + 128, + 112, + 57, + 63, + 254, + 86, + 110, + 1, + 192, + 228, + 255, + 243, + 152, + 6, + 75, + 255, + 194, + 96, + 25, + 63, + 255, + 149, + 19, + 128, + 112, + 57, + 63, + 252, + 230, + 1, + 146, + 255, + 240, + 152, + 6, + 79, + 255, + 229, + 68, + 224, + 28, + 14, + 79, + 255, + 57, + 128, + 100, + 191, + 252, + 38, + 1, + 147, + 255, + 249, + 81, + 56, + 7, + 3, + 147, + 255, + 206, + 96, + 25, + 47, + 255, + 9, + 128, + 100, + 255, + 254, + 84, + 78, + 1, + 192, + 228, + 255, + 243, + 152, + 6, + 75, + 255, + 194, + 96, + 25, + 63, + 255, + 149, + 19, + 128, + 112, + 55, + 255, + 252, + 190, + 1, + 185, + 255, + 249, + 80, + 184, + 7, + 3, + 127, + 255, + 203, + 224, + 27, + 175, + 255, + 149, + 9, + 128, + 112, + 55, + 255, + 252, + 190, + 1, + 186, + 255, + 249, + 80, + 152, + 7, + 3, + 127, + 255, + 203, + 224, + 27, + 175, + 255, + 149, + 9, + 128, + 112, + 55, + 255, + 252, + 190, + 1, + 186, + 255, + 249, + 80, + 152, + 7, + 3, + 147, + 255, + 201, + 96, + 28, + 4, + 63, + 255, + 148, + 247, + 128, + 112, + 57, + 63, + 252, + 150, + 1, + 192, + 67, + 255, + 249, + 79, + 120, + 7, + 3, + 147, + 255, + 201, + 96, + 28, + 4, + 63, + 255, + 148, + 247, + 128, + 112, + 57, + 63, + 252, + 150, + 1, + 192, + 67, + 255, + 249, + 79, + 120, + 7, + 3, + 147, + 255, + 201, + 96, + 28, + 4, + 63, + 255, + 148, + 247, + 128, + 112, + 57, + 63, + 252, + 110, + 1, + 192, + 82, + 255, + 249, + 78, + 56, + 7, + 3, + 147, + 255, + 198, + 224, + 28, + 5, + 47, + 255, + 148, + 227, + 128, + 112, + 57, + 63, + 252, + 110, + 1, + 192, + 82, + 255, + 249, + 78, + 56, + 7, + 3, + 147, + 255, + 198, + 224, + 28, + 5, + 47, + 255, + 148, + 227, + 128, + 112, + 57, + 191, + 252, + 38, + 1, + 192, + 106, + 255, + 249, + 76, + 24, + 7, + 5, + 99, + 255, + 229, + 47, + 96, + 28, + 21, + 143, + 255, + 148, + 189, + 128, + 112, + 86, + 63, + 254, + 82, + 246, + 1, + 193, + 88, + 255, + 249, + 75, + 216, + 7, + 5, + 119, + 255, + 229, + 44, + 224, + 28, + 21, + 223, + 255, + 148, + 179, + 128, + 112, + 87, + 127, + 254, + 82, + 206, + 1, + 193, + 93, + 255, + 249, + 75, + 56, + 7, + 5, + 119, + 255, + 229, + 42, + 224, + 28, + 22, + 31, + 255, + 148, + 169, + 128, + 112, + 88, + 191, + 254, + 82, + 166, + 1, + 193, + 98, + 255, + 249, + 74, + 152, + 7, + 5, + 139, + 255, + 229, + 42, + 96, + 28, + 22, + 47, + 255, + 148, + 161, + 128, + 112, + 89, + 191, + 254, + 82, + 134, + 1, + 193, + 102, + 255, + 249, + 74, + 24, + 7, + 5, + 155, + 255, + 229, + 40, + 96, + 28, + 22, + 111, + 255, + 148, + 161, + 128, + 112, + 89, + 191, + 254, + 82, + 134, + 1, + 193, + 107, + 255, + 249, + 73, + 120, + 7, + 5, + 175, + 255, + 229, + 37, + 224, + 28, + 22, + 191, + 255, + 148, + 151, + 128, + 112, + 90, + 255, + 254, + 82, + 94, + 1, + 193, + 107, + 255, + 249, + 72, + 216, + 7, + 5, + 215, + 255, + 229, + 32, + 224, + 28, + 23, + 95, + 255, + 148, + 131, + 128, + 112, + 93, + 127, + 254, + 82, + 14, + 1, + 193, + 117, + 255, + 249, + 72, + 56, + 7, + 5, + 215, + 255, + 229, + 27, + 224, + 28, + 24, + 79, + 255, + 148, + 101, + 128, + 112, + 97, + 63, + 254, + 81, + 150, + 1, + 193, + 132, + 255, + 249, + 70, + 88, + 7, + 6, + 19, + 255, + 229, + 25, + 96, + 28, + 24, + 79, + 255, + 148, + 71, + 128, + 112, + 100, + 255, + 254, + 81, + 30, + 1, + 193, + 147, + 255, + 249, + 68, + 120, + 7, + 6, + 79, + 255, + 229, + 17, + 224, + 28, + 25, + 63, + 255, + 148, + 15, + 128, + 112, + 108, + 255, + 254, + 80, + 22, + 1, + 193, + 181, + 255, + 249, + 64, + 56, + 7, + 6, + 215, + 255, + 229, + 0, + 224, + 28, + 27, + 95, + 255, + 148, + 3, + 128, + 112, + 109, + 127, + 254, + 79, + 230, + 1, + 193, + 186, + 255, + 249, + 63, + 152, + 7, + 6, + 235, + 255, + 228, + 254, + 96, + 28, + 27, + 175, + 255, + 147, + 249, + 128, + 112, + 110, + 191, + 254, + 79, + 230, + 1, + 193, + 186, + 255, + 249, + 63, + 24, + 7, + 6, + 251, + 255, + 228, + 251, + 224, + 28, + 27, + 255, + 255, + 147, + 239, + 128, + 112, + 111, + 255, + 254, + 79, + 190, + 1, + 193, + 191, + 255, + 249, + 62, + 248, + 7, + 6, + 255, + 255, + 228, + 250, + 224, + 28, + 28, + 111, + 255, + 147, + 225, + 128, + 112, + 113, + 191, + 254, + 79, + 134, + 1, + 193, + 198, + 255, + 249, + 62, + 24, + 7, + 7, + 27, + 255, + 228, + 248, + 96, + 28, + 28, + 111, + 255, + 147, + 225, + 128, + 112, + 113, + 191, + 254, + 79, + 134, + 1, + 193, + 198, + 255, + 249, + 62, + 24, + 7, + 7, + 27, + 255, + 228, + 248, + 96, + 28, + 28, + 111, + 255, + 147, + 225, + 128, + 112, + 113, + 191, + 254, + 79, + 134, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 29, + 159, + 255, + 147, + 187, + 128, + 112, + 118, + 127, + 254, + 78, + 238, + 1, + 193, + 217, + 255, + 249, + 59, + 184, + 7, + 7, + 103, + 255, + 228, + 238, + 224, + 28, + 29, + 159, + 255, + 147, + 187, + 128, + 112, + 118, + 127, + 254, + 78, + 238, + 1, + 193, + 217, + 255, + 249, + 59, + 184, + 7, + 7, + 103, + 255, + 228, + 238, + 224, + 28, + 29, + 159, + 255, + 147, + 187, + 128, + 112, + 118, + 127, + 254, + 78, + 238, + 1, + 193, + 207, + 255, + 249, + 60, + 248, + 7, + 7, + 63, + 255, + 228, + 243, + 224, + 28, + 28, + 255, + 255, + 147, + 207, + 128, + 112, + 115, + 255, + 254, + 79, + 62, + 1, + 193, + 207, + 255, + 249, + 60, + 248, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 193, + 202, + 255, + 249, + 61, + 152, + 7, + 7, + 43, + 255, + 228, + 246, + 96, + 28, + 28, + 175, + 255, + 147, + 217, + 128, + 112, + 114, + 191, + 254, + 79, + 102, + 1, + 134, + 255, + 241, + 56, + 7, + 6, + 215, + 255, + 216, + 96, + 25, + 31, + 254, + 48, + 13, + 7, + 255, + 201, + 139, + 192, + 48, + 223, + 254, + 39, + 0, + 224, + 218, + 255, + 250, + 252, + 3, + 107, + 255, + 242, + 98, + 176, + 12, + 55, + 255, + 137, + 192, + 56, + 54, + 191, + 254, + 191, + 0, + 218, + 255, + 252, + 152, + 172, + 3, + 13, + 255, + 226, + 112, + 14, + 13, + 175, + 255, + 175, + 192, + 54, + 191, + 255, + 38, + 43, + 0, + 195, + 127, + 248, + 156, + 3, + 131, + 107, + 255, + 235, + 240, + 13, + 175, + 255, + 201, + 138, + 192, + 48, + 223, + 254, + 19, + 0, + 224, + 206, + 127, + 252, + 4, + 76, + 3, + 128, + 143, + 255, + 242, + 96, + 112, + 12, + 55, + 255, + 132, + 192, + 56, + 51, + 159, + 255, + 1, + 19, + 0, + 224, + 35, + 255, + 252, + 152, + 28, + 3, + 13, + 255, + 225, + 48, + 14, + 12, + 231, + 255, + 192, + 68, + 192, + 56, + 8, + 255, + 255, + 38, + 7, + 0, + 195, + 127, + 248, + 76, + 3, + 131, + 57, + 255, + 240, + 17, + 48, + 14, + 2, + 63, + 255, + 201, + 129, + 192, + 48, + 223, + 254, + 19, + 0, + 224, + 206, + 127, + 252, + 4, + 76, + 3, + 128, + 143, + 255, + 242, + 96, + 112, + 14, + 12, + 255, + 255, + 156, + 192, + 51, + 159, + 254, + 39, + 0, + 196, + 127, + 241, + 128, + 112, + 19, + 63, + 254, + 75, + 230, + 1, + 193, + 159, + 255, + 243, + 152, + 6, + 115, + 255, + 196, + 224, + 24, + 143, + 254, + 48, + 14, + 2, + 103, + 255, + 201, + 124, + 192, + 56, + 51, + 255, + 254, + 115, + 0, + 206, + 127, + 248, + 156, + 3, + 17, + 255, + 198, + 1, + 192, + 76, + 255, + 249, + 47, + 152, + 7, + 6, + 127, + 255, + 206, + 96, + 25, + 207, + 255, + 19, + 128, + 112, + 21, + 191, + 254, + 75, + 230, + 1, + 193, + 159, + 255, + 243, + 152, + 6, + 115, + 255, + 196, + 224, + 28, + 5, + 111, + 255, + 146, + 249, + 128, + 112, + 103, + 255, + 252, + 190, + 1, + 192, + 135, + 255, + 249, + 46, + 248, + 7, + 6, + 127, + 255, + 203, + 224, + 28, + 8, + 127, + 255, + 146, + 239, + 128, + 112, + 103, + 255, + 252, + 190, + 1, + 192, + 135, + 255, + 249, + 46, + 248, + 7, + 6, + 127, + 255, + 203, + 224, + 28, + 8, + 127, + 255, + 146, + 239, + 128, + 112, + 103, + 255, + 252, + 190, + 1, + 192, + 135, + 255, + 249, + 46, + 248, + 7, + 6, + 107, + 255, + 206, + 96, + 28, + 10, + 159, + 255, + 129, + 133, + 128, + 99, + 127, + 254, + 68, + 38, + 1, + 193, + 154, + 255, + 243, + 152, + 7, + 2, + 167, + 255, + 224, + 97, + 96, + 24, + 223, + 255, + 145, + 9, + 128, + 112, + 102, + 191, + 252, + 230, + 1, + 192, + 169, + 255, + 248, + 24, + 88, + 6, + 55, + 255, + 228, + 66, + 96, + 28, + 25, + 175, + 255, + 57, + 128, + 112, + 42, + 127, + 254, + 6, + 22, + 1, + 141, + 255, + 249, + 16, + 152, + 7, + 6, + 107, + 255, + 206, + 96, + 28, + 10, + 159, + 255, + 129, + 133, + 128, + 99, + 127, + 254, + 68, + 38, + 1, + 193, + 154, + 255, + 243, + 152, + 7, + 2, + 187, + 255, + 224, + 87, + 96, + 25, + 207, + 255, + 145, + 9, + 128, + 112, + 102, + 191, + 252, + 230, + 1, + 192, + 174, + 255, + 248, + 21, + 216, + 6, + 115, + 255, + 228, + 66, + 96, + 28, + 25, + 175, + 255, + 57, + 128, + 112, + 43, + 191, + 254, + 5, + 118, + 1, + 156, + 255, + 249, + 16, + 152, + 7, + 6, + 107, + 255, + 206, + 96, + 28, + 10, + 239, + 255, + 129, + 93, + 128, + 103, + 63, + 254, + 68, + 38, + 1, + 193, + 154, + 255, + 243, + 152, + 7, + 2, + 187, + 255, + 224, + 87, + 96, + 25, + 207, + 255, + 145, + 9, + 128, + 112, + 102, + 191, + 252, + 230, + 1, + 192, + 174, + 255, + 248, + 20, + 152, + 6, + 175, + 255, + 228, + 63, + 224, + 28, + 25, + 175, + 255, + 57, + 128, + 112, + 43, + 191, + 254, + 5, + 38, + 1, + 171, + 255, + 249, + 15, + 248, + 7, + 6, + 107, + 255, + 206, + 96, + 28, + 10, + 239, + 255, + 129, + 73, + 128, + 106, + 255, + 254, + 67, + 254, + 1, + 193, + 154, + 255, + 243, + 152, + 7, + 2, + 187, + 255, + 224, + 82, + 96, + 26, + 191, + 255, + 144, + 255, + 128, + 112, + 102, + 191, + 252, + 230, + 1, + 192, + 178, + 255, + 248, + 19, + 152, + 6, + 211, + 255, + 228, + 61, + 96, + 28, + 25, + 175, + 255, + 57, + 128, + 112, + 44, + 255, + 254, + 4, + 222, + 1, + 180, + 255, + 249, + 15, + 88, + 7, + 6, + 107, + 255, + 206, + 96, + 28, + 11, + 63, + 255, + 129, + 55, + 128, + 109, + 63, + 254, + 67, + 214, + 1, + 193, + 154, + 255, + 243, + 152, + 7, + 2, + 207, + 255, + 224, + 77, + 224, + 27, + 79, + 255, + 144, + 245, + 128, + 112, + 102, + 191, + 252, + 230, + 1, + 192, + 179, + 255, + 248, + 19, + 120, + 6, + 211, + 255, + 228, + 61, + 96, + 28, + 25, + 175, + 255, + 57, + 128, + 112, + 44, + 255, + 254, + 4, + 182, + 1, + 185, + 255, + 249, + 15, + 88, + 7, + 6, + 107, + 255, + 206, + 96, + 28, + 11, + 63, + 255, + 129, + 45, + 128, + 110, + 127, + 254, + 67, + 214, + 1, + 193, + 154, + 255, + 243, + 152, + 7, + 2, + 207, + 255, + 224, + 75, + 96, + 27, + 159, + 255, + 144, + 245, + 128, + 112, + 102, + 191, + 252, + 230, + 1, + 192, + 179, + 255, + 248, + 18, + 216, + 6, + 231, + 255, + 228, + 61, + 96, + 28, + 25, + 175, + 255, + 57, + 128, + 112, + 44, + 255, + 254, + 4, + 182, + 1, + 185, + 255, + 249, + 15, + 88, + 7, + 6, + 107, + 255, + 203, + 224, + 28, + 11, + 143, + 255, + 129, + 25, + 128, + 112, + 16, + 255, + 254, + 67, + 214, + 1, + 193, + 154, + 255, + 242, + 248, + 7, + 2, + 227, + 255, + 224, + 70, + 96, + 28, + 4, + 63, + 255, + 144, + 245, + 128, + 112, + 102, + 191, + 252, + 190, + 1, + 192, + 184, + 255, + 248, + 17, + 152, + 7, + 1, + 15, + 255, + 228, + 61, + 96, + 28, + 25, + 175, + 255, + 47, + 128, + 112, + 46, + 63, + 254, + 4, + 102, + 1, + 192, + 67, + 255, + 249, + 15, + 88, + 7, + 6, + 107, + 255, + 203, + 224, + 28, + 11, + 143, + 255, + 129, + 25, + 128, + 112, + 16, + 255, + 254, + 67, + 214, + 1, + 193, + 159, + 255, + 242, + 88, + 7, + 2, + 227, + 255, + 224, + 65, + 96, + 28, + 4, + 143, + 255, + 144, + 255, + 128, + 112, + 103, + 255, + 252, + 150, + 1, + 192, + 184, + 255, + 248, + 16, + 88, + 7, + 1, + 35, + 255, + 228, + 63, + 224, + 28, + 25, + 255, + 255, + 37, + 128, + 112, + 46, + 63, + 254, + 4, + 22, + 1, + 192, + 72, + 255, + 249, + 15, + 248, + 7, + 6, + 127, + 255, + 201, + 96, + 28, + 11, + 143, + 255, + 129, + 5, + 128, + 112, + 18, + 63, + 254, + 67, + 254, + 1, + 193, + 159, + 255, + 242, + 88, + 7, + 2, + 227, + 255, + 224, + 65, + 96, + 28, + 4, + 143, + 255, + 144, + 255, + 128, + 112, + 105, + 63, + 252, + 38, + 1, + 192, + 193, + 255, + 248, + 15, + 184, + 7, + 1, + 15, + 255, + 228, + 68, + 224, + 28, + 26, + 79, + 254, + 248, + 7, + 3, + 11, + 255, + 224, + 62, + 224, + 28, + 4, + 63, + 255, + 145, + 19, + 128, + 112, + 105, + 63, + 251, + 224, + 28, + 12, + 47, + 255, + 128, + 251, + 128, + 112, + 16, + 255, + 254, + 68, + 78, + 1, + 193, + 164, + 255, + 239, + 128, + 112, + 48, + 191, + 254, + 3, + 238, + 1, + 192, + 67, + 255, + 249, + 17, + 56, + 7, + 6, + 147, + 255, + 190, + 1, + 192, + 194, + 255, + 248, + 15, + 184, + 7, + 1, + 15, + 255, + 228, + 68, + 224, + 28, + 38, + 191, + 255, + 128, + 251, + 128, + 111, + 255, + 254, + 68, + 110, + 1, + 194, + 107, + 255, + 248, + 15, + 184, + 6, + 255, + 255, + 228, + 70, + 224, + 28, + 38, + 191, + 255, + 128, + 251, + 128, + 111, + 255, + 254, + 68, + 110, + 1, + 194, + 107, + 255, + 248, + 15, + 184, + 6, + 255, + 255, + 228, + 70, + 224, + 28, + 38, + 191, + 255, + 128, + 251, + 128, + 111, + 191, + 254, + 68, + 254, + 1, + 194, + 90, + 255, + 248, + 15, + 184, + 6, + 235, + 255, + 228, + 81, + 224, + 28, + 37, + 175, + 255, + 128, + 251, + 128, + 110, + 191, + 254, + 69, + 30, + 1, + 194, + 90, + 255, + 248, + 15, + 184, + 6, + 235, + 255, + 228, + 81, + 224, + 28, + 37, + 175, + 255, + 128, + 251, + 128, + 110, + 191, + 254, + 69, + 30, + 1, + 194, + 90, + 255, + 248, + 15, + 184, + 6, + 215, + 255, + 228, + 84, + 96, + 28, + 37, + 175, + 255, + 128, + 251, + 128, + 109, + 127, + 254, + 69, + 70, + 1, + 194, + 90, + 255, + 248, + 15, + 184, + 6, + 215, + 255, + 228, + 84, + 96, + 28, + 37, + 175, + 255, + 128, + 251, + 128, + 109, + 127, + 254, + 69, + 70, + 1, + 194, + 90, + 255, + 248, + 15, + 184, + 6, + 215, + 255, + 228, + 86, + 224, + 28, + 37, + 95, + 255, + 128, + 251, + 128, + 109, + 127, + 254, + 69, + 110, + 1, + 194, + 85, + 255, + 248, + 15, + 184, + 6, + 215, + 255, + 228, + 86, + 224, + 28, + 37, + 95, + 255, + 128, + 251, + 128, + 109, + 127, + 254, + 69, + 110, + 1, + 194, + 85, + 255, + 248, + 15, + 184, + 6, + 215, + 255, + 228, + 86, + 224, + 28, + 37, + 95, + 255, + 128, + 251, + 128, + 109, + 127, + 254, + 69, + 110, + 1, + 194, + 90, + 255, + 248, + 14, + 152, + 6, + 251, + 255, + 228, + 84, + 96, + 28, + 37, + 175, + 255, + 128, + 233, + 128, + 111, + 191, + 254, + 69, + 70, + 1, + 194, + 90, + 255, + 248, + 14, + 152, + 6, + 251, + 255, + 228, + 84, + 96, + 28, + 37, + 175, + 255, + 128, + 233, + 128, + 111, + 191, + 254, + 69, + 70, + 1, + 194, + 90, + 255, + 248, + 14, + 152, + 6, + 251, + 255, + 228, + 84, + 96, + 28, + 37, + 175, + 255, + 128, + 223, + 128, + 112, + 16, + 255, + 254, + 69, + 70, + 1, + 194, + 90, + 255, + 248, + 13, + 248, + 7, + 1, + 15, + 255, + 228, + 84, + 96, + 28, + 37, + 175, + 255, + 128, + 223, + 128, + 112, + 16, + 255, + 254, + 69, + 70, + 1, + 194, + 90, + 255, + 248, + 13, + 248, + 7, + 1, + 15, + 255, + 228, + 84, + 96, + 28, + 37, + 175, + 255, + 128, + 223, + 128, + 112, + 16, + 255, + 254, + 69, + 70, + 1, + 194, + 90, + 255, + 248, + 13, + 88, + 7, + 1, + 51, + 255, + 194, + 224, + 26, + 15, + 255, + 144, + 251, + 128, + 112, + 150, + 191, + 254, + 3, + 86, + 1, + 192, + 77, + 255, + 239, + 128, + 104, + 127, + 254, + 67, + 238, + 1, + 194, + 90, + 255, + 248, + 13, + 88, + 7, + 1, + 55, + 255, + 190, + 1, + 161, + 255, + 249, + 15, + 184, + 7, + 9, + 107, + 255, + 224, + 53, + 96, + 28, + 4, + 223, + 254, + 248, + 6, + 135, + 255, + 228, + 62, + 224, + 28, + 37, + 175, + 255, + 128, + 213, + 128, + 112, + 19, + 127, + 251, + 224, + 26, + 31, + 255, + 144, + 251, + 128, + 112, + 151, + 255, + 254, + 3, + 46, + 1, + 192, + 115, + 255, + 249, + 15, + 184, + 7, + 9, + 127, + 255, + 224, + 50, + 224, + 28, + 7, + 63, + 255, + 144, + 251, + 128, + 112, + 151, + 255, + 254, + 3, + 46, + 1, + 192, + 115, + 255, + 249, + 15, + 184, + 7, + 9, + 127, + 255, + 224, + 50, + 224, + 28, + 7, + 63, + 255, + 144, + 251, + 128, + 112, + 151, + 255, + 254, + 3, + 46, + 1, + 192, + 115, + 255, + 249, + 15, + 184, + 7, + 9, + 143, + 255, + 224, + 46, + 96, + 28, + 7, + 143, + 255, + 144, + 251, + 128, + 112, + 152, + 255, + 254, + 2, + 230, + 1, + 192, + 120, + 255, + 249, + 15, + 184, + 7, + 9, + 147, + 255, + 224, + 45, + 224, + 28, + 7, + 143, + 255, + 144, + 251, + 128, + 112, + 153, + 63, + 254, + 2, + 222, + 1, + 192, + 120, + 255, + 249, + 16, + 88, + 7, + 9, + 127, + 255, + 224, + 45, + 224, + 28, + 7, + 143, + 255, + 145, + 5, + 128, + 112, + 151, + 255, + 254, + 2, + 142, + 1, + 192, + 130, + 255, + 249, + 16, + 88, + 7, + 9, + 127, + 255, + 224, + 40, + 224, + 28, + 8, + 47, + 255, + 145, + 5, + 128, + 112, + 151, + 255, + 254, + 2, + 142, + 1, + 192, + 130, + 255, + 249, + 16, + 88, + 7, + 9, + 127, + 255, + 224, + 40, + 224, + 28, + 8, + 47, + 255, + 144, + 241, + 128, + 112, + 156, + 191, + 254, + 2, + 70, + 1, + 192, + 130, + 255, + 249, + 15, + 24, + 7, + 9, + 203, + 255, + 224, + 36, + 96, + 28, + 8, + 47, + 255, + 144, + 241, + 128, + 112, + 156, + 191, + 254, + 2, + 70, + 1, + 192, + 130, + 255, + 249, + 15, + 24, + 7, + 9, + 203, + 255, + 224, + 36, + 96, + 28, + 8, + 47, + 255, + 144, + 241, + 128, + 112, + 156, + 191, + 254, + 2, + 70, + 1, + 192, + 130, + 255, + 249, + 14, + 120, + 7, + 10, + 63, + 255, + 213, + 224, + 28, + 8, + 127, + 255, + 29, + 128, + 106, + 255, + 254, + 2, + 150, + 1, + 170, + 255, + 248, + 247, + 88, + 7, + 10, + 67, + 255, + 213, + 96, + 28, + 8, + 127, + 255, + 29, + 128, + 106, + 255, + 254, + 2, + 142, + 1, + 171, + 255, + 248, + 247, + 88, + 7, + 10, + 67, + 255, + 213, + 96, + 28, + 8, + 127, + 255, + 29, + 128, + 106, + 255, + 254, + 2, + 142, + 1, + 171, + 255, + 248, + 247, + 88, + 7, + 10, + 67, + 255, + 213, + 96, + 28, + 8, + 127, + 255, + 29, + 128, + 106, + 255, + 254, + 2, + 142, + 1, + 171, + 255, + 248, + 247, + 88, + 7, + 10, + 67, + 255, + 213, + 96, + 28, + 8, + 127, + 255, + 29, + 128, + 106, + 255, + 254, + 2, + 142, + 1, + 171, + 255, + 248, + 246, + 56, + 7, + 10, + 119, + 255, + 206, + 224, + 28, + 8, + 207, + 255, + 37, + 128, + 108, + 63, + 253, + 206, + 1, + 190, + 255, + 248, + 246, + 24, + 7, + 10, + 123, + 255, + 206, + 224, + 28, + 8, + 207, + 255, + 37, + 128, + 108, + 63, + 253, + 206, + 1, + 190, + 255, + 248, + 246, + 24, + 7, + 10, + 123, + 255, + 206, + 224, + 28, + 8, + 207, + 255, + 37, + 128, + 108, + 63, + 253, + 206, + 1, + 190, + 255, + 248, + 246, + 24, + 7, + 10, + 123, + 255, + 206, + 224, + 28, + 8, + 207, + 255, + 37, + 128, + 108, + 63, + 253, + 206, + 1, + 190, + 255, + 248, + 246, + 24, + 7, + 10, + 123, + 255, + 206, + 224, + 28, + 8, + 207, + 255, + 37, + 128, + 108, + 63, + 253, + 206, + 1, + 190, + 255, + 248, + 245, + 216, + 7, + 3, + 175, + 255, + 194, + 96, + 28, + 26, + 255, + 255, + 49, + 128, + 112, + 36, + 127, + 252, + 150, + 1, + 176, + 255, + 244, + 56, + 6, + 35, + 255, + 140, + 3, + 128, + 153, + 255, + 240, + 38, + 240, + 13, + 167, + 255, + 198, + 221, + 192, + 56, + 29, + 127, + 254, + 19, + 0, + 224, + 215, + 255, + 249, + 140, + 3, + 129, + 35, + 255, + 228, + 176, + 13, + 135, + 255, + 161, + 192, + 56, + 10, + 223, + 255, + 2, + 111, + 0, + 218, + 127, + 252, + 109, + 220, + 3, + 129, + 97, + 255, + 198, + 1, + 185, + 255, + 240, + 152, + 7, + 6, + 191, + 255, + 204, + 96, + 28, + 9, + 31, + 255, + 37, + 128, + 108, + 63, + 253, + 14, + 1, + 192, + 86, + 255, + 248, + 19, + 120, + 6, + 211, + 255, + 227, + 110, + 224, + 28, + 11, + 15, + 254, + 48, + 13, + 207, + 255, + 132, + 192, + 56, + 53, + 255, + 254, + 99, + 0, + 224, + 72, + 255, + 249, + 44, + 3, + 97, + 255, + 232, + 112, + 14, + 2, + 183, + 255, + 192, + 155, + 192, + 54, + 159, + 255, + 27, + 119, + 0, + 224, + 88, + 127, + 241, + 128, + 110, + 127, + 252, + 38, + 1, + 193, + 175, + 255, + 243, + 24, + 7, + 2, + 71, + 255, + 201, + 96, + 27, + 15, + 255, + 67, + 128, + 112, + 21, + 191, + 254, + 4, + 222, + 1, + 180, + 255, + 248, + 219, + 184, + 7, + 2, + 59, + 255, + 224, + 51, + 96, + 28, + 26, + 175, + 255, + 49, + 128, + 112, + 36, + 127, + 252, + 110, + 1, + 181, + 255, + 243, + 152, + 7, + 1, + 111, + 255, + 224, + 70, + 96, + 28, + 4, + 143, + 255, + 141, + 177, + 128, + 112, + 35, + 191, + 254, + 3, + 54, + 1, + 193, + 170, + 255, + 243, + 24, + 7, + 2, + 71, + 255, + 198, + 224, + 27, + 95, + 255, + 57, + 128, + 112, + 22, + 255, + 254, + 4, + 102, + 1, + 192, + 72, + 255, + 248, + 219, + 24, + 7, + 2, + 59, + 255, + 224, + 51, + 96, + 28, + 26, + 175, + 255, + 49, + 128, + 112, + 36, + 127, + 252, + 110, + 1, + 181, + 255, + 243, + 152, + 7, + 1, + 111, + 255, + 224, + 70, + 96, + 28, + 4, + 143, + 255, + 141, + 177, + 128, + 112, + 35, + 191, + 254, + 3, + 54, + 1, + 193, + 170, + 255, + 243, + 24, + 7, + 2, + 71, + 255, + 198, + 224, + 27, + 95, + 255, + 57, + 128, + 112, + 22, + 255, + 254, + 4, + 102, + 1, + 192, + 72, + 255, + 248, + 219, + 24, + 7, + 2, + 59, + 255, + 224, + 51, + 96, + 28, + 26, + 175, + 255, + 49, + 128, + 112, + 36, + 127, + 252, + 110, + 1, + 180, + 255, + 243, + 184, + 7, + 1, + 111, + 255, + 224, + 70, + 96, + 28, + 4, + 143, + 255, + 141, + 177, + 128, + 112, + 23, + 191, + 254, + 4, + 214, + 1, + 192, + 252, + 255, + 241, + 216, + 7, + 2, + 107, + 255, + 201, + 224, + 28, + 9, + 175, + 255, + 19, + 128, + 106, + 255, + 252, + 118, + 1, + 192, + 135, + 255, + 247, + 216, + 7, + 2, + 107, + 255, + 227, + 96, + 96, + 28, + 5, + 239, + 255, + 129, + 53, + 128, + 112, + 63, + 63, + 252, + 118, + 1, + 192, + 154, + 255, + 242, + 120, + 7, + 2, + 107, + 255, + 196, + 224, + 26, + 191, + 255, + 29, + 128, + 112, + 33, + 255, + 253, + 246, + 1, + 192, + 154, + 255, + 248, + 216, + 24, + 7, + 1, + 123, + 255, + 224, + 77, + 96, + 28, + 15, + 207, + 255, + 29, + 128, + 112, + 38, + 191, + 252, + 158, + 1, + 192, + 154, + 255, + 241, + 56, + 6, + 175, + 255, + 199, + 96, + 28, + 8, + 127, + 255, + 125, + 128, + 112, + 38, + 191, + 254, + 54, + 6, + 1, + 192, + 94, + 255, + 248, + 19, + 88, + 7, + 3, + 243, + 255, + 199, + 96, + 28, + 9, + 175, + 255, + 39, + 128, + 112, + 38, + 191, + 252, + 78, + 1, + 171, + 255, + 241, + 216, + 7, + 2, + 31, + 255, + 223, + 96, + 28, + 9, + 175, + 255, + 141, + 129, + 128, + 112, + 23, + 191, + 254, + 4, + 222, + 1, + 192, + 250, + 255, + 241, + 248, + 7, + 2, + 107, + 255, + 201, + 224, + 28, + 9, + 175, + 255, + 19, + 128, + 106, + 191, + 252, + 126, + 1, + 192, + 135, + 255, + 247, + 216, + 7, + 2, + 107, + 255, + 227, + 96, + 96, + 28, + 5, + 239, + 255, + 129, + 63, + 128, + 112, + 31, + 191, + 252, + 38, + 1, + 192, + 106, + 255, + 242, + 248, + 7, + 2, + 107, + 255, + 199, + 96, + 28, + 36, + 111, + 255, + 141, + 129, + 128, + 112, + 23, + 191, + 254, + 4, + 254, + 1, + 192, + 126, + 255, + 240, + 152, + 7, + 1, + 171, + 255, + 203, + 224, + 28, + 9, + 175, + 255, + 29, + 128, + 112, + 145, + 191, + 254, + 54, + 6, + 1, + 192, + 94, + 255, + 248, + 19, + 248, + 7, + 1, + 251, + 255, + 194, + 96, + 28, + 6, + 159, + 255, + 49, + 128, + 112, + 38, + 191, + 252, + 118, + 1, + 194, + 70, + 255, + 248, + 216, + 24, + 7, + 1, + 123, + 255, + 224, + 79, + 224, + 28, + 7, + 239, + 255, + 9, + 128, + 112, + 26, + 127, + 252, + 198, + 1, + 192, + 154, + 255, + 241, + 216, + 7, + 9, + 27, + 255, + 227, + 96, + 96, + 28, + 5, + 239, + 255, + 129, + 73, + 128, + 112, + 26, + 191, + 252, + 158, + 1, + 192, + 101, + 255, + 243, + 152, + 7, + 2, + 127, + 255, + 194, + 224, + 28, + 37, + 79, + 255, + 141, + 109, + 128, + 112, + 23, + 191, + 254, + 5, + 38, + 1, + 192, + 106, + 255, + 242, + 120, + 7, + 1, + 151, + 255, + 206, + 96, + 28, + 9, + 255, + 255, + 9, + 128, + 112, + 149, + 127, + 254, + 53, + 182, + 1, + 192, + 94, + 255, + 248, + 20, + 152, + 7, + 1, + 171, + 255, + 201, + 224, + 28, + 6, + 95, + 255, + 57, + 128, + 112, + 39, + 255, + 252, + 38, + 1, + 194, + 85, + 255, + 248, + 214, + 216, + 7, + 1, + 123, + 255, + 224, + 82, + 96, + 28, + 6, + 175, + 255, + 39, + 128, + 112, + 25, + 127, + 252, + 230, + 1, + 192, + 159, + 255, + 240, + 152, + 7, + 9, + 87, + 255, + 227, + 91, + 96, + 28, + 5, + 239, + 255, + 129, + 73, + 128, + 112, + 26, + 191, + 252, + 158, + 1, + 192, + 101, + 255, + 243, + 152, + 7, + 2, + 127, + 255, + 194, + 96, + 28, + 37, + 95, + 255, + 141, + 109, + 128, + 112, + 23, + 191, + 254, + 5, + 118, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 131, + 255, + 208, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 23, + 191, + 254, + 5, + 118, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 131, + 255, + 208, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 23, + 191, + 254, + 5, + 118, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 131, + 255, + 208, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 23, + 191, + 254, + 5, + 118, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 131, + 255, + 208, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 23, + 191, + 254, + 5, + 118, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 131, + 255, + 208, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 19, + 255, + 254, + 5, + 238, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 111, + 255, + 211, + 96, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 19, + 255, + 254, + 5, + 238, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 111, + 255, + 211, + 96, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 19, + 255, + 254, + 5, + 238, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 111, + 255, + 211, + 96, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 19, + 255, + 254, + 5, + 238, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 111, + 255, + 211, + 96, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 112, + 19, + 255, + 254, + 5, + 238, + 1, + 192, + 96, + 255, + 242, + 120, + 7, + 1, + 111, + 255, + 211, + 96, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 108, + 191, + 254, + 6, + 254, + 1, + 192, + 81, + 255, + 243, + 184, + 7, + 1, + 91, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 108, + 191, + 254, + 6, + 254, + 1, + 192, + 81, + 255, + 243, + 184, + 7, + 1, + 91, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 108, + 191, + 254, + 6, + 254, + 1, + 192, + 81, + 255, + 243, + 184, + 7, + 1, + 91, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 108, + 191, + 254, + 6, + 254, + 1, + 192, + 81, + 255, + 243, + 184, + 7, + 1, + 91, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 108, + 191, + 254, + 6, + 254, + 1, + 192, + 81, + 255, + 243, + 184, + 7, + 1, + 91, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 107, + 127, + 254, + 7, + 78, + 1, + 192, + 76, + 255, + 244, + 56, + 7, + 1, + 75, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 107, + 127, + 254, + 7, + 78, + 1, + 192, + 76, + 255, + 244, + 56, + 7, + 1, + 75, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 107, + 127, + 254, + 7, + 78, + 1, + 192, + 76, + 255, + 244, + 56, + 7, + 1, + 75, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 107, + 127, + 254, + 7, + 78, + 1, + 192, + 76, + 255, + 244, + 56, + 7, + 1, + 75, + 255, + 213, + 224, + 28, + 47, + 255, + 255, + 141, + 99, + 128, + 107, + 127, + 254, + 7, + 78, + 1, + 192, + 76, + 255, + 244, + 88, + 7, + 1, + 71, + 255, + 213, + 224, + 24, + 143, + 254, + 48, + 14, + 23, + 175, + 255, + 198, + 177, + 192, + 53, + 31, + 255, + 3, + 187, + 0, + 224, + 33, + 255, + 250, + 252, + 3, + 128, + 145, + 255, + 239, + 176, + 14, + 23, + 143, + 255, + 198, + 177, + 192, + 53, + 31, + 255, + 3, + 187, + 0, + 224, + 33, + 255, + 250, + 252, + 3, + 128, + 145, + 255, + 239, + 176, + 14, + 23, + 143, + 255, + 198, + 177, + 192, + 53, + 31, + 255, + 3, + 187, + 0, + 224, + 33, + 255, + 250, + 252, + 3, + 128, + 145, + 255, + 239, + 176, + 14, + 23, + 143, + 255, + 198, + 177, + 192, + 53, + 31, + 255, + 3, + 187, + 0, + 224, + 33, + 255, + 250, + 252, + 3, + 128, + 145, + 255, + 239, + 176, + 14, + 23, + 143, + 255, + 198, + 177, + 192, + 53, + 31, + 255, + 3, + 187, + 0, + 224, + 33, + 127, + 251, + 28, + 3, + 128, + 143, + 255, + 239, + 176, + 14, + 23, + 143, + 255, + 198, + 177, + 192, + 52, + 127, + 255, + 3, + 223, + 0, + 221, + 127, + 251, + 236, + 3, + 115, + 255, + 238, + 176, + 14, + 23, + 175, + 255, + 198, + 182, + 192, + 52, + 127, + 255, + 3, + 223, + 0, + 221, + 127, + 251, + 236, + 3, + 115, + 255, + 238, + 176, + 14, + 23, + 175, + 255, + 198, + 182, + 192, + 52, + 127, + 255, + 3, + 223, + 0, + 221, + 127, + 251, + 236, + 3, + 115, + 255, + 238, + 176, + 14, + 23, + 175, + 255, + 198, + 182, + 192, + 52, + 127, + 255, + 3, + 223, + 0, + 221, + 127, + 251, + 236, + 3, + 115, + 255, + 238, + 176, + 14, + 23, + 175, + 255, + 198, + 182, + 192, + 52, + 127, + 255, + 3, + 171, + 0, + 224, + 33, + 127, + 252, + 4, + 140, + 3, + 105, + 255, + 238, + 176, + 14, + 16, + 215, + 255, + 137, + 192, + 52, + 223, + 254, + 75, + 0, + 224, + 75, + 127, + 252, + 107, + 108, + 3, + 71, + 255, + 240, + 58, + 112, + 14, + 2, + 31, + 255, + 192, + 72, + 192, + 54, + 159, + 254, + 235, + 0, + 225, + 13, + 127, + 248, + 156, + 3, + 77, + 255, + 228, + 176, + 14, + 4, + 183, + 255, + 198, + 182, + 192, + 52, + 127, + 255, + 3, + 167, + 0, + 224, + 33, + 255, + 252, + 4, + 140, + 3, + 105, + 255, + 238, + 176, + 14, + 16, + 215, + 255, + 137, + 192, + 52, + 223, + 254, + 75, + 0, + 224, + 75, + 127, + 252, + 107, + 108, + 3, + 71, + 255, + 240, + 58, + 112, + 14, + 2, + 31, + 255, + 192, + 72, + 192, + 54, + 159, + 254, + 235, + 0, + 225, + 13, + 127, + 248, + 156, + 3, + 77, + 255, + 228, + 176, + 14, + 4, + 183, + 255, + 198, + 182, + 192, + 52, + 127, + 255, + 3, + 167, + 0, + 224, + 33, + 255, + 252, + 4, + 140, + 3, + 105, + 255, + 238, + 176, + 14, + 16, + 215, + 255, + 137, + 192, + 52, + 223, + 254, + 75, + 0, + 224, + 75, + 127, + 252, + 107, + 108, + 3, + 63, + 255, + 240, + 58, + 48, + 14, + 2, + 71, + 255, + 192, + 72, + 192, + 54, + 159, + 255, + 1, + 15, + 0, + 224, + 252, + 255, + 252, + 5, + 188, + 3, + 129, + 45, + 255, + 241, + 173, + 176, + 12, + 255, + 255, + 192, + 232, + 192, + 56, + 9, + 31, + 255, + 1, + 35, + 0, + 218, + 127, + 252, + 4, + 60, + 3, + 131, + 243, + 255, + 240, + 22, + 240, + 14, + 4, + 183, + 255, + 198, + 182, + 192, + 51, + 255, + 255, + 3, + 163, + 0, + 224, + 36, + 127, + 252, + 4, + 140, + 3, + 105, + 255, + 240, + 16, + 240, + 14, + 15, + 207, + 255, + 192, + 91, + 192, + 56, + 18, + 223, + 255, + 26, + 219, + 0, + 207, + 255, + 252, + 14, + 140, + 3, + 128, + 145, + 255, + 240, + 18, + 48, + 13, + 167, + 255, + 192, + 67, + 192, + 56, + 63, + 63, + 255, + 1, + 111, + 0, + 224, + 75, + 127, + 252, + 107, + 108, + 3, + 63, + 255, + 240, + 58, + 48, + 14, + 2, + 71, + 255, + 192, + 72, + 192, + 54, + 159, + 255, + 1, + 15, + 0, + 208, + 255, + 241, + 128, + 112, + 117, + 191, + 254, + 2, + 222, + 1, + 192, + 150, + 255, + 248, + 214, + 216, + 6, + 127, + 255, + 224, + 111, + 96, + 28, + 4, + 223, + 255, + 128, + 165, + 128, + 107, + 255, + 254, + 2, + 30, + 1, + 157, + 255, + 246, + 152, + 6, + 175, + 255, + 194, + 96, + 28, + 22, + 111, + 255, + 128, + 205, + 128, + 112, + 38, + 191, + 254, + 53, + 182, + 1, + 159, + 255, + 248, + 27, + 216, + 7, + 1, + 55, + 255, + 224, + 41, + 96, + 26, + 255, + 255, + 128, + 135, + 128, + 103, + 127, + 253, + 166, + 1, + 171, + 255, + 240, + 152, + 7, + 5, + 155, + 255, + 224, + 51, + 96, + 28, + 9, + 175, + 255, + 141, + 109, + 128, + 103, + 255, + 254, + 6, + 246, + 1, + 192, + 77, + 255, + 248, + 10, + 88, + 6, + 191, + 255, + 224, + 33, + 224, + 25, + 223, + 255, + 105, + 128, + 106, + 255, + 252, + 38, + 1, + 193, + 102, + 255, + 248, + 12, + 216, + 7, + 2, + 107, + 255, + 227, + 91, + 96, + 25, + 255, + 255, + 129, + 189, + 128, + 112, + 19, + 127, + 254, + 2, + 150, + 1, + 175, + 255, + 248, + 8, + 120, + 6, + 119, + 255, + 218, + 96, + 26, + 191, + 255, + 9, + 128, + 112, + 89, + 191, + 254, + 3, + 54, + 1, + 192, + 154, + 255, + 248, + 214, + 216, + 6, + 127, + 255, + 224, + 111, + 96, + 28, + 4, + 223, + 255, + 128, + 165, + 128, + 107, + 255, + 254, + 2, + 38, + 1, + 156, + 255, + 246, + 152, + 6, + 175, + 255, + 194, + 96, + 28, + 22, + 111, + 255, + 128, + 205, + 128, + 112, + 38, + 191, + 254, + 53, + 182, + 1, + 159, + 255, + 248, + 27, + 216, + 7, + 1, + 55, + 255, + 224, + 43, + 224, + 26, + 95, + 255, + 129, + 55, + 128, + 103, + 63, + 252, + 198, + 1, + 193, + 39, + 255, + 241, + 216, + 6, + 155, + 255, + 224, + 53, + 96, + 28, + 9, + 175, + 255, + 141, + 109, + 128, + 103, + 255, + 254, + 6, + 246, + 1, + 192, + 77, + 255, + 248, + 10, + 248, + 6, + 151, + 255, + 224, + 77, + 224, + 25, + 207, + 255, + 49, + 128, + 112, + 73, + 255, + 252, + 118, + 1, + 166, + 255, + 248, + 13, + 88, + 7, + 2, + 107, + 255, + 227, + 91, + 96, + 25, + 255, + 255, + 129, + 189, + 128, + 112, + 19, + 127, + 254, + 2, + 190, + 1, + 165, + 255, + 248, + 19, + 120, + 6, + 115, + 255, + 204, + 96, + 28, + 18, + 127, + 255, + 29, + 128, + 105, + 191, + 254, + 3, + 86, + 1, + 192, + 154, + 255, + 248, + 214, + 216, + 6, + 127, + 255, + 224, + 111, + 96, + 28, + 4, + 223, + 255, + 128, + 175, + 128, + 105, + 127, + 254, + 4, + 222, + 1, + 156, + 255, + 243, + 24, + 7, + 4, + 159, + 255, + 199, + 96, + 26, + 111, + 255, + 128, + 213, + 128, + 112, + 38, + 191, + 254, + 53, + 182, + 1, + 159, + 255, + 248, + 27, + 216, + 7, + 1, + 55, + 255, + 224, + 43, + 224, + 26, + 95, + 255, + 129, + 55, + 128, + 103, + 63, + 252, + 198, + 1, + 193, + 39, + 255, + 241, + 216, + 6, + 155, + 255, + 224, + 53, + 96, + 28, + 9, + 175, + 255, + 141, + 109, + 128, + 103, + 255, + 254, + 6, + 246, + 1, + 192, + 77, + 255, + 248, + 35, + 56, + 6, + 115, + 255, + 206, + 96, + 28, + 8, + 63, + 255, + 125, + 128, + 112, + 19, + 127, + 254, + 5, + 158, + 1, + 192, + 154, + 255, + 248, + 214, + 216, + 6, + 127, + 255, + 224, + 111, + 96, + 28, + 4, + 223, + 255, + 130, + 51, + 128, + 103, + 63, + 252, + 230, + 1, + 192, + 131, + 255, + 247, + 216, + 7, + 1, + 55, + 255, + 224, + 89, + 224, + 28, + 9, + 175, + 255, + 141, + 109, + 128, + 103, + 255, + 254, + 6, + 246, + 1, + 192, + 77, + 255, + 248, + 35, + 56, + 6, + 115, + 255, + 206, + 96, + 28, + 8, + 63, + 255, + 125, + 128, + 112, + 19, + 127, + 254, + 5, + 158, + 1, + 192, + 154, + 255, + 248, + 214, + 216, + 6, + 127, + 255, + 224, + 111, + 96, + 28, + 4, + 223, + 255, + 130, + 51, + 128, + 103, + 63, + 252, + 230, + 1, + 192, + 131, + 255, + 247, + 216, + 7, + 1, + 55, + 255, + 224, + 89, + 224, + 28, + 9, + 175, + 255, + 141, + 109, + 128, + 103, + 255, + 254, + 6, + 246, + 1, + 192, + 77, + 255, + 248, + 35, + 56, + 6, + 115, + 255, + 206, + 224, + 28, + 8, + 47, + 255, + 125, + 128, + 112, + 19, + 127, + 254, + 5, + 158, + 1, + 192, + 154, + 255, + 248, + 214, + 216, + 6, + 127, + 255, + 224, + 111, + 96, + 28, + 4, + 223, + 255, + 130, + 51, + 128, + 103, + 63, + 253, + 54, + 1, + 176, + 255, + 242, + 88, + 6, + 195, + 255, + 224, + 38, + 224, + 26, + 255, + 255, + 129, + 133, + 128, + 112, + 41, + 63, + 254, + 53, + 142, + 1, + 159, + 255, + 248, + 27, + 216, + 7, + 1, + 55, + 255, + 224, + 140, + 224, + 25, + 207, + 255, + 77, + 128, + 108, + 63, + 252, + 150, + 1, + 176, + 255, + 248, + 9, + 184, + 6, + 191, + 255, + 224, + 97, + 96, + 28, + 10, + 79, + 255, + 141, + 99, + 128, + 103, + 255, + 254, + 6, + 246, + 1, + 192, + 77, + 255, + 248, + 35, + 56, + 6, + 115, + 255, + 211, + 96, + 27, + 15, + 255, + 37, + 128, + 108, + 63, + 254, + 2, + 110, + 1, + 175, + 255, + 248, + 24, + 88, + 7, + 2, + 147, + 255, + 227, + 88, + 224, + 25, + 255, + 255, + 129, + 189, + 128, + 112, + 19, + 127, + 254, + 8, + 206, + 1, + 156, + 255, + 244, + 216, + 6, + 195, + 255, + 201, + 96, + 27, + 15, + 255, + 128, + 155, + 128, + 107, + 255, + 254, + 6, + 22, + 1, + 192, + 164, + 255, + 248, + 214, + 56, + 6, + 123, + 255, + 224, + 112, + 96, + 28, + 4, + 207, + 255, + 130, + 51, + 128, + 103, + 63, + 253, + 54, + 1, + 175, + 255, + 242, + 120, + 6, + 195, + 255, + 224, + 38, + 224, + 26, + 255, + 255, + 129, + 133, + 128, + 112, + 41, + 63, + 254, + 53, + 142, + 1, + 154, + 255, + 248, + 29, + 24, + 7, + 1, + 15, + 255, + 224, + 148, + 96, + 24, + 159, + 255, + 95, + 128, + 104, + 127, + 252, + 198, + 1, + 180, + 255, + 248, + 40, + 24, + 7, + 2, + 187, + 255, + 224, + 62, + 224, + 27, + 15, + 255, + 139, + 251, + 128, + 102, + 191, + 254, + 7, + 70, + 1, + 192, + 67, + 255, + 248, + 37, + 24, + 6, + 39, + 255, + 215, + 224, + 26, + 31, + 255, + 49, + 128, + 109, + 63, + 254, + 10, + 6, + 1, + 192, + 174, + 255, + 248, + 15, + 184, + 6, + 195, + 255, + 226, + 254, + 224, + 25, + 175, + 255, + 129, + 209, + 128, + 112, + 16, + 255, + 254, + 9, + 70, + 1, + 136, + 255, + 246, + 24, + 6, + 135, + 255, + 204, + 96, + 27, + 79, + 255, + 130, + 129, + 128, + 112, + 43, + 191, + 254, + 3, + 238, + 1, + 176, + 255, + 248, + 191, + 184, + 6, + 107, + 255, + 224, + 116, + 96, + 28, + 4, + 63, + 255, + 130, + 81, + 128, + 98, + 63, + 253, + 134, + 1, + 161, + 255, + 243, + 24, + 6, + 211, + 255, + 224, + 160, + 96, + 28, + 10, + 239, + 255, + 128, + 251, + 128, + 108, + 63, + 254, + 56, + 14, + 1, + 190, + 255, + 248, + 45, + 152, + 6, + 95, + 255, + 206, + 224, + 27, + 79, + 255, + 130, + 129, + 128, + 112, + 43, + 191, + 254, + 3, + 238, + 1, + 176, + 255, + 248, + 224, + 56, + 6, + 251, + 255, + 224, + 182, + 96, + 25, + 127, + 255, + 59, + 128, + 110, + 127, + 254, + 9, + 222, + 1, + 192, + 174, + 255, + 248, + 15, + 184, + 6, + 235, + 255, + 227, + 123, + 224, + 27, + 239, + 255, + 130, + 217, + 128, + 101, + 255, + 252, + 238, + 1, + 185, + 255, + 248, + 39, + 120, + 7, + 2, + 187, + 255, + 224, + 62, + 224, + 27, + 175, + 255, + 141, + 239, + 128, + 111, + 191, + 254, + 11, + 102, + 1, + 151, + 255, + 243, + 184, + 6, + 231, + 255, + 224, + 157, + 224, + 28, + 10, + 239, + 255, + 128, + 251, + 128, + 110, + 191, + 254, + 55, + 190, + 1, + 190, + 255, + 248, + 45, + 152, + 6, + 95, + 255, + 206, + 224, + 27, + 159, + 255, + 130, + 119, + 128, + 112, + 43, + 191, + 254, + 3, + 238, + 1, + 186, + 255, + 248, + 222, + 248, + 6, + 251, + 255, + 224, + 184, + 224, + 25, + 47, + 255, + 59, + 128, + 110, + 127, + 254, + 9, + 222, + 1, + 192, + 178, + 255, + 248, + 14, + 184, + 6, + 251, + 255, + 227, + 123, + 224, + 27, + 239, + 255, + 130, + 227, + 128, + 100, + 191, + 252, + 238, + 1, + 185, + 255, + 248, + 39, + 120, + 7, + 2, + 207, + 255, + 224, + 58, + 96, + 27, + 239, + 255, + 141, + 239, + 128, + 111, + 191, + 254, + 11, + 142, + 1, + 146, + 255, + 243, + 184, + 6, + 231, + 255, + 224, + 157, + 224, + 28, + 11, + 63, + 255, + 128, + 233, + 128, + 111, + 191, + 254, + 55, + 190, + 1, + 190, + 255, + 248, + 46, + 56, + 6, + 75, + 255, + 206, + 224, + 27, + 159, + 255, + 130, + 119, + 128, + 112, + 44, + 255, + 254, + 3, + 158, + 1, + 191, + 255, + 248, + 222, + 248, + 6, + 251, + 255, + 224, + 184, + 224, + 25, + 47, + 255, + 59, + 128, + 110, + 127, + 254, + 9, + 222, + 1, + 192, + 179, + 255, + 248, + 14, + 120, + 6, + 255, + 255, + 227, + 126, + 96, + 26, + 191, + 255, + 131, + 97, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 192, + 183, + 255, + 248, + 13, + 248, + 7, + 1, + 15, + 255, + 227, + 124, + 96, + 26, + 191, + 255, + 131, + 97, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 192, + 184, + 255, + 248, + 13, + 216, + 7, + 1, + 19, + 255, + 227, + 123, + 224, + 26, + 191, + 255, + 131, + 97, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 192, + 184, + 255, + 248, + 13, + 216, + 7, + 1, + 19, + 255, + 227, + 123, + 224, + 26, + 191, + 255, + 131, + 97, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 192, + 184, + 255, + 248, + 13, + 216, + 7, + 1, + 19, + 255, + 227, + 123, + 224, + 26, + 191, + 255, + 131, + 97, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 192, + 184, + 255, + 248, + 13, + 216, + 7, + 1, + 19, + 255, + 228, + 106, + 96, + 27, + 239, + 255, + 130, + 109, + 128, + 112, + 48, + 127, + 254, + 3, + 46, + 1, + 192, + 68, + 255, + 249, + 26, + 152, + 6, + 251, + 255, + 224, + 155, + 96, + 28, + 12, + 31, + 255, + 128, + 203, + 128, + 112, + 17, + 63, + 254, + 70, + 166, + 1, + 190, + 255, + 248, + 38, + 216, + 7, + 3, + 7, + 255, + 224, + 50, + 224, + 28, + 4, + 79, + 255, + 145, + 169, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 192, + 193, + 255, + 248, + 12, + 184, + 7, + 1, + 19, + 255, + 228, + 106, + 96, + 27, + 239, + 255, + 130, + 109, + 128, + 112, + 48, + 127, + 254, + 3, + 46, + 1, + 192, + 68, + 255, + 249, + 26, + 152, + 7, + 1, + 11, + 255, + 224, + 153, + 96, + 28, + 16, + 15, + 255, + 69, + 128, + 112, + 18, + 63, + 254, + 70, + 166, + 1, + 192, + 67, + 255, + 248, + 38, + 56, + 7, + 4, + 7, + 255, + 208, + 224, + 28, + 4, + 143, + 255, + 145, + 169, + 128, + 112, + 16, + 255, + 254, + 9, + 142, + 1, + 193, + 1, + 255, + 244, + 56, + 7, + 1, + 35, + 255, + 228, + 106, + 96, + 28, + 4, + 63, + 255, + 130, + 99, + 128, + 112, + 64, + 127, + 253, + 14, + 1, + 192, + 72, + 255, + 249, + 26, + 152, + 7, + 1, + 15, + 255, + 224, + 152, + 224, + 28, + 16, + 31, + 255, + 67, + 128, + 112, + 18, + 63, + 254, + 70, + 166, + 1, + 192, + 67, + 255, + 248, + 38, + 56, + 7, + 4, + 83, + 255, + 199, + 96, + 28, + 4, + 207, + 255, + 145, + 161, + 128, + 112, + 16, + 255, + 254, + 9, + 142, + 1, + 193, + 20, + 255, + 241, + 216, + 7, + 1, + 51, + 255, + 228, + 104, + 96, + 28, + 4, + 63, + 255, + 130, + 99, + 128, + 112, + 69, + 63, + 252, + 118, + 1, + 192, + 76, + 255, + 249, + 26, + 24, + 7, + 1, + 15, + 255, + 224, + 152, + 224, + 28, + 17, + 79, + 255, + 29, + 128, + 112, + 19, + 63, + 254, + 70, + 134, + 1, + 192, + 67, + 255, + 248, + 38, + 56, + 7, + 4, + 83, + 255, + 199, + 96, + 28, + 4, + 207, + 255, + 145, + 161, + 128, + 112, + 16, + 255, + 254, + 9, + 142, + 1, + 193, + 117, + 255, + 249, + 25, + 120, + 7, + 1, + 15, + 255, + 224, + 152, + 224, + 28, + 23, + 95, + 255, + 145, + 151, + 128, + 112, + 16, + 255, + 254, + 9, + 142, + 1, + 193, + 117, + 255, + 249, + 25, + 120, + 7, + 1, + 15, + 255, + 224, + 152, + 224, + 28, + 23, + 95, + 255, + 145, + 151, + 128, + 112, + 16, + 191, + 254, + 9, + 150, + 1, + 193, + 117, + 255, + 249, + 25, + 120, + 6, + 251, + 255, + 224, + 155, + 96, + 28, + 23, + 95, + 255, + 145, + 151, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 193, + 117, + 255, + 249, + 25, + 120, + 6, + 251, + 255, + 224, + 155, + 96, + 28, + 23, + 95, + 255, + 145, + 151, + 128, + 111, + 191, + 254, + 9, + 182, + 1, + 193, + 117, + 255, + 249, + 25, + 120, + 6, + 231, + 255, + 224, + 164, + 224, + 28, + 22, + 127, + 255, + 145, + 151, + 128, + 110, + 127, + 254, + 10, + 78, + 1, + 193, + 103, + 255, + 249, + 25, + 120, + 6, + 231, + 255, + 224, + 164, + 224, + 28, + 22, + 127, + 255, + 145, + 151, + 128, + 110, + 127, + 254, + 10, + 78, + 1, + 193, + 103, + 255, + 249, + 25, + 120, + 6, + 231, + 255, + 224, + 165, + 96, + 28, + 22, + 111, + 255, + 145, + 151, + 128, + 106, + 191, + 254, + 10, + 238, + 1, + 191, + 255, + 239, + 128, + 112, + 74, + 63, + 254, + 70, + 14, + 1, + 170, + 255, + 248, + 43, + 184, + 6, + 255, + 255, + 190, + 1, + 193, + 40, + 255, + 249, + 24, + 56, + 6, + 171, + 255, + 224, + 174, + 224, + 27, + 255, + 254, + 248, + 7, + 4, + 163, + 255, + 228, + 96, + 224, + 26, + 175, + 255, + 130, + 187, + 128, + 111, + 255, + 251, + 224, + 28, + 18, + 143, + 255, + 145, + 131, + 128, + 106, + 191, + 254, + 10, + 238, + 1, + 190, + 255, + 240, + 152, + 7, + 4, + 163, + 255, + 228, + 101, + 96, + 25, + 207, + 255, + 130, + 207, + 128, + 106, + 255, + 253, + 166, + 1, + 193, + 6, + 255, + 249, + 25, + 88, + 6, + 115, + 255, + 224, + 179, + 224, + 26, + 191, + 255, + 105, + 128, + 112, + 65, + 191, + 254, + 70, + 86, + 1, + 156, + 255, + 248, + 44, + 248, + 6, + 175, + 255, + 218, + 96, + 28, + 16, + 111, + 255, + 145, + 149, + 128, + 103, + 63, + 254, + 11, + 62, + 1, + 171, + 255, + 246, + 152, + 7, + 4, + 27, + 255, + 228, + 101, + 96, + 25, + 207, + 255, + 130, + 207, + 128, + 106, + 255, + 253, + 174, + 1, + 193, + 5, + 255, + 249, + 75, + 56, + 6, + 75, + 255, + 224, + 43, + 224, + 28, + 15, + 47, + 255, + 148, + 179, + 128, + 100, + 191, + 254, + 2, + 190, + 1, + 192, + 242, + 255, + 249, + 75, + 56, + 6, + 75, + 255, + 224, + 43, + 224, + 28, + 15, + 47, + 255, + 148, + 179, + 128, + 100, + 191, + 254, + 2, + 190, + 1, + 192, + 242, + 255, + 249, + 75, + 56, + 6, + 75, + 255, + 224, + 43, + 224, + 28, + 15, + 47, + 255, + 149, + 157, + 128, + 112, + 58, + 63, + 254, + 86, + 118, + 1, + 192, + 232, + 255, + 249, + 89, + 216, + 7, + 3, + 163, + 255, + 229, + 103, + 96, + 28, + 14, + 143, + 255, + 149, + 157, + 128, + 112, + 58, + 63, + 254, + 86, + 150, + 1, + 192, + 228, + 255, + 249, + 90, + 88, + 7, + 3, + 147, + 255, + 229, + 105, + 224, + 28, + 14, + 63, + 255, + 149, + 167, + 128, + 112, + 56, + 255, + 254, + 86, + 158, + 1, + 192, + 227, + 255, + 249, + 92, + 216, + 7, + 2, + 111, + 255, + 198, + 224, + 24, + 159, + 255, + 9, + 128, + 99, + 127, + 254, + 87, + 134, + 1, + 192, + 155, + 255, + 241, + 184, + 6, + 39, + 255, + 194, + 96, + 24, + 223, + 255, + 149, + 225, + 128, + 112, + 38, + 191, + 252, + 118, + 1, + 137, + 255, + 240, + 152, + 6, + 55, + 255, + 229, + 120, + 96, + 28, + 9, + 175, + 255, + 29, + 128, + 98, + 127, + 252, + 38, + 1, + 141, + 255, + 249, + 102, + 152, + 7, + 1, + 55, + 255, + 229, + 180, + 224, + 28, + 4, + 223, + 255, + 150, + 211, + 128, + 112, + 19, + 127, + 254, + 91, + 78, + 1, + 192, + 77, + 255, + 249, + 109, + 56, + 7, + 1, + 55, + 255, + 229, + 185, + 224, + 28, + 4, + 63, + 255, + 150, + 231, + 128, + 112, + 16, + 255, + 254, + 91, + 158, + 1, + 192, + 67, + 255, + 249, + 110, + 120, + 7, + 1, + 15, + 255, + 229, + 185, + 224, + 28, + 4, + 63, + 255, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 31, + 255, + 252, + 3, + 255, + 255, + 128, + 127, + 255, + 240, + 15, + 255, + 254, + 1, + 255, + 255, + 192, + 63, + 255, + 248, + 7, + 255, + 255, + 0, + 255, + 255, + 224, + 30, + 121, + 44, + 0 + ], + "labels": [ + "Cloud Shadow" + ] + }, + "id": "zhJYp7Ak94", + "from_name": "labels_1", + "to_name": "image_1", + "type": "labels", + "origin": "manual" + } + ] + } + ], + "data": { + "image": "https://storage.googleapis.com/brad-neuberg-label-studio/opensource/label-studio/examples/images/magic_wand_scale_1_20200902_015806_26_2235_1B_AnalyticMS_00750_00750.jpg" + }, + "id": 1, + "task_path": "../examples/image_magic_wand/tasks.json" +} diff --git a/examples/image_magic_wand/config.xml b/examples/image_magic_wand/config.xml new file mode 100644 index 000000000..3bbaf4416 --- /dev/null +++ b/examples/image_magic_wand/config.xml @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/examples/image_magic_wand/gcp_cors_config.json b/examples/image_magic_wand/gcp_cors_config.json new file mode 100644 index 000000000..ce8baa5c4 --- /dev/null +++ b/examples/image_magic_wand/gcp_cors_config.json @@ -0,0 +1,8 @@ +[ + { + "origin": ["*"], + "responseHeader": ["*"], + "method": ["GET"], + "maxAgeSeconds": 3600 + } + ] \ No newline at end of file diff --git a/examples/image_magic_wand/index.js b/examples/image_magic_wand/index.js new file mode 100644 index 000000000..a7d6ce624 --- /dev/null +++ b/examples/image_magic_wand/index.js @@ -0,0 +1,5 @@ +import config from './config.xml'; +import tasks from './tasks.json'; +import annotation from './annotations/1.json'; + +export const ImageMagicWand = { config, tasks, annotation }; diff --git a/examples/image_magic_wand/tasks.json b/examples/image_magic_wand/tasks.json new file mode 100644 index 000000000..ea4659331 --- /dev/null +++ b/examples/image_magic_wand/tasks.json @@ -0,0 +1,16 @@ +[ + { + "id": 1202, + "data": { + "image": [ + "http://htx-pub.s3.amazonaws.com/samples/magicwand/magic_wand_scale_1_20200902_015806_26_2235_1B_AnalyticMS_00750_00750.jpg", + "http://htx-pub.s3.amazonaws.com/samples/magicwand/magic_wand_scale_2_20200902_015806_26_2235_1B_AnalyticMS_00750_00750.jpg", + "http://htx-pub.s3.amazonaws.com/samples/magicwand/magic_wand_scale_3_20200902_015806_26_2235_1B_AnalyticMS_00750_00750.jpg", + "http://htx-pub.s3.amazonaws.com/samples/magicwand/magic_wand_false_color_20200902_015806_26_2235_1B_AnalyticMS_00750_00750.jpg" + ], + "thumb": "http://htx-pub.s3.amazonaws.com/samples/magicwand/magic_wand_thumbnail_20200902_015806_26_2235_1B_AnalyticMS_00750_00750.jpg" + }, + "annotations": [], + "predictions": [] + } +] \ No newline at end of file diff --git a/images/magicwand_example.gif b/images/magicwand_example.gif new file mode 100644 index 000000000..4d853e85d Binary files /dev/null and b/images/magicwand_example.gif differ diff --git a/images/screenshots/image_magic_wand.png b/images/screenshots/image_magic_wand.png new file mode 100644 index 000000000..a3f92b3fe Binary files /dev/null and b/images/screenshots/image_magic_wand.png differ diff --git a/src/assets/icons/index.tsx b/src/assets/icons/index.tsx index efdef133b..921ef2b2f 100644 --- a/src/assets/icons/index.tsx +++ b/src/assets/icons/index.tsx @@ -48,6 +48,7 @@ export { ReactComponent as IconRectangleTool } from './tools/rectangle-tool.svg' export { ReactComponent as IconRectangleToolSmart } from './tools/rectangle-tool-smart.svg'; export { ReactComponent as IconRectangle3PointTool } from './tools/rectangle-3point-tool.svg'; export { ReactComponent as IconRectangle3PointToolSmart } from './tools/rectangle-3point-tool-smart.svg'; +export { ReactComponent as IconMagicWandTool } from './tools/magic-wand-tool.svg'; export { ReactComponent as IconEraserTool } from './tools/eraser-tool.svg'; export { ReactComponent as IconHandTool } from './tools/hand-tool.svg'; export { ReactComponent as IconBrightnessTool } from './tools/brightness-tool.svg'; diff --git a/src/assets/icons/tools/magic-wand-tool.svg b/src/assets/icons/tools/magic-wand-tool.svg new file mode 100644 index 000000000..879e040bd --- /dev/null +++ b/src/assets/icons/tools/magic-wand-tool.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/src/components/ImageView/ImageView.js b/src/components/ImageView/ImageView.js index fa8126931..8d0114b44 100644 --- a/src/components/ImageView/ImageView.js +++ b/src/components/ImageView/ImageView.js @@ -20,7 +20,7 @@ import ResizeObserver from '../../utils/resize-observer'; import { debounce } from '../../utils/debounce'; import Constants from '../../core/Constants'; import { fixRectToFit } from '../../utils/image'; -import { FF_DEV_1285, FF_DEV_1442, FF_DEV_3077, isFF } from '../../utils/feature-flags'; +import { FF_DEV_1285, FF_DEV_1442, FF_DEV_3077, FF_DEV_4081, isFF } from '../../utils/feature-flags'; Konva.showWarnings = false; @@ -890,8 +890,20 @@ export default observer( src={item._value} onLoad={item.updateImageSize} onError={this.handleError} + crossOrigin={item.imageCrossOrigin} alt="LS" /> + {isFF(FF_DEV_4081) + ? ( + { + item.setOverlayRef(ref); + }} + style={item.imageTransform} + /> + ) + : null} {/* @todo this is dirty hack; rewrite to proper async waiting for data to load */} {item.stageWidth <= 1 ? (item.hasTools ?
: null) : ( diff --git a/src/components/ImageView/ImageView.module.scss b/src/components/ImageView/ImageView.module.scss index 2d7de1490..197b3522f 100644 --- a/src/components/ImageView/ImageView.module.scss +++ b/src/components/ImageView/ImageView.module.scss @@ -88,8 +88,8 @@ width: 100%; height: 100%; - // padding hack to fill the empty space with given aspect ratio - // see ImageView.render() + // padding hack to fill the empty space with given aspect ratio + // see ImageView.render() .frame { position: absolute; overflow: hidden; @@ -103,6 +103,12 @@ position: relative; overflow: hidden; } + .overlay { + position: absolute; + top: 0; + pointer-events: none; + z-index: 100; + } img { position: absolute; diff --git a/src/components/Toolbar/Tool.js b/src/components/Toolbar/Tool.js index d1d38e61a..dafaa7951 100644 --- a/src/components/Toolbar/Tool.js +++ b/src/components/Toolbar/Tool.js @@ -71,7 +71,7 @@ export const Tool = ({ if (shortcut && !hotkeys.hasKey(shortcut)) { hotkeys.addKey(shortcut, () => { if(!tool?.disabled && !tool?.annotation?.isDrawing) { - if (tool?.isDrawingTool){ + if (tool?.unselectRegionOnToolChange){ tool.annotation.unselectAreas(); } onClick?.(); @@ -124,7 +124,7 @@ export const Tool = ({ }} onClick={(e) => { if(!disabled && !isAnnotationDrawing) { e.preventDefault(); - if(tool?.isDrawingTool) { + if(tool?.unselectRegionOnToolChange) { tool?.annotation?.unselectAreas?.(); } onClick?.(e); diff --git a/src/core/Registry.ts b/src/core/Registry.ts index bddc9dd8d..1a61b6c36 100644 --- a/src/core/Registry.ts +++ b/src/core/Registry.ts @@ -1,3 +1,5 @@ +import { FF_DEV_4081, isFF } from '../utils/feature-flags'; + /** * Class for register View */ @@ -75,6 +77,10 @@ class _Registry { getTool(name: string) { const model = this.tools[name]; + if (name === 'magicwand' && !isFF(FF_DEV_4081)) { + throw new Error('The magicwand feature flag is not on'); + } + if (!model) { const models = Object.keys(this.tools); @@ -92,6 +98,10 @@ class _Registry { getModelByTag(tag: string) { const model = this.models[tag]; + if (tag === 'magicwand' && !isFF(FF_DEV_4081)) { + throw new Error('magicwand feature flag (fflag_fix_front_dev_3391_interactive_view_all) is not on'); + } + if (!model) { const models = Object.keys(this.models); diff --git a/src/core/TimeTraveller.js b/src/core/TimeTraveller.js index 207d3d4ee..ad0ad2dda 100644 --- a/src/core/TimeTraveller.js +++ b/src/core/TimeTraveller.js @@ -114,7 +114,7 @@ const TimeTraveller = types if (!targetStore) throw new Error( - 'Failed to find target store for TimeTraveller. Please provide `targetPath` property, or a `targetStore` in the environment', + 'Failed to find target store for TimeTraveller. Please provide `targetPath` property, or a `targetStore` in the environment', ); // start listening to changes snapshotDisposer = onSnapshot(targetStore, snapshot => this.addUndoState(snapshot)); diff --git a/src/core/feature-flags/flags.json b/src/core/feature-flags/flags.json index 13139c18b..57ea1abd7 100644 --- a/src/core/feature-flags/flags.json +++ b/src/core/feature-flags/flags.json @@ -2,5 +2,6 @@ "ff_front_1170_outliner_030222_short": true, "ff_front_DEV_1713_audio_ui_150222_short": false, "ff_front_DEV_2715_audio_3_280722_short": true, - "fflag_fix_front_dev_3391_interactive_view_all": false + "fflag_fix_front_dev_3391_interactive_view_all": false, + "fflag_feat_front_dev_4081_magic_wand_tool": false } diff --git a/src/env/development.js b/src/env/development.js index 9815f5599..c7552e92f 100644 --- a/src/env/development.js +++ b/src/env/development.js @@ -37,6 +37,7 @@ import { ImageOCR } from '../examples/image_ocr'; import { ImagePolygons } from '../examples/image_polygons'; import { ImageSegmentation } from '../examples/image_segmentation'; import { ImageTools } from '../examples/image_tools'; +import { ImageMagicWand } from '../examples/image_magic_wand'; /** * HTML diff --git a/src/mixins/DrawingTool.js b/src/mixins/DrawingTool.js index e58a3a80e..26e1e2437 100644 --- a/src/mixins/DrawingTool.js +++ b/src/mixins/DrawingTool.js @@ -9,6 +9,7 @@ const DrawingTool = types .model('DrawingTool', { default: true, mode: types.optional(types.enumeration(['drawing', 'viewing']), 'viewing'), + unselectRegionOnToolChange: true, }) .volatile(() => { return { diff --git a/src/regions/BrushRegion.js b/src/regions/BrushRegion.js index 4af01552b..d09ed574c 100644 --- a/src/regions/BrushRegion.js +++ b/src/regions/BrushRegion.js @@ -1,4 +1,4 @@ -import React, { useCallback, useContext, useMemo, useRef, useState } from 'react'; +import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'; import { Group, Image, Layer, Shape } from 'react-konva'; import { observer } from 'mobx-react'; import { getParent, getRoot, hasParent, types } from 'mobx-state-tree'; @@ -19,6 +19,7 @@ import { RegionWrapper } from './RegionWrapper'; import { Geometry } from '../components/RelationsOverlay/Geometry'; import { ImageViewContext } from '../components/ImageView/ImageViewContext'; import IsReadyMixin from '../mixins/IsReadyMixin'; +import { FF_DEV_4081, isFF } from '../utils/feature-flags'; const highlightOptions = { shadowColor: 'red', @@ -121,6 +122,8 @@ const Model = types rle: types.frozen(), + maskDataURL: types.frozen(), + touches: types.array(Points), currentTouch: types.maybeNull(types.reference(Points)), }) @@ -311,6 +314,20 @@ const Model = types annotation.autosave && setTimeout(() => annotation.autosave()); }, + endUpdatedMaskDataURL(maskDataURL) { + const { annotation } = self.object; + + // will resume in the next tick... + annotation.startAutosave(); + + self.maskDataURL = maskDataURL; + + self.notifyDrawingFinished(); + + // ...so we run this toggled function also delayed + annotation.autosave && setTimeout(() => annotation.autosave()); + }, + convertPointsToMask() {}, setScale(x, y) { @@ -376,6 +393,7 @@ const Model = types value.rle = self.rle; if (self.touches.length) value.touches = self.touches; + if (self.maskDataURL) value.maskDataURL = self.maskDataURL; } else { const rle = Canvas.Region2RLE(self, object); @@ -460,20 +478,43 @@ const HtxBrushView = ({ item }) => { const { suggestion } = useContext(ImageViewContext) ?? {}; // Prepare brush stroke from RLE with current stroke color - useMemo(() => { - if (!item.rle || !item.parent || item.parent.naturalWidth <=1 || item.parent.naturalHeight <= 1) return; - const img = Canvas.RLE2Region(item.rle, item.parent, { color: item.strokeColor }); + useEffect(async function() { - img.onload = () => { - setImage(img); - item.setReady(true); - }; + // Two possible ways to draw an image from precreated data: + // - rle - An RLE encoded RGBA image + // - maskDataURL - an RGBA mask encoded as an image data URL that can be directly placed into + // an image without having to go through an RLE encode/decode loop to save performance for tools + // that dynamically produce image masks. + + if (!item.rle && !item.maskDataURL) return; + if (!item.parent || item.parent.naturalWidth <=1 || item.parent.naturalHeight <= 1) return; + + let img; + + if (item.maskDataURL && isFF(FF_DEV_4081)) { + img = await Canvas.maskDataURL2Image(item.maskDataURL, { color: item.strokeColor }); + } else if (item.rle) { + img = Canvas.RLE2Region(item.rle, item.parent, { color: item.strokeColor }); + } + + if (img) { + img.onload = () => { + setImage(img); + item.setReady(true); + }; + } }, [ item.rle, + item.maskDataURL, + item.maskBoundsMinX, + item.maskBoundsMinY, + item.maskBoundsMaxX, + item.maskBoundsMaxY, item.parent, item.parent?.naturalWidth, item.parent?.naturalHeight, item.strokeColor, + item.opacity, ]); // Drawing hit area by shape color to detect interactions inside the Konva @@ -513,7 +554,7 @@ const HtxBrushView = ({ item }) => { const drawCallback = useMemo(()=>{ let done = false; - return () => { + return async function() { const { highlighted } = highlightedRef.current; const layer = layerRef.current; const isDrawing = item.parent?.drawingRegion === item; @@ -548,6 +589,7 @@ const HtxBrushView = ({ item }) => { item.parent?.zoomingPositionY, item.parent?.stageWidth, item.parent?.stageHeight, + item.maskDataURL, item.rle, image, ]); @@ -667,6 +709,6 @@ const HtxBrushView = ({ item }) => { const HtxBrush = AliveRegion(HtxBrushView, { renderHidden: true }); Registry.addTag('brushregion', BrushRegionModel, HtxBrush); -Registry.addRegionType(BrushRegionModel, 'image', value => value.rle || value.touches); +Registry.addRegionType(BrushRegionModel, 'image', value => value.rle || value.touches || value.maskDataURL); export { BrushRegionModel, HtxBrush }; diff --git a/src/regions/Result.js b/src/regions/Result.js index 1cf97f8e9..0729d5bed 100644 --- a/src/regions/Result.js +++ b/src/regions/Result.js @@ -41,6 +41,7 @@ const Result = types 'polygon', 'brush', 'ellipse', + 'magicwand', 'rectanglelabels', 'keypointlabels', 'polygonlabels', diff --git a/src/tags/control/Brush.js b/src/tags/control/Brush.js index fa053c3f5..d03bc5d0f 100644 --- a/src/tags/control/Brush.js +++ b/src/tags/control/Brush.js @@ -40,6 +40,7 @@ const TagAttrs = types.model({ const Model = types .model({ type: 'brush', + removeDuplicatesNamed: 'Erase', }) .views(self => ({ get hasStates() { diff --git a/src/tags/control/KeyPoint.js b/src/tags/control/KeyPoint.js index b33f78dbb..b9703b10e 100644 --- a/src/tags/control/KeyPoint.js +++ b/src/tags/control/KeyPoint.js @@ -42,7 +42,6 @@ const TagAttrs = types.model({ const Model = types .model({ type: 'keypoint', - isDrawingTool: true, // tools: types.array(BaseTool) }) .views(self => ({ diff --git a/src/tags/control/MagicWand.js b/src/tags/control/MagicWand.js new file mode 100644 index 000000000..7a196bf13 --- /dev/null +++ b/src/tags/control/MagicWand.js @@ -0,0 +1,137 @@ +import { types } from 'mobx-state-tree'; + +import Registry from '../../core/Registry'; +import ControlBase from './Base'; +import { customTypes } from '../../core/CustomTypes'; +import { AnnotationMixin } from '../../mixins/AnnotationMixin'; +import SeparatedControlMixin from '../../mixins/SeparatedControlMixin'; +import { ToolManagerMixin } from '../../mixins/ToolManagerMixin'; + +/** + * The `Magicwand` tag makes it possible to click in a region of an image a user is doing segmentation + * labeling on, drag the mouse to dynamically change flood filling tolerance, then release the mouse button + * to get a new labeled area. It is particularly effective at segmentation labeling broad, diffuse, complex + * edged objects, such as clouds, cloud shadows, snow, etc. in earth observation applications or organic + * shapes in biomedical applications. + * + * Use with the following data types: image. + * + * Zooming is supported for the Magic Wand, but it will not work on rotated images. + * + * Example of the Magic Wand in use: + * + * ![Animated GIF showing Magic Wand clicking on cloud and dragging, automatically segmenting and selecting + * pixels to create a mask](../images/magicwand_example.gif) + * + * ### Feature Flag + * + * The Magic Wand is currently turned off by default behind a feature flag. If you want to turn it on, you + * must enable it by either: + * - Setting an environment variable when starting the Label Studio server, either by starting up the + * server with `fflag_feat_front_dev_4081_magic_wand_tool=1 label-studio`, or manually finding the flag + * `flag_feat_front_dev_4081_magic_wand_tool` and setting it to true. + * + * ### CORS Configuration + * + * The Magic Wand requires pixel-level access to images that are being labelled in order to do its + * thresholding and flood filling. If you are hosting your images to label on a third-party domain, + * you will need to enable CORS headers for the Magic Wand to work with cross domain HTTP `GET` + * requests in order for the Magic Wand to be able to threshold the actual image pixel data. See the + * [Label Studio storage guide](../guide/storage.html#Troubleshoot-CORS-and-access-problems) for more + * details on configuring CORS. + * + * ### `Image` Tag Configuration + * + * The `Magicwand` tag is configured to work with an `Image` tag that it will operate on for labeling. + * If you are storing an image cross-domain that the `Image` tag will reference, you will have to + * correctly setup the `crossOrigin` on the `Image` attribute. This attribute mimics the same + * `crossOrigin` attribute that a normal DOM `img` tag would + * have ([reference])(https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/crossOrigin). + * + * If the image is on a public server or Google/AWS/Azure bucket that is publically readable + * without any authentication, you should set `crossOrigin` to `anonymous`. + * + * If the image is on a server or a private cloud bucket that requires authentication of any + * kind (i.e. the request must have HTTP headers that prove authentication set along with the + * third party request), then you should set `crossOrigin` to `use-credentials`. Note that Google's + * cloud buckets [do not support authenticated requests for CORS requests](https://cloud.google.com/storage/docs/cross-origin#additional_considerations), + * which means you either need to make that Google bucket world readable to work with the Magic Wand, or + * use Label Studio's signed URL support ([AWS](../guide/storage.html#Set-up-connection-in-the-Label-Studio-UI), + * [GCP](../guide/storage.html#Set-up-connection-in-the-Label-Studio-UI-1), and + * [Azure](../guide/storage.html#Set-up-connection-in-the-Label-Studio-UI-2)). + * + * If the image is on the same host as your Label Studio instance, you can simply leave off the + * `crossOrigin` attribute or set it to `none`. + * + * @example + * + * + * + * + * + * + * + * @example + * + * + * + * + * + * + * + * + * @name Magicwand + * @regions BrushRegion + * @meta_title Magic Wand Tag for Quick Thresholded Flood Filling During Image Segmentation + * @meta_description Customize Label Studio with a Magic Wand tag to quickly click and drag to threshold flood fill image areas during image segmentation labeling for machine learning and data science projects. + * @param {string} name - Name of the element + * @param {string} toName - Name of the image to label + * @param {float=} [opacity=0.6] - Opacity of the Magic Wand region during use + * @param {number=} [blurradius=5] - The edges of a Magic Wand region are blurred and simplified, this is the radius of the blur kernel + * @param {number=} [defaultthreshold=15] - When the user initially clicks without dragging, how far a color has to be from the initial selected pixel to also be selected + */ + +const TagAttrs = types.model({ + name: types.identifier, + toname: types.maybeNull(types.string), + opacity: types.optional(customTypes.range(), '0.6'), + blurradius: types.optional(types.string, '5'), + defaultthreshold: types.optional(types.string, '15'), +}); + +const Model = types + .model({ + type: 'magicwand', + removeDuplicatesNamed: 'Erase', + }) + .views(self => ({ + get hasStates() { + const states = self.states(); + + return states && states.length > 0; + }, + })) + .volatile(() => ({ + toolNames: ['MagicWand', 'Erase'], + })); + +const MagicWandModel = types.compose('MagicWandModel', + ControlBase, + AnnotationMixin, + SeparatedControlMixin, + TagAttrs, + Model, + ToolManagerMixin, +); + +const HtxView = () => { + return null; +}; + +Registry.addTag('magicwand', MagicWandModel, HtxView); + +export { HtxView, MagicWandModel }; \ No newline at end of file diff --git a/src/tags/control/index.js b/src/tags/control/index.js index cb738f201..ea7d42a0c 100644 --- a/src/tags/control/index.js +++ b/src/tags/control/index.js @@ -28,6 +28,8 @@ import { EllipseModel } from './Ellipse'; import { RelationsModel } from './Relations'; import { RelationModel } from './Relation'; +import { MagicWandModel } from './MagicWand'; + export { LabelsModel, BrushLabelsModel, @@ -54,6 +56,7 @@ export { EllipseModel, RelationsModel, RelationModel, + MagicWandModel, VideoRectangleModel, ParagraphLabelsModel }; diff --git a/src/tags/object/Image.js b/src/tags/object/Image.js index fdeb9312c..b8e7dba3c 100644 --- a/src/tags/object/Image.js +++ b/src/tags/object/Image.js @@ -17,7 +17,7 @@ import { AnnotationMixin } from '../../mixins/AnnotationMixin'; import { clamp } from '../../utils/utilities'; import { guidGenerator } from '../../utils/unique'; import { IsReadyWithDepsMixin } from '../../mixins/IsReadyMixin'; -import { FF_DEV_3377, FF_DEV_3666, isFF } from '../../utils/feature-flags'; +import { FF_DEV_3377, FF_DEV_3666, FF_DEV_4081, isFF } from '../../utils/feature-flags'; /** * The `Image` tag shows an image on the page. Use for all image annotation tasks to display an image on the labeling interface. @@ -53,6 +53,7 @@ import { FF_DEV_3377, FF_DEV_3666, isFF } from '../../utils/feature-flags'; * @param {string} [horizontalAlignment="left"] - Where to align image horizontally. Can be one of "left", "center" or "right" * @param {string} [verticalAlignment="top"] - Where to align image vertically. Can be one of "top", "center" or "bottom" * @param {string} [defaultZoom="fit"] - Specify the initial zoom of the image within the viewport while preserving it’s ratio. Can be one of "auto", "original" or "fit" + * @param {string} [crossOrigin="none"] - Configures CORS cross domain behavior for this image, either "none", "anonymous", or "use-credentials", similar to [DOM `img` crossOrigin property](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/crossOrigin). */ const TagAttrs = types.model({ value: types.maybeNull(types.string), @@ -87,6 +88,8 @@ const TagAttrs = types.model({ horizontalalignment: types.optional(types.enumeration(['left', 'center', 'right']), 'left'), verticalalignment: types.optional(types.enumeration(['top', 'center', 'bottom']), 'top'), defaultzoom: types.optional(types.enumeration(['auto', 'original', 'fit']), 'fit'), + + crossorigin: types.optional(types.enumeration(['none', 'anonymous', 'use-credentials']), 'none'), }); const IMAGE_CONSTANTS = { @@ -376,6 +379,18 @@ const Model = types.model({ return !!self.getToolsManager().allTools()?.length; }, + get imageCrossOrigin() { + const value = self.crossorigin.toLowerCase(); + + if (!isFF(FF_DEV_4081)) { + return null; + } else if (!value || value === 'none') { + return null; + } else { + return value; + } + }, + get fillerHeight() { if (self.isSideways) { return `${self.naturalWidth / self.naturalHeight * 100}%`; @@ -814,6 +829,10 @@ const Model = types.model({ currentTool?.updateCursor?.(); }, + setOverlayRef(ref) { + self.overlayRef = ref; + }, + // @todo remove setSelected() { // self.selectedShape = shape; diff --git a/src/tags/object/PagedView.js b/src/tags/object/PagedView.js index f2694b60d..7fcdf5d8b 100644 --- a/src/tags/object/PagedView.js +++ b/src/tags/object/PagedView.js @@ -32,6 +32,7 @@ const Model = types.model({ 'polygon', 'keypoint', 'brush', + 'magicwand', 'rectanglelabels', 'ellipselabels', 'polygonlabels', diff --git a/src/tags/visual/View.js b/src/tags/visual/View.js index 97582aacd..06b292349 100644 --- a/src/tags/visual/View.js +++ b/src/tags/visual/View.js @@ -62,6 +62,7 @@ const Model = types 'polygon', 'keypoint', 'brush', + 'magicwand', 'rectanglelabels', 'ellipselabels', 'polygonlabels', diff --git a/src/tools/Base.js b/src/tools/Base.js index 3870ee1b1..84ee1d200 100644 --- a/src/tools/Base.js +++ b/src/tools/Base.js @@ -24,7 +24,8 @@ const ToolView = observer(({ item }) => { const BaseTool = types .model('BaseTool', { smart: false, - isDrawingTool: false, + unselectRegionOnToolChange: false, + removeDuplicatesNamed: types.maybeNull(types.string), }) .volatile(() => ({ dynamic: false, @@ -91,7 +92,7 @@ const BaseTool = types smartCopy.makeDynamic(); - getEnv(self).manager.addTool(`${toolType.name}-smart`, smartCopy); + getEnv(self).manager.addTool(`${toolType.name}-smart`, smartCopy, self.control.removeDuplicatesNamed); } }, diff --git a/src/tools/Brush.js b/src/tools/Brush.js index c676bad85..2fe2cf4c9 100644 --- a/src/tools/Brush.js +++ b/src/tools/Brush.js @@ -10,7 +10,7 @@ import { DrawingTool } from '../mixins/DrawingTool'; import { Tool } from '../components/Toolbar/Tool'; import { Range } from '../common/Range/Range'; import { NodeViews } from '../components/Node/Node'; -import { FF_DEV_3666, isFF } from '../utils/feature-flags'; +import { FF_DEV_3666, FF_DEV_4081, isFF } from '../utils/feature-flags'; const MIN_SIZE = 1; const MAX_SIZE = 50; @@ -53,7 +53,7 @@ const _Tool = types group: 'segmentation', shortcut: 'B', smart: true, - isDrawingTool: true, + unselectRegionOnToolChange: isFF(FF_DEV_4081) ? false : true, }) .views(self => ({ get viewClass() { diff --git a/src/tools/Ellipse.js b/src/tools/Ellipse.js index 2a437e3a2..4ecda3540 100644 --- a/src/tools/Ellipse.js +++ b/src/tools/Ellipse.js @@ -9,7 +9,6 @@ const _Tool = types .model('EllipseTool', { group: 'segmentation', shortcut: 'O', - isDrawingTool: true, }) .views(self => { const Super = { diff --git a/src/tools/Erase.js b/src/tools/Erase.js index 13482e445..ad6b8dae4 100644 --- a/src/tools/Erase.js +++ b/src/tools/Erase.js @@ -51,7 +51,7 @@ const _Tool = types .model('EraserTool', { strokeWidth: types.optional(types.number, 10), group: 'segmentation', - isDrawingTool: false, + unselectRegionOnToolChange: false, }) .volatile(() => ({ index: 9999, diff --git a/src/tools/FloodFill.js b/src/tools/FloodFill.js deleted file mode 100644 index 6dd8598b8..000000000 --- a/src/tools/FloodFill.js +++ /dev/null @@ -1,104 +0,0 @@ -import React from 'react'; -import { observer } from 'mobx-react'; -import { types } from 'mobx-state-tree'; - -import BaseTool from './Base'; -import SliderTool from '../components/Tools/Slider'; -import ToolMixin from '../mixins/Tool'; -import { PolygonRegionModel } from '../regions/PolygonRegion'; -import { calcBorder, getImageData } from '../utils/floodfill'; -import { guidGenerator } from '../core/Helpers'; - -const DEF_THRESHOLD = 10; - -const ToolView = observer(({ item }) => { - return ( - { - const sel = item.selected; - - item.manager.selectTool(item, !sel); - }} - onChange={val => { - item.setThreshold(val); - }} - /> - ); -}); - -const _Tool = types - .model('FloodFillTool', { - threshold: types.optional(types.number, DEF_THRESHOLD), - group: 'segmentation', - isDrawingTool: true, - }) - .views(self => ({ - get viewClass() { - return () => ; - }, - })) - .actions(self => ({ - setThreshold(val) { - self.threshold = val; - }, - - mouseupEv() { - self.mode = 'viewing'; - }, - - mousemoveEv() { - if (self.mode !== 'drawing') return; - }, - - createPolygonRegion(points) { - const { states, strokecolor } = {}; - const c = self.control; - - const p = PolygonRegionModel.create({ - id: guidGenerator(), - - opacity: parseFloat(c.opacity), - fillcolor: c.fillcolor, - - strokewidth: parseInt(c.strokewidth), - strokecolor, - - pointsize: c.pointsize, - pointstyle: c.pointstyle, - - states, - - coordstype: 'px', - }); - - points.forEach(t => p.addPoint(t.x, t.y)); - self.obj.addShape(p); - - p.closePoly(); - - return p; - }, - - clickEv(ev, [x, y]) { - const image = self.obj; - const imageRef = image.imageRef; - const imageData = getImageData(imageRef); - const points = calcBorder(imageData.data, image.naturalWidth, image.naturalHeight, x, y, self.threshold, true); - - if (points) self.createPolygonRegion(points); - - self.control.unselectAll(); - }, - - mousedownEv() { - self.mode = 'drawing'; - }, - })); - -const FloodFill = types.compose(_Tool.name, ToolMixin, _Tool, BaseTool); - -export { FloodFill }; diff --git a/src/tools/KeyPoint.js b/src/tools/KeyPoint.js index 32be0ef02..08bf48e5a 100644 --- a/src/tools/KeyPoint.js +++ b/src/tools/KeyPoint.js @@ -12,7 +12,6 @@ const _Tool = types group: 'segmentation', shortcut: 'K', smart: true, - isDrawingTool: true, }) .views(() => ({ get tagTypes() { diff --git a/src/tools/LiveWire.js b/src/tools/LiveWire.js index d13f29a7c..59e5f9b4b 100644 --- a/src/tools/LiveWire.js +++ b/src/tools/LiveWire.js @@ -21,7 +21,6 @@ const ToolView = observer(({ item }) => { const _Tool = types .model('LiveWireTool', { - isDrawingTool: true, }) .views(self => ({ get viewClass() { diff --git a/src/tools/MagicWand.js b/src/tools/MagicWand.js new file mode 100644 index 000000000..25c805129 --- /dev/null +++ b/src/tools/MagicWand.js @@ -0,0 +1,587 @@ +import React from 'react'; +import chroma from 'chroma-js'; +import { observer } from 'mobx-react'; +import { flow, types } from 'mobx-state-tree'; + +import BaseTool from './Base'; +import Canvas from '../utils/canvas'; +import { defaultStyle } from '../core/Constants'; +import ToolMixin from '../mixins/Tool'; +import { DrawingTool } from '../mixins/DrawingTool'; +import { getActualZoomingPosition, getTransformedImageData } from '../utils/image'; +import { drawMask } from '../utils/magic-wand'; +import { guidGenerator } from '../core/Helpers'; +import { IconMagicWandTool } from '../assets/icons'; +import { Tool } from '../components/Toolbar/Tool'; + +/** + * Technical Overview: + * + * First, the image we want to do the Magic Wand on can actually be displayed larger or smaller than + * the actual size of the image, whether due to the user zooming, panning, or the image being shrunken + * down to fit within the available screen real estate, so we will need to be aware of this + * discrepancy in terms of our coordinates and image data. + * + * Some terms you might see in the code: + * - `naturalWidth`/`naturalHeight`: The actual, intrinsic size of the image, if loaded into an image + * viewer. + * - `imageDisplayedInBrowserWidth`/`imageDisplayedInBrowserHeight`: The size of the image shown in + * the browser. + * - `viewportWidth`/`viewportHeight`: Even if the image is `imageDisplayedInBrowser` size, parts of + * it might be clipped and overflow hidden by a viewport lying over it and constraining it. + * `viewportWidth`/`viewportHeight` relates the size of the viewport. + * + * Users might be working with very large images, and if we are not careful the Magic Wand thresholding + * operation done while the user is dragging the mouse can get very slow. In addition, when the user + * releases the mouse to apply a final mask, if we are not careful the final masking operation can be + * very slow. We are therefore quite conscious about performance in the Magic Wand implementation. + * + * When the user first presses down on the mouse button (`mousedownEv`), we first have to re-apply + * any CSS transforms the image might be under (zooming, panning, etc.) in `initCanvas`. There is no way + * to get pixel-level image data that has CSS transforms applied to it, so we recreate these transforms + * on top of an offscreen canvas (`getTransformedImageData`), efficiently blitting just the area in the + * viewport to the offscreen buffer. + * + * During mouse movement (`mousemoveEv`), we `threshold()` based on how far the mouse is from the + * initial `anchorScreenX`/`anchorScreenY` seeds, updating the mask with `drawMask`. + * + * When the user is finished with the dynamic thresholding and releases the mouse button (`mouseupEv`), + * we setup the final mask (`setupFinalMask`) by taking the existing Magic Wanded result, which might + * be zoomed, panned, or scaled down, and correctly upscale or downscale the mask into the full natural + * sized image wherever it would actually be (`copyTransformedMaskToNaturalSize`). This has the benefit of + * being very fast vs. attempting to do Magic Wand thresholding against the entire, naturally sized + * image, which could be very large. + * + * Experiments also showed that thresholding can be very different if the image is scaled larger or smaller + * for final results, which can be confusing for the user if when they release the mouse button if what + * they see is very different then what was shown during dynamic thresholding. If we are zoomed in, the final + * mask will end at the edges of the current zoom level, which can also help to reduce surprise at the final + * results. + * + * Once we have the final mask, we need to turn it into a final BrushRegion with results (`finalMaskToRegion`). + * This is a performance bottleneck, so we directly turn it into an image URL that can be passed into the + * BrushRegion. The BrushRegion can then apply the correct class color to the image URL results to draw + * onto it's canvas quickly, which also makes it possible for the user to dynamically + * change the class color later on. We keep a cachedNaturalCanvas around from previous masking sessions on + * the same class in order to collapse multiple Magic Wand additions into the same class. + */ + +const ToolView = observer(({ item }) => { + return ( + { + if (item.selected) return; + + item.manager.selectTool(item, true); + }} + /> + ); +}); + +const _Tool = types + .model('MagicWandTool', { + group: 'segmentation', + shortcut: 'W', + smart: true, + unselectRegionOnToolChange: false, + }) + .volatile(() => ({ + currentThreshold: null, + mask: null, + + // Where to anchor calculating the Magic Wand threshold for relative to the entire screen. + anchorScreenX: null, + anchorScreenY: null, + + // Where to start flood filling for the Magic Wand, anchored to the image's coordinates. + anchorImgX: null, + anchorImgY: null, + + overlay: null, + overlayCtx: null, + overlayOrigStyle: null, + + transformedData: null, + transformedCanvas: null, + + currentRegion: null, + + isFirstWand: true, + cachedRegionId: null, + cachedLabel: null, + cachedNaturalCanvas: null, + + naturalWidth: null, + naturalHeight: null, + imageDisplayedInBrowserWidth: null, + imageDisplayedInBrowserHeight: null, + viewportWidth: null, + viewportHeight: null, + zoomScale: null, + zoomingPositionX: null, + zoomingPositionY: null, + negativezoom: null, + rotation: null, + + timeTravellerListener: null, + })) + .views(self => ({ + get viewClass() { + return () => ; + }, + + get tagTypes() { + return { + stateTypes: 'brushlabels', + controlTagTypes: ['brushlabels', 'magicwand'], + }; + }, + + get iconComponent() { + return IconMagicWandTool; + }, + + get defaultthreshold() { + return parseInt(self.control.defaultthreshold, 10); + }, + + get opacity() { + return parseFloat(self.control.opacity); + }, + + get fillcolor() { + const defaultColor = chroma(defaultStyle.fillcolor).hex(); + let color = defaultColor; + const states = self.obj.states(); + + if (!states.length) return color; + + const selectedEntry = states.find(entry => typeof entry.selectedColor !== 'undefined'); + + color = selectedEntry ? selectedEntry.selectedColor : defaultColor; + return chroma(color).hex(); + }, + + get selectedLabel() { + const states = self.obj.states(); + + if (!states.length) return null; + + const selectedEntry = states.find(entry => typeof entry.isSelected); + const label = selectedEntry.selectedValues()[0]; + + return label; + }, + + get blurradius() { + return parseInt(self.control.blurradius, 10); + }, + + /** + * The user might have an existing mask selected that we need to combine new Magic Wand results + * with. + * + * @returns {BrushRegion} Returns an existing brush region if one is present containing an old + * mask, or null otherwise. + */ + get existingRegion() { + if (self.getSelectedShape && self.getSelectedShape.type && self.getSelectedShape.maskDataURL) { + return self.getSelectedShape; + } else { + return null; + } + }, + + /** + * We maintain an offscreen cache of the natural canvas containing previous Magic Wand sessions + * with the current region being selected. If the user selects a different region we must invalidate + * this cache. + */ + shouldInvalidateCache() { + return self.existingRegion && self.existingRegion.id !== self.cachedRegionId; + }, + + })) + .actions(self => ({ + + mousedownEv(ev) { + // If this is the first time the Magic Wand is being used, make sure we capture if an undo/redo + // happens to invalidate our cache. + if (!self.timeTravellerListener) { + self.timeTravellerListener = self.annotation.history.onUpdate(() => { + self.invalidateCache(); + }); + } + + // Start magic wand thresholding. + self.annotation.history.freeze(); + self.mode = 'drawing'; + self.currentThreshold = self.defaultthreshold; + self.currentRegion = null; + + const image = self.obj; + const imageRef = image.imageRef; + + self.naturalWidth = imageRef.naturalWidth; + self.naturalHeight = imageRef.naturalHeight; + self.imageDisplayedInBrowserWidth = imageRef.width; + self.imageDisplayedInBrowserHeight = imageRef.height; + self.viewportWidth = Math.round(image.canvasSize.width); + self.viewportHeight = Math.round(image.canvasSize.height); + self.zoomScale = image.zoomScale; + self.zoomingPositionX = image.zoomingPositionX; + self.zoomingPositionY = image.zoomingPositionY; + self.negativezoom = self.zoomScale < 1; + self.rotation = image.rotation; + + if (self.rotation || image.crosshair) { + self.mode = 'viewing'; + self.annotation.history.unfreeze(); + + let msg; + + if (self.rotation) { + msg = 'The Magic Wand is not supported on rotated images'; + } else { + msg = 'The Magic Wand is not supported if the crosshair is turned on'; + } + + alert(msg); + throw msg; + } + + // Listen for the escape key to quit the Magic Wand; get the event + // before others, allowing it to bubble upwards (useCapture: true), + // as otherwise the escape key gets eaten by other keyboard listeners. + window.addEventListener('keydown', self.keydownEv, true /* useCapture */); + + [self.anchorImgX, self.anchorImgY, self.anchorScreenX, self.anchorScreenY] = self.getEventCoords(ev); + self.initCache(); + self.initCanvas(); + self.initCurrentRegion(); + }, + + mousemoveEv(ev) { + // If we are in magic wand mode, change the threshold based on the mouse movement. + if (self.mode !== 'drawing') return; + + const [_newImgX, _newImgY, newScreenX, newScreenY] = self.getEventCoords(ev); + + self.threshold(newScreenX, newScreenY, self.fillcolor, self.opacity); + }, + + mouseupEv: flow(function* mouseupEv() { + // Note: If the mouse button is released outside of the stage area, mouseupEv is called + // but not clickEv. For this reason do final work in mouseUp to handle this edge + // condition instead of using clickEv. + + // Were we cancelled mid-way while using the Magic Wand? + if (self.mode === 'viewing') return; + + // Finish magic wand thresholding. + self.mode = 'viewing'; + window.removeEventListener('keydown', self.keydownEv, true /* useCapture */); + + yield self.setupFinalMask(); + }), + + keydownEv(e) { + const { key } = e; + + if (key === 'Escape') { + // Eat the escape key event. + e.preventDefault(); + e.stopPropagation(); + + self.mode = 'viewing'; + window.removeEventListener('keydown', self.keydownEv, true /* useCapture */); + self.overlayCtx.clearRect(0, 0, self.overlay.width, self.overlay.height); + } + }, + + getEventCoords(ev) { + // In terms of getting pixel data for magic wanding, mouse click x, y coordinates + // should be relative to the offsetX/offsetY of the actual fragment of image being + // displayed in the viewport. If the image is zoomed and panned, offsetX/offsetY + // will still stay relative to what is actually being displayed (i.e. it will + // change if we pan around). + // + // Note that when we calculate the offset for thresholding, we want instead to do + // it relative to the entire screen coordinates, as this results in a better user + // experience. + + const imgX = ev.offsetX, + imgY = ev.offsetY, + screenX = ev.screenX, + screenY = ev.screenY; + + return [imgX, imgY, screenX, screenY]; + }, + + /** + * We maintain an offscreen natural sized canvas to efficiently keep adding masks onto + * as a user continues to Magic Wand with the same, currently selected region. + */ + initCache() { + // Has the user previously used the Magic Wand for the current class setting? + self.isFirstWand = (self.existingRegion === null) || (self.existingRegion.id !== self.cachedRegionId); + + if (self.isFirstWand) { + self.cachedNaturalCanvas = document.createElement('canvas'); + self.cachedNaturalCanvas.width = self.naturalWidth; + self.cachedNaturalCanvas.height = self.naturalHeight; + self.cachedLabel = self.selectedLabel; + } else if (self.shouldInvalidateCache()) { + self.invalidateCache(); + } + }, + + /** + * We maintain a canvas cache that can be re-used during a single session of using + * the Magic Wand for a class that should have its values stacked. This drastically improves + * performance when Magic Wanding on large regions. However, several different conditions can + * invalidate this cache, such as using undo/redo, selecting an existing different Magic Wand + * region, etc. This method invalidates the cache and creates a new one. + */ + invalidateCache() { + // Note: in an ideal world we would access self.existingRegion.maskDataURL to blit the existing + // older mask onto the offscreen natural canvas. However, as soon as we do this, we enter into + // some of the black magic mobx-state-tree uses to version data and things get very slow as + // alot of state is captured. Instead, just invalidate the cache, which will cause a new region + // to be created rather than stacking with the earlier, older region. + self.cachedNaturalCanvas = document.createElement('canvas'); + self.cachedNaturalCanvas.width = self.naturalWidth; + self.cachedNaturalCanvas.height = self.naturalHeight; + self.isFirstWand = true; + self.cachedRegionId = null; + self.cachedLabel = self.selectedLabel; + }, + + /** + * Setup an initial canvas overlay and an initial transformed mask to match where the + * user first clicked as a threshold anchor point, with a default threshold value. + */ + initCanvas() { + const image = self.obj; + const imageRef = image.imageRef; + + // Make sure to apply any CSS transforms that might be showing (zooms, pans, etc.) + // but in a way that allows us to access the pixel-level data under those transforms. + [self.transformedData, self.transformedCanvas] = getTransformedImageData(imageRef, + self.naturalWidth, self.naturalHeight, + self.imageDisplayedInBrowserWidth, self.imageDisplayedInBrowserHeight, + self.viewportWidth, self.viewportHeight, + self.zoomScale, + self.zoomingPositionX, + self.zoomingPositionY, + self.negativezoom, + self.rotation); + + // Clear out any transformations on the overlay, other than a basic width and height, + // as the segment we will show will already be transformed and it's mask directly + // blitted to the overlay without further transforms needed. + self.overlay = image.overlayRef; + self.overlayOrigStyle = self.overlay.style; + + self.overlay.style = ''; + self.overlay.width = self.transformedCanvas.width; + self.overlay.height = self.transformedCanvas.height; + self.overlayCtx = self.overlay.getContext('2d'); + + // Now draw an initial Magic Wand with default threshold and anchored at the + // location given. + self.mask = drawMask(self.transformedData, self.overlayCtx, + self.transformedCanvas.width, self.transformedCanvas.height, + self.anchorImgX, self.anchorImgY, + self.currentThreshold, self.fillcolor, self.opacity, self.blurradius, + true /* doPaint */); + }, + + /** + * Creates an empty BrushRegion drawing area that we will plug our final mask into + * once the user is done with the Magic Wand by releasing the mouse button. + */ + initCurrentRegion() { + if (self.isFirstWand){ + const regionOpts = { + id: guidGenerator(), + strokewidth: 1, + object: self.obj, + points: [], + fillcolor: self.fillcolor, + strokecolor: self.fillcolor, + opacity: self.opacity, + }; + + self.currentRegion = self.createDrawingRegion(regionOpts); + } else { + self.currentRegion = self.existingRegion; + } + }, + + /** + * As the user drags their mouse, we should calculate a new threshold value + * by using the displacement of the mouse from the anchor point. + * @param {int} newScreenX New position of the mouse relative to the entire screen. + * @param {int} newScreenY Same, but for Y direction. + */ + threshold(newScreenX, newScreenY) { + if (newScreenX !== self.anchorScreenX || newScreenY !== self.anchorScreenY) { + // Get the offset of where we've dragged the mouse to update the threshold. + const dx = Math.abs(newScreenX - self.anchorScreenX), + dy = Math.abs(newScreenY - self.anchorScreenY), + len = Math.sqrt(dx * dx + dy * dy), + adx = Math.abs(dx), + ady = Math.abs(dy); + let sign = adx > ady ? dx / adx : dy / ady; + + sign = sign < 0 ? sign / 5 : sign / 3; + + const newThreshold = Math.min(Math.max(self.defaultthreshold + Math.floor(sign * len), 1), 255); + + if (newThreshold !== self.currentThreshold) { + self.currentThreshold = newThreshold; + self.mask = drawMask(self.transformedData, self.overlayCtx, + self.transformedCanvas.width, self.transformedCanvas.height, + self.anchorImgX, self.anchorImgY, self.currentThreshold, self.fillcolor, + self.opacity, self.blurradius, true /* doPaint */); + } + } + }, + + /** + * Take the final results from the user and create a final mask we can work with, + * ultimately producing a BrushRegion with the Magic Wand results. + */ + setupFinalMask: flow(function* setupFinalMask() { + // The mask is a single channel; convert it to be RGBA multi-channel data as a data URL. + const singleChannelMask = self.mask; + let canvasWidth, canvasHeight; + + if (self.negativezoom) { + canvasWidth = Math.min(self.viewportWidth, self.imageDisplayedInBrowserWidth); + canvasHeight = Math.min(self.viewportHeight, self.imageDisplayedInBrowserHeight); + } else { + canvasWidth = self.viewportWidth; + canvasHeight = self.viewportHeight; + } + + const scaledDataURL = Canvas.mask2DataURL(singleChannelMask.data, + canvasWidth, canvasHeight, '#FFFFFF'); + + // Get the mask onto a canvas surface we can work with, to blit and upscale/downscale + // the final results. + const blitImg = document.createElement('img'); + + blitImg.src = scaledDataURL; + yield blitImg.decode(); + + // Efficiently copy our transformed mask onto our offscreen, naturally sized canvas. + const maskDataURL = self.copyTransformedMaskToNaturalSize(blitImg); + + // Now create a final region to work with, or update an existing one. + self.finalMaskToRegion(maskDataURL); + }), + + /** + * Given some mask that was drawn on an area that might be zoomed, panned, + * or scaled, copy it over to a full, naturally sized image in order to get + * our final mask. + * + * @param blitImg {Image} DOM image object that has been loaded with the scaled mask, + * ready for us to get pixels from. + */ + copyTransformedMaskToNaturalSize(blitImg) { + const naturalCtx = self.cachedNaturalCanvas.getContext('2d'); + + // Get the dimensions of what we are showing in the browser, but transform them into coordinates + // relative to the full, natural size of the image. Useful so that we can ultimately transform + // our mask that was drawn in zoomed, panned, or shrunken coordinates over to the actual, natively + // sized image. + const [viewportNaturalX, viewportNaturalY] = getActualZoomingPosition( + self.naturalWidth, self.naturalHeight, + self.imageDisplayedInBrowserWidth, self.imageDisplayedInBrowserHeight, + self.zoomingPositionX, + self.zoomingPositionY); + const viewportNaturalWidth = + Math.ceil((self.transformedCanvas.width / self.imageDisplayedInBrowserWidth) * self.naturalWidth); + const viewportNaturalHeight = + Math.ceil((self.transformedCanvas.height / self.imageDisplayedInBrowserHeight) * self.naturalHeight); + + // Now efficiently draw this mask over onto the full, naturally sized image. + // Source dimensions. + const sx = 0, + sy = 0, + sWidth = self.transformedCanvas.width, + sHeight = self.transformedCanvas.height; + // Destination dimensions. + const dx = viewportNaturalX, + dy = viewportNaturalY, + dWidth = viewportNaturalWidth, + dHeight = viewportNaturalHeight; + + naturalCtx.drawImage(blitImg, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight); + + // Turn this into a data URL that we can use to initialize a real brush region, as well + // as the bounding coordinates of the mask in natural coordinate space. + const maskDataURL = self.cachedNaturalCanvas.toDataURL(); + + return maskDataURL; + }, + + /** + * Given final Magic Wand results as a data URL, turn them into a BrushRegion to hold + * the results. + * @param {string} maskDataURL Full, natural sized mask setup with the appropriate class + * color, turned into an image data URL. + */ + finalMaskToRegion(maskDataURL) { + if (self.isFirstWand) { + const newRegion = self.commitDrawingRegion(maskDataURL); + + self.cachedRegionId = newRegion.id; + self.obj.annotation.selectArea(newRegion); + } else { + self.currentRegion.endUpdatedMaskDataURL(maskDataURL); + } + + self.annotation.history.unfreeze(); + self.annotation.setIsDrawing(false); + + // Clean up side effects. + self.overlay.style = self.origStyle; + + setTimeout(() => { + // Clear our overlay to reset state _after_ we've drawn the actual region, + // to prevent a clear 'flash' and to increase apparent performance. + self.overlayCtx.clearRect(0, 0, self.overlay.width, self.overlay.height); + }); + }, + + commitDrawingRegion(maskDataURL) { + const value = { + maskDataURL, + coordstype: 'px', + dynamic: false, + }; + const newRegion = self.annotation.createResult(value, + self.currentRegion.results[0].value.toJSON(), self.control, self.obj); + + self.applyActiveStates(newRegion); + self.deleteRegion(); + newRegion.notifyDrawingFinished(); + + return newRegion; + }, + + })); + +const MagicWand = types.compose(_Tool.name, ToolMixin, BaseTool, DrawingTool, _Tool); + +export { MagicWand }; diff --git a/src/tools/Manager.js b/src/tools/Manager.js index 932831744..a2bfdf60b 100644 --- a/src/tools/Manager.js +++ b/src/tools/Manager.js @@ -1,5 +1,6 @@ import { destroy } from 'mobx-state-tree'; import { guidGenerator } from '../utils/unique'; +import { FF_DEV_4081, isFF } from '../utils/feature-flags'; /** @type {Map} */ const INSTANCES = new Map(); @@ -48,7 +49,7 @@ class ToolsManager { return root.annotationStore.names.get(this.name); } - addTool(toolName, tool, prefix = guidGenerator()) { + addTool(toolName, tool, removeDuplicatesNamed = null, prefix = guidGenerator()) { if (tool.smart && tool.smartOnly) return; // todo: It seems that key is used only for storing, // but not for finding tools, so may be there might @@ -56,6 +57,15 @@ class ToolsManager { const name = tool.toolName ?? toolName; const key = `${prefix}#${name}`; + if (isFF(FF_DEV_4081) && removeDuplicatesNamed && toolName === removeDuplicatesNamed) { + const findme = new RegExp(`^.*?#${name}.*$`); + + if (Object.keys(this.tools).some(entry => findme.test(entry))) { + console.log(`Ignoring duplicate tool ${name} because it matches removeDuplicatesNamed ${removeDuplicatesNamed}`); + return; + } + } + this.tools[key] = tool; if (tool.default && !this._default_tool) this._default_tool = tool; @@ -125,7 +135,7 @@ class ToolsManager { const t = s.tools; Object.keys(t).forEach(k => { - self.addTool(k, t[k], s.name || s.id); + self.addTool(k, t[k], s.removeDuplicatesNamed, s.name || s.id); }); } } diff --git a/src/tools/Polygon.js b/src/tools/Polygon.js index a478c736c..588bc73c8 100644 --- a/src/tools/Polygon.js +++ b/src/tools/Polygon.js @@ -11,7 +11,6 @@ const _Tool = types .model('PolygonTool', { group: 'segmentation', shortcut: 'P', - isDrawingTool: true, }) .views(self => { const Super = { diff --git a/src/tools/Rect.js b/src/tools/Rect.js index 51dcc4533..26b1ceb92 100644 --- a/src/tools/Rect.js +++ b/src/tools/Rect.js @@ -11,7 +11,6 @@ const _BaseNPointTool = types group: 'segmentation', smart: true, shortcut: 'R', - isDrawingTool: true, }) .views(self => { const Super = { diff --git a/src/tools/index.js b/src/tools/index.js index 1e89fb79a..bccbecee5 100644 --- a/src/tools/index.js +++ b/src/tools/index.js @@ -11,7 +11,7 @@ import { Zoom } from './Zoom'; import { Rotate } from './Rotate'; import { Brightness } from './Brightness'; import { Contrast } from './Contrast'; -import { FloodFill } from './FloodFill'; +import { MagicWand } from './MagicWand'; import { Selection } from './Selection'; -export { Brush, Erase, KeyPoint, Polygon, Rect, Rect3Point, Ellipse, Brightness, Contrast, Rotate, Zoom, FloodFill, Selection }; +export { Brush, Erase, KeyPoint, Polygon, Rect, Rect3Point, Ellipse, Brightness, Contrast, Rotate, Zoom, MagicWand, Selection }; diff --git a/src/utils/canvas.js b/src/utils/canvas.js index 09f4d2d71..cbf975daa 100644 --- a/src/utils/canvas.js +++ b/src/utils/canvas.js @@ -4,22 +4,137 @@ import Constants from '../core/Constants'; import * as Colors from './colors'; -// given the imageData object returns the DOM Image with loaded data -function imageData2Image(imagedata) { +/** + * Given a single channel UInt8 image data mask with non-zero values indicating the + * mask, turn it into a 4 channgel RGBA image data URL filled in with the given + * color for pixels turned on in the mask. + * @param {ImageData} Single channel image mask data. + * @param {number} w Width of the resulting image data URL. + * @param {number} h Height of the resulting image data URL. + * @param {string} color Hex color of the resulting mask image. + * @returns {string} Data URL containing the mask as an image. + */ +function mask2DataURL(singleChannelData, w, h, color) { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); - canvas.width = imagedata.width; - canvas.height = imagedata.height; - ctx.putImageData(imagedata, 0, 0); + canvas.width = w; + canvas.height = h; + + const numChannels = 1; + + setMaskPixelColors(ctx, singleChannelData, w, h, color, numChannels); + + const url = canvas.toDataURL(); + + return url; +} + +/** + * Given an RGBA image data URL, turn it into an actual DOM Image filled in with the current + * class color. + * @param {string} maskDataURL Data URL, such as returned from mask2DataURL, containing + * an image. + * @param {string} color The fill color of the image produced from the Data URL. + * @returns {Image} DOM Image filled out with the resulting mask data URL. + */ +function maskDataURL2Image(maskDataURL, { color = Constants.FILL_COLOR } = {}) { + return new Promise((resolve, _reject) => { + const img = document.createElement('img'); + + img.onload = () => { + const canvas = document.createElement('canvas'); + const nw = img.width, + nh = img.height; + + canvas.width = nw; + canvas.height = nh; + + const ctx = canvas.getContext('2d'); + + ctx.drawImage(img, 0, 0); + + const imgData = ctx.getImageData(0, 0, nw, nh); + + const numChannels = 4; // RGBA + + setMaskPixelColors(ctx, imgData.data, nw, nh, color, numChannels); + + img.src = canvas.toDataURL(); + + resolve(img); + }; + img.src = maskDataURL; + }); +} + +/** + * Given some RGBA mask pixel array, efficiently sets the colors. Note that we assume that the same value is set + * throughout the channels of the mask, so that no channel will be set to 0 if there is a valid mask + * position there (i.e. all channels might be 255 if a mask is present). + * @param {CanvasRenderingContext2D} ctx DOM canvas surface to draw on. + * @param {ImageData} Raw canvas.getImageData() to work with. + * @param {number} nw The natural width (i.e. the true width of the canvas independent of how its being displayed). + * @param {number} nh Similar, but the natural height. + * @param {string} color Hex string color to use for mask, such as '#ff8800'. + * @param {number} numChannels The source image could either be a 1-channel mask, or + * a full color 4-channel RGBA image. + */ +function setMaskPixelColors(ctx, data, nw, nh, color, numChannels) { + const [red, green, blue] = chroma(color).rgb(); + const alpha = 255; + + // Efficently expand the single channel mask to be multi-channel by treating the + // target array as single 32-bit numbers, so that the RGBA values can be set in + // a single machine instruction via bit-shifting in a performance conscious way. + const resultsData = ctx.getImageData(0, 0, nw, nh); + const buffer = new ArrayBuffer(nw * nh * 4); // RGBA + const dataView = new Uint32Array(buffer); + const expandedView = new Uint8ClampedArray(buffer); + + // Clamped arrays have different byte endian ordering for different platforms, + // effecting the order in which we set 8-bit colors via 32-bit values. + const endian = checkEndian(); + let finalColor; + + if (endian === 'little endian') { + finalColor = (alpha << 24) | (blue << 16) | (green << 8) | red; + } else if (endian === 'big endian') { + finalColor = (red << 24) | (green << 16) | (blue << 8) | alpha; + } else { + // The most common architectures (x86 and ARM) are both little endian, so just assume that. + console.error(`Unknown platform endianness (${endian}), assuming little endian`); + finalColor = (alpha << 24) | (blue << 16) | (green << 8) | red; + } + + let x, y; + const sourceNumChannels = numChannels; // Could be 1-channel mask or RGBA mask. + + for (y = 0; y <= nh; y++) { + for (x = 0; x <= nw; x++) { + // The source is UInt8, while the target is UInt32. + // This means indexing the source should be multiplied by the number + // of channels, while for the target every 32-bit entry contains the full + // RGBA value so we can index into it directly. + const idx = (y * nw + x); - const image = new Image(); + if (data[idx * sourceNumChannels]) { // If the mask is set at this position... + dataView[idx] = finalColor; + } + } + } - image.src = canvas.toDataURL(); - return image; + resultsData.data.set(expandedView); + ctx.putImageData(resultsData, 0, 0); } -// given the RLE array returns the DOM Image element with loaded image +/** + * Given the RLE array returns the DOM Image element with loaded image. + * @param {string} rle RLE encoded image to be turned into a Region object. + * @param {tags.object.Image} image Image the region will be interacting with. + * @param {string} color Fill color for the region that will be produced. + * @returns @returns {Image} DOM image filled in with RLE contents. + */ function RLE2Region(rle, image, { color = Constants.FILL_COLOR } = {}) { const nw = image.naturalWidth, nh = image.naturalHeight; @@ -50,7 +165,12 @@ function RLE2Region(rle, image, { color = Constants.FILL_COLOR } = {}) { return new_image; } -// given the brush region return the RLE encoded array +/** + * Given a brush region return the RLE encoded array. + * @param {BrushRegion} region BrushRegtion to turn into RLE array. + * @param {tags.object.Image} image Image the region will be interacting with. + * @returns {string} RLE encoded contents. + */ function Region2RLE(region, image) { const nw = image.naturalWidth, nh = image.naturalHeight; @@ -318,10 +438,36 @@ const trim = (canvas) => { }; }; +/** + * JavaScript clamped arrays will follow the byte ordering of their platform (either little- + * or big endian). + * @returns {string} "little endian" if byte ordering starts to the right, or + * "big endian" if byte ordering starts from the left. + */ +function checkEndian() { + const arrayBuffer = new ArrayBuffer(2); + const uint8Array = new Uint8Array(arrayBuffer); + const uint16array = new Uint16Array(arrayBuffer); + + uint8Array[0] = 0xAA; // set first byte + uint8Array[1] = 0xBB; // set second byte + + if (uint16array[0] === 0xBBAA) { + return 'little endian'; + } else if (uint16array[0] === 0xAABB) { + return 'big endian'; + } else { + // The most common architectures (x86 and ARM) are both little endian, so just assume that. + console.error('Can not determine platform endianness, assuming little endian'); + return 'little endian'; + } +} + export default { - imageData2Image, Region2RLE, RLE2Region, + mask2DataURL, + maskDataURL2Image, brushSizeCircle, labelToSVG, trim, diff --git a/src/utils/feature-flags.ts b/src/utils/feature-flags.ts index f86160be1..531a7f412 100644 --- a/src/utils/feature-flags.ts +++ b/src/utils/feature-flags.ts @@ -132,6 +132,9 @@ export const FF_DEV_1284 = 'fflag_fix_front_dev_1284_auto_detect_undo_281022_sho */ export const FF_DEV_3730 = 'fflag_fix_front_dev_3730_shortcuts_initial_input_22122022_short'; +// Enable a Magic Wand to be used for quickly thresholding images with segmentation labels. +export const FF_DEV_4081 = 'fflag_feat_front_dev_4081_magic_wand_tool'; + /** * Label stream ablation experiment for solving overlap issue * @link https://app.launchdarkly.com/default/production/features/fflag_fix_back_dev_4174_overlap_issue_experiments_10012023_short diff --git a/src/utils/image.js b/src/utils/image.js index 0151cc9f0..ec1e6f108 100644 --- a/src/utils/image.js +++ b/src/utils/image.js @@ -163,3 +163,165 @@ export function createDragBoundFunc(item, offset = { x:0, y:0 }) { }); }; } + +/** + * An image on the stage that is being labelled might be under some CSS transformations, + * such as being zoomed in, negatively zoomed out, rotated, etc., while also being shown in a + * viewport on top of the image that might cut parts of it off. For operations like the + * Magic Wand we need to ultimately get raw pixel data of the image with these transforms applied. + * + * Unfortunately it is impossible to get the raw pixel values exhibiting the actual CSS + * transforms for an Image via JavaScript. Instead, we have to take the original untransformed + * image and blit it to a Canvas with similar transforms but done through the Canvas API, + * then getting the transformed raw pixels. + * + * In addition, doing all of this on large images can burn performance cycles that can + * make using tools like the Magic Wand onerous, so we also attempt to only transform & blit + * the image to exactly the area currently being shown in the viewport, so that we don't + * do wasted work. + * + * We currently support zoomed in, negative zoom, and images being scaled in their viewport. + * We do not support rotated images currently with this method. + * + * @param {Image} img DOM Image object to ultimately get raw, transformed pixel values for. + * @param {int} naturalWidth The actual size of the Image if it were loaded from disk and shown + * its full, real size. + * @param {int} naturalHeight Same, but for the height. + * @param imageDisplayedInBrowserWidth {int} When the image is displayed in an actual browser + * it can be shrunken or expanded based on its container and available screen real estate; this + * is that width. + * @param imageDisplayedInBrowserHeight {int} Same, but for the height. + * @param viewportWidth {int} The width in pixels of where the image is actually being displayed; + * this is different than the imageDisplayedInBrowserWidth as the size of the image might be + * clipped by the edges of the viewport when overflow: hidden is set, like looking through the + * edges of a window clipping a view of the world outside. + * @param viewportHeight {int} Same, but for the height. + * @param zoomScale {float} 1 if no zooming is happening, >1 if zooming is on, <1 if negatively + * zoomed outwards. + * @param zoomingPositionX {float} If zoomed and panned away from the image origin at the upper + * left of the screen, relates negative float coordinates from that corner of the X value, + * where these coordinates are relative to the imageDisplayedInBrowserWidth values. + * @param zoomingPositionY {float} Same, but for the height. + * @param negativezoom {boolean} True If a template allows negative zooming (i.e. zooming outwards + * beyond the actual size of the image), and if the user is currently actually negative zooming, + * will be true. + * @returns {[ImageData, Canvas]} Returns an array with the actual RGBA imagedata of the transformed + * image, as well as a Canvas with the transformed image drawn on it. + */ +export function getTransformedImageData(img, + naturalWidth, naturalHeight, + imageDisplayedInBrowserWidth, imageDisplayedInBrowserHeight, + viewportWidth, viewportHeight, + zoomScale, + zoomingPositionX, + zoomingPositionY, + negativezoom) { + + // If negative zoom is on, the image as displayed in the browser could actually be + // _smaller_ than the viewport. Get the minimum size between these when creating + // our ultimate canvas. + let canvasWidth, canvasHeight; + + if (negativezoom) { + canvasWidth = Math.min(viewportWidth, imageDisplayedInBrowserWidth); + canvasHeight = Math.min(viewportHeight, imageDisplayedInBrowserHeight); + } else { + canvasWidth = viewportWidth; + canvasHeight = viewportHeight; + } + + const canvas = document.createElement('canvas'); + + canvas.width = canvasWidth; + canvas.height = canvasHeight; + + const ctx = canvas.getContext('2d'); + + const [viewportNaturalX, viewportNaturalY] = getActualZoomingPosition( + naturalWidth, naturalHeight, + imageDisplayedInBrowserWidth, imageDisplayedInBrowserHeight, + zoomingPositionX, + zoomingPositionY); + + // The viewport dimensions are some percentage of the actual size of the image + // shown in the browser; determine that then calculate the percentage dimension + // of the viewport in natural coordinate space. If we are negative zooming then + // the calculations are slightly different. + let viewportNaturalWidth, viewportNaturalHeight; + + if (negativezoom) { + viewportNaturalWidth = naturalWidth; + viewportNaturalHeight = naturalHeight; + } else { + viewportNaturalWidth = Math.ceil((viewportWidth / imageDisplayedInBrowserWidth) * naturalWidth); + viewportNaturalHeight = Math.ceil((viewportHeight / imageDisplayedInBrowserHeight) * naturalHeight); + } + + // Only draw the part of the image under transformations to the viewport that we will actually + // use, so we can then efficiently get its pixel data for pixel-level tools. + + // Source dimensions. + const sx = viewportNaturalX, + sy = viewportNaturalY, + sWidth = viewportNaturalWidth, + sHeight = viewportNaturalHeight; + // Destination dimensions. + const dx = 0, + dy = 0, + dWidth = canvasWidth, + dHeight = canvasHeight; + + ctx.drawImage(img, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight); + + // Now grab the transformed pixels from the canvas for the values to actual do Magic Wanding on. + // If an exception is thrown then CORS cross domain headers are probably not configured + // correctly. + let transformedData; + + try { + transformedData = ctx.getImageData(0, 0, canvas.width, canvas.height); + } catch (err) { + const msg = 'Please configure CORS cross-domain headers correctly for getting image labeling data'; + + alert(msg); + console.error(msg); + throw(msg); + } + + return [transformedData, canvas]; +} + +/** + * Given some image that we might be zoomed into, get its x and y values relative to the actual, + * natural size of the image. + * + * @param {int} naturalWidth The actual size of the Image if it were loaded from disk and shown + * its full, real size. + * @param {int} naturalHeight Same, but for the height. + * @param imageDisplayedInBrowserWidth {int} When the image is displayed in an actual browser + * it can be shrunken or expanded based on its container and available screen real estate; this + * is that width. + * @param imageDisplayedInBrowserHeight {int} Same, but for the height. + * @param zoomingPositionX {float} If zoomed and panned away from the image origin at the upper + * left of the screen, relates negative float coordinates from that corner of the X value, + * where these coordinates are relative to the imageDisplayedInBrowserWidth values. + * @param zoomingPositionY {float} Same, but for the height. + * @returns {[int, int]} X and Y upper left position of where the zoom is relative to the actual, + * natural size of the image. + */ +export function getActualZoomingPosition(naturalWidth, naturalHeight, + imageDisplayedInBrowserWidth, imageDisplayedInBrowserHeight, + zoomingPositionX, + zoomingPositionY) { + + // The zoomingPosition is actually relative to whatever size the image is + // actually being displayed in the browser (which could be scaled down or up), + // so turn it into a percentage then re-apply it to the full natural size to get the + // correct upper-left pixel offsets. + const zoomPercentageX = Math.abs(zoomingPositionX) / imageDisplayedInBrowserWidth; + const zoomPercentageY = Math.abs(zoomingPositionY) / imageDisplayedInBrowserHeight; + const viewportNaturalX = Math.floor(zoomPercentageX * naturalWidth); + const viewportNaturalY = Math.floor(zoomPercentageY * naturalHeight); + + return [viewportNaturalX, viewportNaturalY]; +} \ No newline at end of file diff --git a/src/utils/index.js b/src/utils/index.js index 164ff9f47..777e45267 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -1,6 +1,6 @@ import * as Checkers from './utilities'; import * as Colors from './colors'; -import * as Floodfill from './floodfill'; +import * as Magicwand from './magic-wand'; import * as Image from './image'; import * as UDate from './date'; import * as HTML from './html'; @@ -18,6 +18,6 @@ export default { guidGenerator, debounce, styleToProp, - Floodfill, + Magicwand, Selection, }; diff --git a/src/utils/floodfill.js b/src/utils/magic-wand.js similarity index 91% rename from src/utils/floodfill.js rename to src/utils/magic-wand.js index ddd2e5d68..75d1647cd 100644 --- a/src/utils/floodfill.js +++ b/src/utils/magic-wand.js @@ -1,6 +1,7 @@ /* eslint-disable prefer-const */ -// import { MagicWand } from "magic-wand-js"; +import chroma from 'chroma-js'; + // Magic Wand (Fuzzy Selection Tool) for Javascript // // The MIT License (MIT) @@ -852,47 +853,72 @@ const MagicWand = (function() { return lib; })(); -export function getImageData(img) { - const canvas = document.createElement('canvas'); - - canvas.width = img.width; - canvas.height = img.height; - const ctx = canvas.getContext('2d'); - - ctx.drawImage(img, 0, 0); - return ctx.getImageData(0, 0, img.width, img.height); +/** + * Given some mask with non-zero values indicating pixels to color, draws it on the given + * canvas Context. + * @param ctx Canvas 2D context to use for drawing the image data. + * @param w When creating an image from the mask, the width of that image. + * @param h When creating an image from the mask, the height of that image. + * @param color Chroma.js compatible RGB color to use when drawing the mask. + * @param alpha Float 0 to 1 value of how much opacity to use for thresholded, filled pixels. + */ +function paint(ctx, w, h, mask, color, alpha) { + if (!mask) return; + + const [r, g, b] = chroma(color).rgb(); + + alpha = Math.round(alpha * 255.0); + + let x, y; + const { data, bounds, width: maskW } = mask; + const imgData = ctx.createImageData(w, h); + + for (y = bounds.minY; y <= bounds.maxY; y++) { + for (x = bounds.minX; x <= bounds.maxX; x++) { + if (data[y * maskW + x] === 0) continue; + let k = (y * w + x) * 4; + + imgData.data[k] = r; + imgData.data[k + 1] = g; + imgData.data[k + 2] = b; + imgData.data[k + 3] = alpha; + } + } + + ctx.putImageData(imgData, 0, 0); } -export function calcBorder(imageData, width, height, x, y, threshold, simple) { - const blurRadius = 5; - const simplifyTolerant = 5; - const simplifyCount = 50; - - const parentPoints = []; +/** + * Given some image, apply a threshold to it anchored at the x and y location, and also + * draw a results border around the thresholded mask. + * @param {ImageData} imageData Raw image data to do the thresholding on. + * @param {CanvasRenderingContext2D} ctx Image context on which to draw the results. + * @param {int} width of the image. + * @param {int} height of the image. + * @param {int} x of start pixel + * @param {int} y of start pixel. + * @param {int} threshold Color range around anchor pixel to include within mask. + * @param {string} color The color to draw the mask as, passed in as an RGB string. + * @param {float} alpha Alpha opacity of the mask when drawn, 0. to 1. + * @param {boolean} doPaint Whether to draw the mask once its calculated; not drawing + * it can save some performance time. + * @param {int} blurRadius The degree of gaussian blur to apply to the contour. + * @param {boolean} doPaint Whether to draw the mask once its calculated; not drawing + * it can save some performance time. + * @returns The mask as {Uint8Array} data, {int} width, {int} height, {Object} bounds. + */ +export function drawMask(imageData, ctx, width, height, x, y, threshold, color, alpha, blurRadius, doPaint) { const image = { - data: imageData, + data: imageData.data, width, height, - bytes: 4, + bytes: 4, // RGBA }; + const existingMask = null; + let mask = MagicWand.floodFill(image, x, y, threshold, existingMask); - let mask = MagicWand.floodFill(image, x, y, threshold, null, true); + if (mask) mask = MagicWand.gaussBlurOnlyBorder(mask, blurRadius, existingMask); + if (doPaint) paint(ctx, width, height, mask, color, alpha); - mask = MagicWand.gaussBlurOnlyBorder(mask, blurRadius); - - let cs = MagicWand.traceContours(mask); - - cs = MagicWand.simplifyContours(cs, simplifyTolerant, simplifyCount); - - if (cs.length > 0) { - if (simple) { - return cs[0].points; - } - for (let j = 0, icsl = cs[0].points.length; j < icsl; j++) { - parentPoints.push([cs[0].points[j].x, cs[0].points[j].y]); - } - return parentPoints; - } else { - return false; - } + return mask; }