diff options
author | Thomas Schindl | 2010-03-03 21:12:20 +0000 |
---|---|---|
committer | Thomas Schindl | 2010-03-03 21:12:20 +0000 |
commit | 4ebe54f49f49ff82793d9db6d9653a786623cbad (patch) | |
tree | fcd1568ef381b63fb23d9c9c573e9df79408992d | |
download | org.eclipse.e4.tools-4ebe54f49f49ff82793d9db6d9653a786623cbad.tar.gz org.eclipse.e4.tools-4ebe54f49f49ff82793d9db6d9653a786623cbad.tar.xz org.eclipse.e4.tools-4ebe54f49f49ff82793d9db6d9653a786623cbad.zip |
[Bug 304584] - [Tooling] Implement Workbench-Model-Tooling
* a first draft implementation
30 files changed, 2331 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..144b5bff --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +bin/ +*~ +*.rej +*.bak +core +*.patch +javacore.* +heapdump.* +core.* +Snap.* +target/ + diff --git a/bundles/org.eclipse.e4.tools.emf.ui/.classpath b/bundles/org.eclipse.e4.tools.emf.ui/.classpath new file mode 100644 index 00000000..304e8618 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/.classpath @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" path="src"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/> + <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/bundles/org.eclipse.e4.tools.emf.ui/.project b/bundles/org.eclipse.e4.tools.emf.ui/.project new file mode 100644 index 00000000..3848d4ae --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/.project @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>org.eclipse.e4.tools.emf.ui</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ManifestBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.SchemaBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.pde.PluginNature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/bundles/org.eclipse.e4.tools.emf.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.e4.tools.emf.ui/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..04d8a387 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +#Tue Mar 02 18:39:11 CET 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/bundles/org.eclipse.e4.tools.emf.ui/.settings/org.eclipse.pde.core.prefs b/bundles/org.eclipse.e4.tools.emf.ui/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 00000000..81bd2f27 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,4 @@ +#Tue Mar 02 18:39:11 CET 2010 +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/bundles/org.eclipse.e4.tools.emf.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.e4.tools.emf.ui/META-INF/MANIFEST.MF new file mode 100644 index 00000000..39de767f --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/META-INF/MANIFEST.MF @@ -0,0 +1,25 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %pluginName +Bundle-SymbolicName: org.eclipse.e4.tools.emf.ui;singleton:=true +Bundle-Version: 1.0.0 +Bundle-ClassPath: . +Bundle-Vendor: %providerName +Bundle-Localization: plugin +Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Require-Bundle: org.eclipse.core.databinding;bundle-version="1.3.0", + org.eclipse.core.databinding.property;bundle-version="1.2.100", + org.eclipse.e4.ui.model.workbench;bundle-version="0.9.1", + org.eclipse.emf.databinding;bundle-version="1.2.0", + org.eclipse.jface.databinding;bundle-version="1.4.0", + org.eclipse.jface;bundle-version="3.6.0", + org.eclipse.emf.edit;bundle-version="2.6.0", + org.eclipse.equinox.common;bundle-version="3.6.0" +Bundle-ActivationPolicy: lazy +Import-Package: javax.inject;version="1.0.0" +Export-Package: org.eclipse.e4.tools.emf.ui.common, + org.eclipse.e4.tools.emf.ui.common.component, + org.eclipse.e4.tools.emf.ui.internal.common;x-internal:=true, + org.eclipse.e4.tools.emf.ui.internal.common.component;x-internal:=true, + org.eclipse.e4.tools.emf.ui.internal.wbe;x-internal:=true, + org.eclipse.e4.tools.emf.ui.internal.wbm;x-internal:=true diff --git a/bundles/org.eclipse.e4.tools.emf.ui/about.html b/bundles/org.eclipse.e4.tools.emf.ui/about.html new file mode 100644 index 00000000..c1343aa3 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/about.html @@ -0,0 +1,45 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/> +<title>About</title> +</head> +<body lang="EN-US"> +<h2>About This Content</h2> + +<p>December 3, 2009</p> +<h3>License</h3> + +<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise +indicated below, the Content is provided to you under the terms and conditions of the +Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available +at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>. +For purposes of the EPL, "Program" will mean the Content.</p> + +<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is +being redistributed by another party ("Redistributor") and different terms and conditions may +apply to your use of any object code in the Content. Check the Redistributor's license that was +provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise +indicated below, the terms and conditions of the EPL still apply to any source code in the Content +and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p> + +<h3>Third Party Content</h3> + +<p>The Content includes items from third parties as set out below. If you did not +receive this Content directly from the Eclipse Foundation, the following is provided for informational +purposes only, and you should look to the Redistributor’s license for terms and conditions of use.</p> + +<h4>Silk icon set Version 1.3</h4> +<p> +This plugin contains icons from the Silk icon set created by Mark James. The original files can +be found at: +<ul> +<a href="http://www.famfamfam.com/lab/icons/silk/">http://www.famfamfam.com/lab/icons/silk/</a></ul> +<p>The license can be found at:</p> +<ul> + <li><a href="http://creativecommons.org/licenses/by/2.5/">http://creativecommons.org/licenses/by/2.5/</a></li> +</ul> + +</body> +</html>
\ No newline at end of file diff --git a/bundles/org.eclipse.e4.tools.emf.ui/build.properties b/bundles/org.eclipse.e4.tools.emf.ui/build.properties new file mode 100644 index 00000000..6cf6ee0d --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/build.properties @@ -0,0 +1,12 @@ + +# <copyright> +# </copyright> +# +# $Id$ + +bin.includes = .,\ + META-INF/,\ + plugin.properties +jars.compile.order = . +source.. = src/ +output.. = bin/ diff --git a/bundles/org.eclipse.e4.tools.emf.ui/icons/application.png b/bundles/org.eclipse.e4.tools.emf.ui/icons/application.png Binary files differnew file mode 100644 index 00000000..1dee9e36 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/icons/application.png diff --git a/bundles/org.eclipse.e4.tools.emf.ui/icons/application_double.png b/bundles/org.eclipse.e4.tools.emf.ui/icons/application_double.png Binary files differnew file mode 100644 index 00000000..647592f2 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/icons/application_double.png diff --git a/bundles/org.eclipse.e4.tools.emf.ui/icons/application_form.png b/bundles/org.eclipse.e4.tools.emf.ui/icons/application_form.png Binary files differnew file mode 100644 index 00000000..807b862c --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/icons/application_form.png diff --git a/bundles/org.eclipse.e4.tools.emf.ui/icons/application_form_edit.png b/bundles/org.eclipse.e4.tools.emf.ui/icons/application_form_edit.png Binary files differnew file mode 100644 index 00000000..af486c94 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/icons/application_form_edit.png diff --git a/bundles/org.eclipse.e4.tools.emf.ui/icons/application_view_icons.png b/bundles/org.eclipse.e4.tools.emf.ui/icons/application_view_icons.png Binary files differnew file mode 100644 index 00000000..6a93cdaa --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/icons/application_view_icons.png diff --git a/bundles/org.eclipse.e4.tools.emf.ui/icons/cog.png b/bundles/org.eclipse.e4.tools.emf.ui/icons/cog.png Binary files differnew file mode 100644 index 00000000..67de2c6c --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/icons/cog.png diff --git a/bundles/org.eclipse.e4.tools.emf.ui/icons/package_go.png b/bundles/org.eclipse.e4.tools.emf.ui/icons/package_go.png Binary files differnew file mode 100644 index 00000000..aace63ad --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/icons/package_go.png diff --git a/bundles/org.eclipse.e4.tools.emf.ui/plugin.properties b/bundles/org.eclipse.e4.tools.emf.ui/plugin.properties new file mode 100644 index 00000000..14a799fb --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/plugin.properties @@ -0,0 +1,8 @@ + +# <copyright> +# </copyright> +# +# $Id$ + +pluginName = EMFUI Model +providerName = www.example.org diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/IModelResource.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/IModelResource.java new file mode 100644 index 00000000..e47b866b --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/IModelResource.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2010 BestSolution.at and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation + ******************************************************************************/ +package org.eclipse.e4.tools.emf.ui.common; + +import org.eclipse.core.databinding.observable.list.IObservableList; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.emf.edit.domain.EditingDomain; + +public interface IModelResource { + public IObservableList getRoot(); + public boolean isSaveable(); + public IStatus save(); + public EditingDomain getEditingDomain(); +} diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/XMIModelResource.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/XMIModelResource.java new file mode 100644 index 00000000..7d7510a6 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/XMIModelResource.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright (c) 2010 BestSolution.at and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation + ******************************************************************************/ +package org.eclipse.e4.tools.emf.ui.common; + +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.databinding.observable.list.IObservableList; +import org.eclipse.core.databinding.observable.list.WritableList; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.emf.common.command.BasicCommandStack; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; +import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; +import org.eclipse.emf.edit.domain.EditingDomain; +import org.eclipse.emf.edit.provider.ComposedAdapterFactory; + +public class XMIModelResource implements IModelResource { + private EditingDomain editingDomain; + private Resource resource; + + public XMIModelResource(String uri) { + ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory( + ComposedAdapterFactory.Descriptor.Registry.INSTANCE); + ResourceSet resourceSet = new ResourceSetImpl(); + BasicCommandStack commandStack = new BasicCommandStack(); + editingDomain = new AdapterFactoryEditingDomain(adapterFactory, + commandStack, resourceSet); + resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap() + .put(Resource.Factory.Registry.DEFAULT_EXTENSION, + new XMIResourceFactoryImpl()); + resource = resourceSet.getResource(URI.createURI(uri), true); + } + + public IObservableList getRoot() { + WritableList list = new WritableList(); + list.add(resource.getContents().get(0)); + return list; + } + + public EditingDomain getEditingDomain() { + return editingDomain; + } + + public boolean isSaveable() { + return true; + } + + public IStatus save() { + Map<String, String> map = new HashMap<String, String>(); + try { + resource.save(map); + } catch (Exception e) { + // TODO: handle exception + } + + return Status.OK_STATUS; + } + +} diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/component/AbstractComponentEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/component/AbstractComponentEditor.java new file mode 100644 index 00000000..24ba71f6 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/component/AbstractComponentEditor.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright (c) 2010 BestSolution.at and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation + ******************************************************************************/ +package org.eclipse.e4.tools.emf.ui.common.component; + +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; + +public abstract class AbstractComponentEditor { +// public abstract boolean canHandle(Object object); + public abstract Image getImage(Display display); + public abstract String getLabel(); + public abstract String getDescription(); + public abstract Composite getEditor(Composite parent, Object object); +} diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/ShadowComposite.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/ShadowComposite.java new file mode 100644 index 00000000..ed5f6137 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/ShadowComposite.java @@ -0,0 +1,1094 @@ +package org.eclipse.e4.tools.emf.ui.internal; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.PaletteData; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.graphics.Region; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; + +public class ShadowComposite extends Composite { + // Constants for circle drawing + final static int LEFT_TOP = 0; + final static int LEFT_BOTTOM = 1; + final static int RIGHT_TOP = 2; + final static int RIGHT_BOTTOM = 3; + + // drop shadow constants + final static int SIDE_DROP_WIDTH = 3; + final static int BOTTOM_DROP_WIDTH = 5; + + // keylines + final static int OUTER_KEYLINE = 2; + final static int INNER_KEYLINE = 1; + final static int TOP_KEYLINE = 2; + + static final int CORNER_SIZE = 24; + + static final String E4_SHADOW_IMAGE = "org.eclipse.e4.renderer.comp_image"; //$NON-NLS-1$ + + int marginWidth; + int marginHeight; + + static int[] shape; + + static int[] shadow = { 0x02fefefe, 0x03fefefe, 0x05fefefe, 0x06fdfdfd, + 0x08fdfdfd, 0x0bfcfcfc, 0x0dfcfcfc, 0x10fbfbfb, 0x13fafafa, + 0x17f9f9f9, 0x1af9f9f9, 0x1df8f8f8, 0x20f7f7f7, 0x23f6f6f6, + 0x26f6f6f6, 0x28f5f5f5, 0x29f5f5f5, 0x2bf4f4f4, 0x2cf4f4f4, + 0x2df4f4f4, 0x2df4f4f4, 0x2ef4f4f4, 0x2ef4f4f4, 0x2ef4f4f4, + 0x2ff4f4f4, 0x2ff3f3f3, 0x2ff3f3f3, 0x2ff3f3f3, 0x2ff3f3f3, + 0x2ff3f3f3, 0x2ff3f3f3, 0x2ff3f3f3, 0x2ff3f3f3, 0x2ff3f3f3, + 0x2ff3f3f3, 0x2ff4f4f4, 0x2ef4f4f4, 0x2ef4f4f4, 0x2ef4f4f4, + 0x2df4f4f4, 0x2df4f4f4, 0x2cf4f4f4, 0x2bf4f4f4, 0x29f5f5f5, + 0x28f5f5f5, 0x26f6f6f6, 0x23f6f6f6, 0x20f7f7f7, 0x1df8f8f8, + 0x1af9f9f9, 0x17f9f9f9, 0x13fafafa, 0x10fbfbfb, 0x0dfcfcfc, + 0x0bfcfcfc, 0x08fdfdfd, 0x06fdfdfd, 0x05fefefe, 0x03fefefe, + 0x02fefefe, 0x03fefefe, 0x05fefefe, 0x07fdfdfd, 0x09fdfdfd, + 0x0cfcfcfc, 0x0ffbfbfb, 0x13fafafa, 0x17f9f9f9, 0x1bf8f8f8, + 0x1ff7f7f7, 0x23f6f6f6, 0x27f5f5f5, 0x2bf4f4f4, 0x2ff3f3f3, + 0x32f3f3f3, 0x35f2f2f2, 0x37f1f1f1, 0x39f1f1f1, 0x3af1f1f1, + 0x3bf0f0f0, 0x3cf0f0f0, 0x3df0f0f0, 0x3df0f0f0, 0x3df0f0f0, + 0x3df0f0f0, 0x3df0f0f0, 0x3df0f0f0, 0x3df0f0f0, 0x3df0f0f0, + 0x3df0f0f0, 0x3df0f0f0, 0x3df0f0f0, 0x3df0f0f0, 0x3df0f0f0, + 0x3df0f0f0, 0x3df0f0f0, 0x3df0f0f0, 0x3df0f0f0, 0x3df0f0f0, + 0x3cf0f0f0, 0x3bf0f0f0, 0x3af1f1f1, 0x39f1f1f1, 0x37f1f1f1, + 0x35f2f2f2, 0x32f3f3f3, 0x2ff3f3f3, 0x2bf4f4f4, 0x27f5f5f5, + 0x23f6f6f6, 0x1ff7f7f7, 0x1bf8f8f8, 0x17f9f9f9, 0x13fafafa, + 0x0ffbfbfb, 0x0cfcfcfc, 0x09fdfdfd, 0x07fdfdfd, 0x05fefefe, + 0x03fefefe, 0x05fefefe, 0x07fdfdfd, 0x09fdfdfd, 0x0dfcfcfc, + 0x10fbfbfb, 0x15fafafa, 0x19f9f9f9, 0x1ef8f8f8, 0x24f6f6f6, + 0x29f5f5f5, 0x2ff4f4f4, 0x34f2f2f2, 0x39f1f1f1, 0x3df0f0f0, + 0x41efefef, 0x44eeeeee, 0x47ededed, 0x49ededed, 0x4bededed, + 0x4cececec, 0x4dececec, 0x4dececec, 0x4eececec, 0x4eececec, + 0x4eececec, 0x4eececec, 0x4eececec, 0x4fececec, 0x4fececec, + 0x4fececec, 0x4fececec, 0x4fececec, 0x4fececec, 0x4eececec, + 0x4eececec, 0x4eececec, 0x4eececec, 0x4eececec, 0x4dececec, + 0x4dececec, 0x4cececec, 0x4bededed, 0x49ededed, 0x47ededed, + 0x44eeeeee, 0x41efefef, 0x3df0f0f0, 0x39f1f1f1, 0x34f2f2f2, + 0x2ff4f4f4, 0x29f5f5f5, 0x24f6f6f6, 0x1ef8f8f8, 0x19f9f9f9, + 0x15fafafa, 0x10fbfbfb, 0x0dfcfcfc, 0x09fdfdfd, 0x07fdfdfd, + 0x05fefefe, 0x07fdfdfd, 0x09fdfdfd, 0x0dfcfcfc, 0x11fbfbfb, + 0x16fafafa, 0x1bf8f8f8, 0x21f7f7f7, 0x27f5f5f5, 0x2ef4f4f4, + 0x35f2f2f2, 0x3cf0f0f0, 0x42efefef, 0x48ededed, 0x4dececec, + 0x51ebebeb, 0x55eaeaea, 0x58e9e9e9, 0x5be9e9e9, 0x5de8e8e8, + 0x5ee8e8e8, 0x5fe7e7e7, 0x60e7e7e7, 0x61e7e7e7, 0x61e7e7e7, + 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, + 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, + 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, 0x60e7e7e7, + 0x5fe7e7e7, 0x5ee8e8e8, 0x5de8e8e8, 0x5be9e9e9, 0x58e9e9e9, + 0x55eaeaea, 0x51ebebeb, 0x4dececec, 0x48ededed, 0x42efefef, + 0x3cf0f0f0, 0x35f2f2f2, 0x2ef4f4f4, 0x27f5f5f5, 0x21f7f7f7, + 0x1bf8f8f8, 0x16fafafa, 0x11fbfbfb, 0x0dfcfcfc, 0x09fdfdfd, + 0x07fdfdfd, 0x09fdfdfd, 0x0dfcfcfc, 0x11fbfbfb, 0x16fafafa, + 0x1cf8f8f8, 0x23f6f6f6, 0x2af5f5f5, 0x32f3f3f3, 0x3af1f1f1, + 0x42efefef, 0x4aededed, 0x51ebebeb, 0x58e9e9e9, 0x5ee8e8e8, + 0x64e6e6e6, 0x68e5e5e5, 0x6ce4e4e4, 0x6ee4e4e4, 0x70e3e3e3, + 0x72e3e3e3, 0x73e3e3e3, 0x74e2e2e2, 0x75e2e2e2, 0x75e2e2e2, + 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, + 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, + 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, 0x74e2e2e2, + 0x73e3e3e3, 0x72e3e3e3, 0x70e3e3e3, 0x6ee4e4e4, 0x6ce4e4e4, + 0x68e5e5e5, 0x64e6e6e6, 0x5ee8e8e8, 0x58e9e9e9, 0x51ebebeb, + 0x4aededed, 0x42efefef, 0x3af1f1f1, 0x32f3f3f3, 0x2af5f5f5, + 0x23f6f6f6, 0x1cf8f8f8, 0x16fafafa, 0x11fbfbfb, 0x0dfcfcfc, + 0x09fdfdfd, 0x0cfcfcfc, 0x10fbfbfb, 0x16fafafa, 0x1cf8f8f8, + 0x23f6f6f6, 0x2cf4f4f4, 0x35f2f2f2, 0x3ef0f0f0, 0x48ededed, + 0x51ebebeb, 0x5ae9e9e9, 0x62e7e7e7, 0x6ae5e5e5, 0x71e3e3e3, + 0x77e2e2e2, 0x7be1e1e1, 0x7fe0e0e0, 0x82dfdfdf, 0x85dedede, + 0x86dedede, 0x88dedede, 0x88dddddd, 0x89dddddd, 0x89dddddd, + 0x89dddddd, 0x8adddddd, 0x8adddddd, 0x8adddddd, 0x8adddddd, + 0x8adddddd, 0x8adddddd, 0x8adddddd, 0x8adddddd, 0x8adddddd, + 0x8adddddd, 0x89dddddd, 0x89dddddd, 0x89dddddd, 0x88dddddd, + 0x88dedede, 0x86dedede, 0x85dedede, 0x82dfdfdf, 0x7fe0e0e0, + 0x7be1e1e1, 0x77e2e2e2, 0x71e3e3e3, 0x6ae5e5e5, 0x62e7e7e7, + 0x5ae9e9e9, 0x51ebebeb, 0x48ededed, 0x3ef0f0f0, 0x35f2f2f2, + 0x2cf4f4f4, 0x23f6f6f6, 0x1cf8f8f8, 0x16fafafa, 0x10fbfbfb, + 0x0cfcfcfc, 0x0ffbfbfb, 0x14fafafa, 0x1bf8f8f8, 0x23f6f6f6, + 0x2cf4f4f4, 0x35f2f2f2, 0x40efefef, 0x4bededed, 0x56eaeaea, + 0x60e7e7e7, 0x6ae5e5e5, 0x74e2e2e2, 0x7ce0e0e0, 0x83dfdfdf, + 0x8adddddd, 0x8fdcdcdc, 0x93dbdbdb, 0x96dadada, 0x98d9d9d9, + 0x9ad9d9d9, 0x9bd9d9d9, 0x9cd8d8d8, 0x9dd8d8d8, 0x9dd8d8d8, + 0x9dd8d8d8, 0x9ed8d8d8, 0x9ed8d8d8, 0x9ed8d8d8, 0x9ed8d8d8, + 0x9ed8d8d8, 0x9ed8d8d8, 0x9ed8d8d8, 0x9ed8d8d8, 0x9ed8d8d8, + 0x9ed8d8d8, 0x9dd8d8d8, 0x9dd8d8d8, 0x9dd8d8d8, 0x9cd8d8d8, + 0x9bd9d9d9, 0x9ad9d9d9, 0x98d9d9d9, 0x96dadada, 0x93dbdbdb, + 0x8fdcdcdc, 0x8adddddd, 0x83dfdfdf, 0x7ce0e0e0, 0x74e2e2e2, + 0x6ae5e5e5, 0x60e7e7e7, 0x56eaeaea, 0x4bededed, 0x40efefef, + 0x35f2f2f2, 0x2cf4f4f4, 0x23f6f6f6, 0x1bf8f8f8, 0x14fafafa, + 0x0ffbfbfb, 0x13fafafa, 0x19f9f9f9, 0x21f7f7f7, 0x2af5f5f5, + 0x35f2f2f2, 0x40efefef, 0x4cececec, 0x58e9e9e9, 0x64e6e6e6, + 0x70e3e3e3, 0x7be1e1e1, 0x85dedede, 0x8edcdcdc, 0x96dadada, + 0x9cd8d8d8, 0xa2d7d7d7, 0xa6d6d6d6, 0xa9d5d5d5, 0xabd5d5d5, + 0xadd4d4d4, 0xaed4d4d4, 0xafd4d4d4, 0xb0d4d4d4, 0xb0d3d3d3, + 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d3d3d3, + 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d3d3d3, + 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d4d4d4, 0xafd4d4d4, + 0xaed4d4d4, 0xadd4d4d4, 0xabd5d5d5, 0xa9d5d5d5, 0xa6d6d6d6, + 0xa2d7d7d7, 0x9cd8d8d8, 0x96dadada, 0x8edcdcdc, 0x85dedede, + 0x7be1e1e1, 0x70e3e3e3, 0x64e6e6e6, 0x58e9e9e9, 0x4cececec, + 0x40efefef, 0x35f2f2f2, 0x2af5f5f5, 0x21f7f7f7, 0x19f9f9f9, + 0x13fafafa, 0x16f9f9f9, 0x1ef8f8f8, 0x27f5f5f5, 0x32f3f3f3, + 0x3ef0f0f0, 0x4bededed, 0x58e9e9e9, 0x66e6e6e6, 0x73e3e3e3, + 0x80dfdfdf, 0x8bdddddd, 0x96dadada, 0x9fd8d8d8, 0xa7d6d6d6, + 0xaed4d4d4, 0xb3d3d3d3, 0xb7d2d2d2, 0xbad1d1d1, 0xbdd0d0d0, + 0xbed0d0d0, 0xc0d0d0d0, 0xc0cfcfcf, 0xc1cfcfcf, 0xc1cfcfcf, + 0xc1cfcfcf, 0xc1cfcfcf, 0xc1cfcfcf, 0xc2cfcfcf, 0xc2cfcfcf, + 0xc2cfcfcf, 0xc2cfcfcf, 0xc2cfcfcf, 0xc2cfcfcf, 0xc1cfcfcf, + 0xc1cfcfcf, 0xc1cfcfcf, 0xc1cfcfcf, 0xc1cfcfcf, 0xc0cfcfcf, + 0xc0d0d0d0, 0xbed0d0d0, 0xbdd0d0d0, 0xbad1d1d1, 0xb7d2d2d2, + 0xb3d3d3d3, 0xaed4d4d4, 0xa7d6d6d6, 0x9fd8d8d8, 0x96dadada, + 0x8bdddddd, 0x80dfdfdf, 0x73e3e3e3, 0x66e6e6e6, 0x58e9e9e9, + 0x4bededed, 0x3ef0f0f0, 0x32f3f3f3, 0x27f5f5f5, 0x1ef8f8f8, + 0x16f9f9f9, 0x1bf8f8f8, 0x24f6f6f6, 0x2ef4f4f4, 0x3af1f1f1, + 0x47ededed, 0x56eaeaea, 0x64e6e6e6, 0x73e3e3e3, 0x81dfdfdf, + 0x8fdcdcdc, 0x9bd9d9d9, 0xa6d6d6d6, 0xafd4d4d4, 0xb7d2d2d2, + 0xbed0d0d0, 0xc3cfcfcf, 0xc7cecece, 0xcacdcdcd, 0xcccdcdcd, + 0xcecccccc, 0xcfcccccc, 0xcfcccccc, 0xd0cccccc, 0xd0cccccc, + 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, + 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, + 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, 0xcfcccccc, + 0xcfcccccc, 0xcecccccc, 0xcccdcdcd, 0xcacdcdcd, 0xc7cecece, + 0xc3cfcfcf, 0xbed0d0d0, 0xb7d2d2d2, 0xafd4d4d4, 0xa6d6d6d6, + 0x9bd9d9d9, 0x8fdcdcdc, 0x81dfdfdf, 0x73e3e3e3, 0x64e6e6e6, + 0x56eaeaea, 0x47ededed, 0x3af1f1f1, 0x2ef4f4f4, 0x24f6f6f6, + 0x1bf8f8f8, 0x1ff7f7f7, 0x29f5f5f5, 0x35f2f2f2, 0x42efefef, + 0x51ebebeb, 0x60e7e7e7, 0x70e3e3e3, 0x80dfdfdf, 0x8fdcdcdc, + 0x9cd8d8d8, 0xa9d5d5d5, 0xb4d2d2d2, 0xbdd0d0d0, 0xc5cecece, + 0xcbcdcdcd, 0xd0cccccc, 0xd4cbcbcb, 0xd7cacaca, 0xd9c9c9c9, + 0xdac9c9c9, 0xdbc9c9c9, 0xdcc9c9c9, 0xdcc9c9c9, 0xdcc9c9c9, + 0xddc9c9c9, 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, + 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, + 0xddc8c8c8, 0xddc9c9c9, 0xdcc9c9c9, 0xdcc9c9c9, 0xdcc9c9c9, + 0xdbc9c9c9, 0xdac9c9c9, 0xd9c9c9c9, 0xd7cacaca, 0xd4cbcbcb, + 0xd0cccccc, 0xcbcdcdcd, 0xc5cecece, 0xbdd0d0d0, 0xb4d2d2d2, + 0xa9d5d5d5, 0x9cd8d8d8, 0x8fdcdcdc, 0x80dfdfdf, 0x70e3e3e3, + 0x60e7e7e7, 0x51ebebeb, 0x42efefef, 0x35f2f2f2, 0x29f5f5f5, + 0x1ff7f7f7, 0x23f6f6f6, 0x2ff4f4f4, 0x3bf0f0f0, 0x4aededed, + 0x5ae9e9e9, 0x6ae5e5e5, 0x7be0e0e0, 0x8bdcdcdc, 0x9bd9d9d9, + 0xa9d5d5d5, 0xb6d2d2d2, 0xc0cfcfcf, 0xcacdcdcd, 0xd1cbcbcb, + 0xd7cacaca, 0xdcc9c9c9, 0xdfc8c8c8, 0xe1c7c7c7, 0xe3c7c7c7, + 0xe5c7c7c7, 0xe5c6c6c6, 0xe6c6c6c6, 0xe6c6c6c6, 0xe6c6c6c6, + 0xe6c6c6c6, 0xe7c6c6c6, 0xe7c6c6c6, 0xe7c6c6c6, 0xe7c6c6c6, + 0xe7c6c6c6, 0xe7c6c6c6, 0xe7c6c6c6, 0xe7c6c6c6, 0xe7c6c6c6, + 0xe7c6c6c6, 0xe6c6c6c6, 0xe6c6c6c6, 0xe6c6c6c6, 0xe6c6c6c6, + 0xe5c6c6c6, 0xe5c7c7c7, 0xe3c7c7c7, 0xe1c7c7c7, 0xdfc8c8c8, + 0xdcc9c9c9, 0xd7cacaca, 0xd1cbcbcb, 0xcacdcdcd, 0xc0cfcfcf, + 0xb6d2d2d2, 0xa9d5d5d5, 0x9bd9d9d9, 0x8bdcdcdc, 0x7be0e0e0, + 0x6ae5e5e5, 0x5ae9e9e9, 0x4aededed, 0x3bf0f0f0, 0x2ff4f4f4, + 0x23f6f6f6, 0x27f5f5f5, 0x34f2f2f2, 0x42efefef, 0x51ebebeb, + 0x62e7e7e7, 0x74e2e2e2, 0x85dedede, 0x96dadada, 0xa6d6d6d6, + 0xb4d2d2d2, 0xc1cfcfcf, 0xcbcdcdcd, 0xd4cbcbcb, 0xdbc9c9c9, + 0xe0c8c8c8, 0xe5c7c7c7, 0xe8c6c6c6, 0xeac5c5c5, 0xecc5c5c5, + 0xedc5c5c5, 0xedc4c4c4, 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, + 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, + 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, + 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, + 0xedc4c4c4, 0xedc5c5c5, 0xecc5c5c5, 0xeac5c5c5, 0xe8c6c6c6, + 0xe5c7c7c7, 0xe0c8c8c8, 0xdbc9c9c9, 0xd4cbcbcb, 0xcbcdcdcd, + 0xc1cfcfcf, 0xb4d2d2d2, 0xa6d6d6d6, 0x96dadada, 0x85dedede, + 0x74e2e2e2, 0x62e7e7e7, 0x51ebebeb, 0x42efefef, 0x34f2f2f2, + 0x27f5f5f5, 0x2bf4f4f4, 0x39f1f1f1, 0x47ededed, 0x58e9e9e9, + 0x6ae5e5e5, 0x7ce0e0e0, 0x8edcdcdc, 0x9fd8d8d8, 0xafd4d4d4, + 0xbdd0d0d0, 0xcacdcdcd, 0xd4cbcbcb, 0xdcc9c9c9, 0xe3c7c7c7, + 0xe8c6c6c6, 0xecc5c5c5, 0xefc4c4c4, 0xf0c4c4c4, 0xf2c3c3c3, + 0xf3c3c3c3, 0xf3c3c3c3, 0xf3c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, + 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, + 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, + 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, 0xf3c3c3c3, + 0xf3c3c3c3, 0xf3c3c3c3, 0xf2c3c3c3, 0xf0c4c4c4, 0xefc4c4c4, + 0xecc5c5c5, 0xe8c6c6c6, 0xe3c7c7c7, 0xdcc9c9c9, 0xd4cbcbcb, + 0xcacdcdcd, 0xbdd0d0d0, 0xafd4d4d4, 0x9fd8d8d8, 0x8edcdcdc, + 0x7ce0e0e0, 0x6ae5e5e5, 0x58e9e9e9, 0x47ededed, 0x39f1f1f1, + 0x2bf4f4f4, 0x2ff4f4f4, 0x3df0f0f0, 0x4dececec, 0x5ee8e8e8, + 0x71e3e3e3, 0x84dfdfdf, 0x96dadada, 0xa7d6d6d6, 0xb7d2d2d2, + 0xc5cecece, 0xd1cbcbcb, 0xdbc9c9c9, 0xe3c7c7c7, 0xe9c6c6c6, + 0xeec4c4c4, 0xf1c4c4c4, 0xf4c3c3c3, 0xf5c2c2c2, 0xf6c2c2c2, + 0xf7c2c2c2, 0xf7c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, + 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, + 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, + 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, + 0xf7c2c2c2, 0xf7c2c2c2, 0xf6c2c2c2, 0xf5c2c2c2, 0xf4c3c3c3, + 0xf1c4c4c4, 0xeec4c4c4, 0xe9c6c6c6, 0xe3c7c7c7, 0xdbc9c9c9, + 0xd1cbcbcb, 0xc5cecece, 0xb7d2d2d2, 0xa7d6d6d6, 0x96dadada, + 0x84dfdfdf, 0x71e3e3e3, 0x5ee8e8e8, 0x4dececec, 0x3df0f0f0, + 0x2ff4f4f4, 0x32f3f3f3, 0x41efefef, 0x51ebebeb, 0x63e6e6e6, + 0x77e2e2e2, 0x8adddddd, 0x9cd8d8d8, 0xaed4d4d4, 0xbdd0d0d0, + 0xcbcdcdcd, 0xd7cacaca, 0xe0c7c7c7, 0xe8c6c6c6, 0xeec4c4c4, + 0xf2c3c3c3, 0xf5c3c3c3, 0xf7c2c2c2, 0xf8c2c2c2, 0xf9c1c1c1, + 0xfac1c1c1, 0xfac1c1c1, 0xfac1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, + 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, + 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, + 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, 0xfac1c1c1, + 0xfac1c1c1, 0xfac1c1c1, 0xf9c1c1c1, 0xf8c2c2c2, 0xf7c2c2c2, + 0xf5c3c3c3, 0xf2c3c3c3, 0xeec4c4c4, 0xe8c6c6c6, 0xe0c7c7c7, + 0xd7cacaca, 0xcbcdcdcd, 0xbdd0d0d0, 0xaed4d4d4, 0x9cd8d8d8, + 0x8adddddd, 0x77e2e2e2, 0x63e6e6e6, 0x51ebebeb, 0x41efefef, + 0x32f3f3f3, 0x34f2f2f2, 0x44eeeeee, 0x55eaeaea, 0x68e5e5e5, + 0x7be1e1e1, 0x8fdcdcdc, 0xa1d7d7d7, 0xb3d3d3d3, 0xc2cfcfcf, + 0xd0cbcbcb, 0xdcc9c9c9, 0xe4c6c6c6, 0xecc5c5c5, 0xf1c4c4c4, + 0xf5c3c3c3, 0xf8c2c2c2, 0xfac1c1c1, 0xfac1c1c1, 0xfcc1c1c1, + 0xfcc1c1c1, 0xfcc1c1c1, 0xfcc1c1c1, 0xfcc1c1c1, 0xfcc1c1c1, + 0xfdc1c1c1, 0xfdc1c1c1, 0xfdc1c1c1, 0xfdc1c1c1, 0xfdc1c1c1, + 0xfdc1c1c1, 0xfdc1c1c1, 0xfdc1c1c1, 0xfdc1c1c1, 0xfdc1c1c1, + 0xfdc1c1c1, 0xfdc1c1c1, 0xfcc1c1c1, 0xfcc1c1c1, 0xfcc1c1c1, + 0xfcc1c1c1, 0xfcc1c1c1, 0xfcc1c1c1, 0xfac1c1c1, 0xfac1c1c1, + 0xf8c2c2c2, 0xf5c3c3c3, 0xf1c4c4c4, 0xecc5c5c5, 0xe4c6c6c6, + 0xdcc9c9c9, 0xd0cbcbcb, 0xc2cfcfcf, 0xb3d3d3d3, 0xa1d7d7d7, + 0x8fdcdcdc, 0x7be1e1e1, 0x68e5e5e5, 0x55eaeaea, 0x44eeeeee, + 0x34f2f2f2, 0x37f2f2f2, 0x47eeeeee, 0x58e9e9e9, 0x6be4e4e4, + 0x7fe0e0e0, 0x93dbdbdb, 0xa5d6d6d6, 0xb7d2d2d2, 0xc6cecece, + 0xd4cacaca, 0xdfc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf3c3c3c3, + 0xf7c2c2c2, 0xfac2c2c2, 0xfbc1c1c1, 0xfcc1c1c1, 0xfdc0c0c0, + 0xfdc0c0c0, 0xfdc0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc0c0c0, 0xfdc0c0c0, 0xfdc0c0c0, 0xfcc1c1c1, 0xfbc1c1c1, + 0xfac2c2c2, 0xf7c2c2c2, 0xf3c3c3c3, 0xeec4c4c4, 0xe7c6c6c6, + 0xdfc8c8c8, 0xd4cacaca, 0xc6cecece, 0xb7d2d2d2, 0xa5d6d6d6, + 0x93dbdbdb, 0x7fe0e0e0, 0x6be4e4e4, 0x58e9e9e9, 0x47eeeeee, + 0x37f2f2f2, 0x38f1f1f1, 0x49ededed, 0x5be9e9e9, 0x6ee4e4e4, + 0x82dfdfdf, 0x96dadada, 0xa9d5d5d5, 0xbbd1d1d1, 0xc9cecece, + 0xd7cacaca, 0xe2c7c7c7, 0xeac5c5c5, 0xf0c4c4c4, 0xf5c3c3c3, + 0xf9c2c2c2, 0xfbc1c1c1, 0xfcc0c0c0, 0xfdc0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfdc0c0c0, 0xfcc0c0c0, + 0xfbc1c1c1, 0xf9c2c2c2, 0xf5c3c3c3, 0xf0c4c4c4, 0xeac5c5c5, + 0xe2c7c7c7, 0xd7cacaca, 0xc9cecece, 0xbbd1d1d1, 0xa9d5d5d5, + 0x96dadada, 0x82dfdfdf, 0x6ee4e4e4, 0x5be9e9e9, 0x49ededed, + 0x38f1f1f1, 0x3af1f1f1, 0x4bededed, 0x5de8e8e8, 0x70e3e3e3, + 0x85dedede, 0x99d9d9d9, 0xabd4d4d4, 0xbdd0d0d0, 0xcccdcdcd, + 0xd9c9c9c9, 0xe4c7c7c7, 0xebc5c5c5, 0xf2c4c4c4, 0xf6c2c2c2, + 0xfac1c1c1, 0xfcc1c1c1, 0xfdc0c0c0, 0xfdc0c0c0, 0xfec0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfdc0c0c0, 0xfdc0c0c0, + 0xfcc1c1c1, 0xfac1c1c1, 0xf6c2c2c2, 0xf2c4c4c4, 0xebc5c5c5, + 0xe4c7c7c7, 0xd9c9c9c9, 0xcccdcdcd, 0xbdd0d0d0, 0xabd4d4d4, + 0x99d9d9d9, 0x85dedede, 0x70e3e3e3, 0x5de8e8e8, 0x4bededed, + 0x3af1f1f1, 0x3bf1f1f1, 0x4cededed, 0x5ee8e8e8, 0x72e3e3e3, + 0x87dedede, 0x9ad9d9d9, 0xadd4d4d4, 0xbfd0d0d0, 0xcdcdcdcd, + 0xdac9c9c9, 0xe5c7c7c7, 0xecc4c4c4, 0xf3c3c3c3, 0xf7c2c2c2, + 0xfac1c1c1, 0xfcc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfcc1c1c1, 0xfac1c1c1, 0xf7c2c2c2, 0xf3c3c3c3, 0xecc4c4c4, + 0xe5c7c7c7, 0xdac9c9c9, 0xcdcdcdcd, 0xbfd0d0d0, 0xadd4d4d4, + 0x9ad9d9d9, 0x87dedede, 0x72e3e3e3, 0x5ee8e8e8, 0x4cededed, + 0x3bf1f1f1, 0x3cf0f0f0, 0x4dececec, 0x5fe7e7e7, 0x73e3e3e3, + 0x88dedede, 0x9cd9d9d9, 0xaed4d4d4, 0xc0cfcfcf, 0xcecccccc, + 0xdbc8c8c8, 0xe6c6c6c6, 0xedc4c4c4, 0xf3c3c3c3, 0xf7c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf7c2c2c2, 0xf3c3c3c3, 0xedc4c4c4, + 0xe6c6c6c6, 0xdbc8c8c8, 0xcecccccc, 0xc0cfcfcf, 0xaed4d4d4, + 0x9cd9d9d9, 0x88dedede, 0x73e3e3e3, 0x5fe7e7e7, 0x4dececec, + 0x3cf0f0f0, 0x3cf0f0f0, 0x4eececec, 0x60e7e7e7, 0x74e2e2e2, + 0x89dddddd, 0x9dd8d8d8, 0xafd3d3d3, 0xc1cfcfcf, 0xcfcccccc, + 0xdcc8c8c8, 0xe6c6c6c6, 0xedc4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xedc4c4c4, + 0xe6c6c6c6, 0xdcc8c8c8, 0xcfcccccc, 0xc1cfcfcf, 0xafd3d3d3, + 0x9dd8d8d8, 0x89dddddd, 0x74e2e2e2, 0x60e7e7e7, 0x4eececec, + 0x3cf0f0f0, 0x3cf0f0f0, 0x4eececec, 0x60e7e7e7, 0x74e2e2e2, + 0x89dddddd, 0x9dd8d8d8, 0xafd3d3d3, 0xc1cfcfcf, 0xcfcccccc, + 0xdcc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xdcc8c8c8, 0xcfcccccc, 0xc1cfcfcf, 0xafd3d3d3, + 0x9dd8d8d8, 0x89dddddd, 0x74e2e2e2, 0x60e7e7e7, 0x4eececec, + 0x3cf0f0f0, 0x3df0f0f0, 0x4fececec, 0x61e7e7e7, 0x75e2e2e2, + 0x8adddddd, 0x9ed8d8d8, 0xb0d3d3d3, 0xc2cfcfcf, 0xd0cccccc, + 0xddc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xddc8c8c8, 0xd0cccccc, 0xc2cfcfcf, 0xb0d3d3d3, + 0x9ed8d8d8, 0x8adddddd, 0x75e2e2e2, 0x61e7e7e7, 0x4fececec, + 0x3df0f0f0, 0x3df0f0f0, 0x4fececec, 0x61e7e7e7, 0x75e2e2e2, + 0x8adddddd, 0x9ed8d8d8, 0xb0d3d3d3, 0xc2cfcfcf, 0xd0cccccc, + 0xddc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xddc8c8c8, 0xd0cccccc, 0xc2cfcfcf, 0xb0d3d3d3, + 0x9ed8d8d8, 0x8adddddd, 0x75e2e2e2, 0x61e7e7e7, 0x4fececec, + 0x3df0f0f0, 0x3df0f0f0, 0x4fececec, 0x61e7e7e7, 0x75e2e2e2, + 0x8adddddd, 0x9ed8d8d8, 0xb0d3d3d3, 0xc2cfcfcf, 0xd0cccccc, + 0xddc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xddc8c8c8, 0xd0cccccc, 0xc2cfcfcf, 0xb0d3d3d3, + 0x9ed8d8d8, 0x8adddddd, 0x75e2e2e2, 0x61e7e7e7, 0x4fececec, + 0x3df0f0f0, 0x3df0f0f0, 0x4fececec, 0x61e7e7e7, 0x75e2e2e2, + 0x8adddddd, 0x9ed8d8d8, 0xb0d3d3d3, 0xc2cfcfcf, 0xd0cccccc, + 0xddc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xddc8c8c8, 0xd0cccccc, 0xc2cfcfcf, 0xb0d3d3d3, + 0x9ed8d8d8, 0x8adddddd, 0x75e2e2e2, 0x61e7e7e7, 0x4fececec, + 0x3df0f0f0, 0x3df0f0f0, 0x4fececec, 0x61e7e7e7, 0x75e2e2e2, + 0x8adddddd, 0x9ed8d8d8, 0xb0d3d3d3, 0xc2cfcfcf, 0xd0cccccc, + 0xddc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xddc8c8c8, 0xd0cccccc, 0xc2cfcfcf, 0xb0d3d3d3, + 0x9ed8d8d8, 0x8adddddd, 0x75e2e2e2, 0x61e7e7e7, 0x4fececec, + 0x3df0f0f0, 0x3df0f0f0, 0x4fececec, 0x61e7e7e7, 0x75e2e2e2, + 0x8adddddd, 0x9ed8d8d8, 0xb0d3d3d3, 0xc2cfcfcf, 0xd0cccccc, + 0xddc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xddc8c8c8, 0xd0cccccc, 0xc2cfcfcf, 0xb0d3d3d3, + 0x9ed8d8d8, 0x8adddddd, 0x75e2e2e2, 0x61e7e7e7, 0x4fececec, + 0x3df0f0f0, 0x3df0f0f0, 0x4fececec, 0x61e7e7e7, 0x75e2e2e2, + 0x8adddddd, 0x9ed8d8d8, 0xb0d3d3d3, 0xc2cfcfcf, 0xd0cccccc, + 0xddc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xddc8c8c8, 0xd0cccccc, 0xc2cfcfcf, 0xb0d3d3d3, + 0x9ed8d8d8, 0x8adddddd, 0x75e2e2e2, 0x61e7e7e7, 0x4fececec, + 0x3df0f0f0, 0x3df0f0f0, 0x4fececec, 0x61e7e7e7, 0x75e2e2e2, + 0x8adddddd, 0x9ed8d8d8, 0xb0d3d3d3, 0xc2cfcfcf, 0xd0cccccc, + 0xddc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xddc8c8c8, 0xd0cccccc, 0xc2cfcfcf, 0xb0d3d3d3, + 0x9ed8d8d8, 0x8adddddd, 0x75e2e2e2, 0x61e7e7e7, 0x4fececec, + 0x3df0f0f0, 0x3df0f0f0, 0x4fececec, 0x61e7e7e7, 0x75e2e2e2, + 0x8adddddd, 0x9ed8d8d8, 0xb0d3d3d3, 0xc2cfcfcf, 0xd0cccccc, + 0xddc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xddc8c8c8, 0xd0cccccc, 0xc2cfcfcf, 0xb0d3d3d3, + 0x9ed8d8d8, 0x8adddddd, 0x75e2e2e2, 0x61e7e7e7, 0x4fececec, + 0x3df0f0f0, 0x3df0f0f0, 0x4fececec, 0x61e7e7e7, 0x75e2e2e2, + 0x8adddddd, 0x9ed8d8d8, 0xb0d3d3d3, 0xc2cfcfcf, 0xd0cccccc, + 0xddc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xddc8c8c8, 0xd0cccccc, 0xc2cfcfcf, 0xb0d3d3d3, + 0x9ed8d8d8, 0x8adddddd, 0x75e2e2e2, 0x61e7e7e7, 0x4fececec, + 0x3df0f0f0, 0x3df0f0f0, 0x4fececec, 0x61e7e7e7, 0x75e2e2e2, + 0x8adddddd, 0x9ed8d8d8, 0xb0d3d3d3, 0xc2cfcfcf, 0xd0cccccc, + 0xddc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xddc8c8c8, 0xd0cccccc, 0xc2cfcfcf, 0xb0d3d3d3, + 0x9ed8d8d8, 0x8adddddd, 0x75e2e2e2, 0x61e7e7e7, 0x4fececec, + 0x3df0f0f0, 0x3df0f0f0, 0x4fececec, 0x61e7e7e7, 0x75e2e2e2, + 0x8adddddd, 0x9ed8d8d8, 0xb0d3d3d3, 0xc2cfcfcf, 0xd0cccccc, + 0xddc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xddc8c8c8, 0xd0cccccc, 0xc2cfcfcf, 0xb0d3d3d3, + 0x9ed8d8d8, 0x8adddddd, 0x75e2e2e2, 0x61e7e7e7, 0x4fececec, + 0x3df0f0f0, 0x3df0f0f0, 0x4fececec, 0x61e7e7e7, 0x75e2e2e2, + 0x8adddddd, 0x9ed8d8d8, 0xb0d3d3d3, 0xc2cfcfcf, 0xd0cccccc, + 0xddc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xddc8c8c8, 0xd0cccccc, 0xc2cfcfcf, 0xb0d3d3d3, + 0x9ed8d8d8, 0x8adddddd, 0x75e2e2e2, 0x61e7e7e7, 0x4fececec, + 0x3df0f0f0, 0x3df0f0f0, 0x4fececec, 0x61e7e7e7, 0x75e2e2e2, + 0x8adddddd, 0x9ed8d8d8, 0xb0d3d3d3, 0xc2cfcfcf, 0xd0cccccc, + 0xddc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xddc8c8c8, 0xd0cccccc, 0xc2cfcfcf, 0xb0d3d3d3, + 0x9ed8d8d8, 0x8adddddd, 0x75e2e2e2, 0x61e7e7e7, 0x4fececec, + 0x3df0f0f0, 0x3df0f0f0, 0x4fececec, 0x61e7e7e7, 0x75e2e2e2, + 0x8adddddd, 0x9ed8d8d8, 0xb0d3d3d3, 0xc2cfcfcf, 0xd0cccccc, + 0xddc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xddc8c8c8, 0xd0cccccc, 0xc2cfcfcf, 0xb0d3d3d3, + 0x9ed8d8d8, 0x8adddddd, 0x75e2e2e2, 0x61e7e7e7, 0x4fececec, + 0x3df0f0f0, 0x3cf0f0f0, 0x4eececec, 0x60e7e7e7, 0x74e2e2e2, + 0x89dddddd, 0x9dd8d8d8, 0xafd3d3d3, 0xc1cfcfcf, 0xcfcccccc, + 0xdcc8c8c8, 0xe7c6c6c6, 0xeec4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xeec4c4c4, + 0xe7c6c6c6, 0xdcc8c8c8, 0xcfcccccc, 0xc1cfcfcf, 0xafd3d3d3, + 0x9dd8d8d8, 0x89dddddd, 0x74e2e2e2, 0x60e7e7e7, 0x4eececec, + 0x3cf0f0f0, 0x3cf0f0f0, 0x4eececec, 0x60e7e7e7, 0x74e2e2e2, + 0x89dddddd, 0x9dd8d8d8, 0xafd3d3d3, 0xc1cfcfcf, 0xcfcccccc, + 0xdcc8c8c8, 0xe6c6c6c6, 0xedc4c4c4, 0xf4c3c3c3, 0xf8c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf8c2c2c2, 0xf4c3c3c3, 0xedc4c4c4, + 0xe6c6c6c6, 0xdcc8c8c8, 0xcfcccccc, 0xc1cfcfcf, 0xafd3d3d3, + 0x9dd8d8d8, 0x89dddddd, 0x74e2e2e2, 0x60e7e7e7, 0x4eececec, + 0x3cf0f0f0, 0x3cf0f0f0, 0x4dececec, 0x5fe8e8e8, 0x73e3e3e3, + 0x88dedede, 0x9cd9d9d9, 0xaed4d4d4, 0xc0d0d0d0, 0xcecccccc, + 0xdbc8c8c8, 0xe6c6c6c6, 0xedc4c4c4, 0xf3c3c3c3, 0xf7c2c2c2, + 0xfbc1c1c1, 0xfdc1c1c1, 0xfec0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfdc1c1c1, 0xfbc1c1c1, 0xf7c2c2c2, 0xf3c3c3c3, 0xedc4c4c4, + 0xe6c6c6c6, 0xdbc8c8c8, 0xcecccccc, 0xc0d0d0d0, 0xaed4d4d4, + 0x9cd9d9d9, 0x88dedede, 0x73e3e3e3, 0x5fe8e8e8, 0x4dececec, + 0x3cf0f0f0, 0x3bf1f1f1, 0x4cededed, 0x5ee8e8e8, 0x72e3e3e3, + 0x86dedede, 0x9ad9d9d9, 0xadd4d4d4, 0xbfd0d0d0, 0xcdcdcdcd, + 0xdac9c9c9, 0xe5c7c7c7, 0xecc4c4c4, 0xf2c3c3c3, 0xf7c2c2c2, + 0xfac1c1c1, 0xfcc1c1c1, 0xfdc0c0c0, 0xfec0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, + 0xffc0c0c0, 0xffc0c0c0, 0xffc0c0c0, 0xfec0c0c0, 0xfdc0c0c0, + 0xfcc1c1c1, 0xfac1c1c1, 0xf7c2c2c2, 0xf2c3c3c3, 0xecc4c4c4, + 0xe5c7c7c7, 0xdac9c9c9, 0xcdcdcdcd, 0xbfd0d0d0, 0xadd4d4d4, + 0x9ad9d9d9, 0x86dedede, 0x72e3e3e3, 0x5ee8e8e8, 0x4cededed, + 0x3bf1f1f1, 0x3af1f1f1, 0x4bededed, 0x5de8e8e8, 0x70e3e3e3, + 0x85dedede, 0x99d9d9d9, 0xabd4d4d4, 0xbdd0d0d0, 0xcbcdcdcd, + 0xd9c9c9c9, 0xe3c7c7c7, 0xebc5c5c5, 0xf1c4c4c4, 0xf6c3c3c3, + 0xf9c1c1c1, 0xfcc1c1c1, 0xfdc0c0c0, 0xfdc0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfdc0c0c0, 0xfdc0c0c0, + 0xfcc1c1c1, 0xf9c1c1c1, 0xf6c3c3c3, 0xf1c4c4c4, 0xebc5c5c5, + 0xe3c7c7c7, 0xd9c9c9c9, 0xcbcdcdcd, 0xbdd0d0d0, 0xabd4d4d4, + 0x99d9d9d9, 0x85dedede, 0x70e3e3e3, 0x5de8e8e8, 0x4bededed, + 0x3af1f1f1, 0x38f1f1f1, 0x49ededed, 0x5be9e9e9, 0x6ee4e4e4, + 0x82dfdfdf, 0x96dadada, 0xa8d5d5d5, 0xbad1d1d1, 0xc9cecece, + 0xd7cacaca, 0xe1c7c7c7, 0xe9c5c5c5, 0xf0c4c4c4, 0xf4c3c3c3, + 0xf8c2c2c2, 0xfac2c2c2, 0xfcc1c1c1, 0xfcc0c0c0, 0xfdc0c0c0, + 0xfdc0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, 0xfec0c0c0, + 0xfec0c0c0, 0xfdc0c0c0, 0xfdc0c0c0, 0xfcc0c0c0, 0xfcc1c1c1, + 0xfac2c2c2, 0xf8c2c2c2, 0xf4c3c3c3, 0xf0c4c4c4, 0xe9c5c5c5, + 0xe1c7c7c7, 0xd7cacaca, 0xc9cecece, 0xbad1d1d1, 0xa8d5d5d5, + 0x96dadada, 0x82dfdfdf, 0x6ee4e4e4, 0x5be9e9e9, 0x49ededed, + 0x38f1f1f1, 0x37f2f2f2, 0x47eeeeee, 0x58e9e9e9, 0x6be5e5e5, + 0x7fe0e0e0, 0x93dbdbdb, 0xa5d6d6d6, 0xb7d2d2d2, 0xc6cecece, + 0xd3cacaca, 0xdec8c8c8, 0xe7c6c6c6, 0xeec5c5c5, 0xf2c3c3c3, + 0xf6c2c2c2, 0xf9c2c2c2, 0xfac1c1c1, 0xfbc1c1c1, 0xfcc1c1c1, + 0xfcc1c1c1, 0xfcc1c1c1, 0xfcc1c1c1, 0xfcc1c1c1, 0xfdc1c1c1, + 0xfdc1c1c1, 0xfdc1c1c1, 0xfdc1c1c1, 0xfdc1c1c1, 0xfdc1c1c1, + 0xfdc1c1c1, 0xfdc1c1c1, 0xfdc1c1c1, 0xfdc1c1c1, 0xfdc1c1c1, + 0xfdc1c1c1, 0xfdc1c1c1, 0xfdc1c1c1, 0xfcc1c1c1, 0xfcc1c1c1, + 0xfcc1c1c1, 0xfcc1c1c1, 0xfcc1c1c1, 0xfbc1c1c1, 0xfac1c1c1, + 0xf9c2c2c2, 0xf6c2c2c2, 0xf2c3c3c3, 0xeec5c5c5, 0xe7c6c6c6, + 0xdec8c8c8, 0xd3cacaca, 0xc6cecece, 0xb7d2d2d2, 0xa5d6d6d6, + 0x93dbdbdb, 0x7fe0e0e0, 0x6be5e5e5, 0x58e9e9e9, 0x47eeeeee, + 0x37f2f2f2, 0x34f2f2f2, 0x44eeeeee, 0x55eaeaea, 0x67e5e5e5, + 0x7be1e1e1, 0x8edcdcdc, 0xa1d7d7d7, 0xb3d3d3d3, 0xc2cfcfcf, + 0xcfcccccc, 0xdbc9c9c9, 0xe3c7c7c7, 0xeac5c5c5, 0xf0c4c4c4, + 0xf3c3c3c3, 0xf6c3c3c3, 0xf8c2c2c2, 0xf9c1c1c1, 0xfac1c1c1, + 0xfac1c1c1, 0xfac1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, + 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, + 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, + 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, 0xfbc1c1c1, + 0xfac1c1c1, 0xfac1c1c1, 0xfac1c1c1, 0xf9c1c1c1, 0xf8c2c2c2, + 0xf6c3c3c3, 0xf3c3c3c3, 0xf0c4c4c4, 0xeac5c5c5, 0xe3c7c7c7, + 0xdbc9c9c9, 0xcfcccccc, 0xc2cfcfcf, 0xb3d3d3d3, 0xa1d7d7d7, + 0x8edcdcdc, 0x7be1e1e1, 0x67e5e5e5, 0x55eaeaea, 0x44eeeeee, + 0x34f2f2f2, 0x32f3f3f3, 0x41efefef, 0x51ebebeb, 0x63e7e7e7, + 0x76e2e2e2, 0x89dddddd, 0x9bd8d8d8, 0xadd4d4d4, 0xbcd1d1d1, + 0xcacdcdcd, 0xd5cacaca, 0xdec8c8c8, 0xe6c6c6c6, 0xebc5c5c5, + 0xf0c4c4c4, 0xf3c3c3c3, 0xf5c2c2c2, 0xf6c2c2c2, 0xf7c2c2c2, + 0xf7c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, + 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, + 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, + 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, 0xf8c2c2c2, + 0xf8c2c2c2, 0xf7c2c2c2, 0xf7c2c2c2, 0xf6c2c2c2, 0xf5c2c2c2, + 0xf3c3c3c3, 0xf0c4c4c4, 0xebc5c5c5, 0xe6c6c6c6, 0xdec8c8c8, + 0xd5cacaca, 0xcacdcdcd, 0xbcd1d1d1, 0xadd4d4d4, 0x9bd8d8d8, + 0x89dddddd, 0x76e2e2e2, 0x63e7e7e7, 0x51ebebeb, 0x41efefef, + 0x32f3f3f3, 0x2ef4f4f4, 0x3df0f0f0, 0x4cececec, 0x5ee8e8e8, + 0x70e3e3e3, 0x83dfdfdf, 0x94dadada, 0xa6d6d6d6, 0xb5d2d2d2, + 0xc3cfcfcf, 0xcfcccccc, 0xd8c9c9c9, 0xe0c8c8c8, 0xe6c6c6c6, + 0xeac5c5c5, 0xeec5c5c5, 0xf0c4c4c4, 0xf1c3c3c3, 0xf3c3c3c3, + 0xf3c3c3c3, 0xf3c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, + 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, + 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, + 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, 0xf4c3c3c3, + 0xf3c3c3c3, 0xf3c3c3c3, 0xf3c3c3c3, 0xf1c3c3c3, 0xf0c4c4c4, + 0xeec5c5c5, 0xeac5c5c5, 0xe6c6c6c6, 0xe0c8c8c8, 0xd8c9c9c9, + 0xcfcccccc, 0xc3cfcfcf, 0xb5d2d2d2, 0xa6d6d6d6, 0x94dadada, + 0x83dfdfdf, 0x70e3e3e3, 0x5ee8e8e8, 0x4cececec, 0x3df0f0f0, + 0x2ef4f4f4, 0x2bf4f4f4, 0x38f1f1f1, 0x47eeeeee, 0x57e9e9e9, + 0x69e5e5e5, 0x7be1e1e1, 0x8cdcdcdc, 0x9dd8d8d8, 0xadd4d4d4, + 0xbbd1d1d1, 0xc7cecece, 0xd0cbcbcb, 0xd8cacaca, 0xdfc8c8c8, + 0xe3c7c7c7, 0xe7c6c6c6, 0xeac5c5c5, 0xebc5c5c5, 0xedc5c5c5, + 0xedc4c4c4, 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, + 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, + 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, + 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, 0xeec4c4c4, + 0xeec4c4c4, 0xedc4c4c4, 0xedc5c5c5, 0xebc5c5c5, 0xeac5c5c5, + 0xe7c6c6c6, 0xe3c7c7c7, 0xdfc8c8c8, 0xd8cacaca, 0xd0cbcbcb, + 0xc7cecece, 0xbbd1d1d1, 0xadd4d4d4, 0x9dd8d8d8, 0x8cdcdcdc, + 0x7be1e1e1, 0x69e5e5e5, 0x57e9e9e9, 0x47eeeeee, 0x38f1f1f1, + 0x2bf4f4f4, 0x27f5f5f5, 0x33f2f2f2, 0x41efefef, 0x50ebebeb, + 0x61e7e7e7, 0x72e3e3e3, 0x83dedede, 0x94dadada, 0xa3d7d7d7, + 0xb0d3d3d3, 0xbcd0d0d0, 0xc6cecece, 0xcfcccccc, 0xd5cacaca, + 0xdac9c9c9, 0xdec8c8c8, 0xe1c7c7c7, 0xe3c7c7c7, 0xe4c7c7c7, + 0xe5c6c6c6, 0xe6c6c6c6, 0xe6c6c6c6, 0xe6c6c6c6, 0xe6c6c6c6, + 0xe7c6c6c6, 0xe7c6c6c6, 0xe7c6c6c6, 0xe7c6c6c6, 0xe7c6c6c6, + 0xe7c6c6c6, 0xe7c6c6c6, 0xe7c6c6c6, 0xe7c6c6c6, 0xe7c6c6c6, + 0xe7c6c6c6, 0xe7c6c6c6, 0xe6c6c6c6, 0xe6c6c6c6, 0xe6c6c6c6, + 0xe6c6c6c6, 0xe5c6c6c6, 0xe4c7c7c7, 0xe3c7c7c7, 0xe1c7c7c7, + 0xdec8c8c8, 0xdac9c9c9, 0xd5cacaca, 0xcfcccccc, 0xc6cecece, + 0xbcd0d0d0, 0xb0d3d3d3, 0xa3d7d7d7, 0x94dadada, 0x83dedede, + 0x72e3e3e3, 0x61e7e7e7, 0x50ebebeb, 0x41efefef, 0x33f2f2f2, + 0x27f5f5f5, 0x23f6f6f6, 0x2ef4f4f4, 0x3bf1f1f1, 0x49ededed, + 0x58e9e9e9, 0x68e5e5e5, 0x78e1e1e1, 0x88dddddd, 0x97dadada, + 0xa5d6d6d6, 0xb0d3d3d3, 0xbbd1d1d1, 0xc3cfcfcf, 0xcacdcdcd, + 0xcfcccccc, 0xd3cbcbcb, 0xd7cacaca, 0xd9c9c9c9, 0xdac9c9c9, + 0xdbc9c9c9, 0xdcc9c9c9, 0xdcc9c9c9, 0xdcc9c9c9, 0xddc9c9c9, + 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, + 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, 0xddc8c8c8, + 0xddc8c8c8, 0xddc8c8c8, 0xddc9c9c9, 0xdcc9c9c9, 0xdcc9c9c9, + 0xdcc9c9c9, 0xdbc9c9c9, 0xdac9c9c9, 0xd9c9c9c9, 0xd7cacaca, + 0xd3cbcbcb, 0xcfcccccc, 0xcacdcdcd, 0xc3cfcfcf, 0xbbd1d1d1, + 0xb0d3d3d3, 0xa5d6d6d6, 0x97dadada, 0x88dddddd, 0x78e1e1e1, + 0x68e5e5e5, 0x58e9e9e9, 0x49ededed, 0x3bf1f1f1, 0x2ef4f4f4, + 0x23f6f6f6, 0x1ef7f7f7, 0x28f5f5f5, 0x34f2f2f2, 0x41efefef, + 0x4fececec, 0x5ee8e8e8, 0x6de4e4e4, 0x7ce0e0e0, 0x8adddddd, + 0x97dadada, 0xa3d7d7d7, 0xadd4d4d4, 0xb5d2d2d2, 0xbcd1d1d1, + 0xc2cfcfcf, 0xc6cecece, 0xc9cdcdcd, 0xcccdcdcd, 0xcdcccccc, + 0xcecccccc, 0xcfcccccc, 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, + 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, + 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, + 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, 0xd0cccccc, + 0xcfcccccc, 0xcecccccc, 0xcdcccccc, 0xcccdcdcd, 0xc9cdcdcd, + 0xc6cecece, 0xc2cfcfcf, 0xbcd1d1d1, 0xb5d2d2d2, 0xadd4d4d4, + 0xa3d7d7d7, 0x97dadada, 0x8adddddd, 0x7ce0e0e0, 0x6de4e4e4, + 0x5ee8e8e8, 0x4fececec, 0x41efefef, 0x34f2f2f2, 0x28f5f5f5, + 0x1ef7f7f7, 0x1af9f9f9, 0x23f6f6f6, 0x2df4f4f4, 0x39f1f1f1, + 0x45eeeeee, 0x53ebebeb, 0x61e7e7e7, 0x6fe4e4e4, 0x7ce0e0e0, + 0x88dddddd, 0x93dbdbdb, 0x9dd8d8d8, 0xa6d6d6d6, 0xadd4d4d4, + 0xb2d3d3d3, 0xb7d2d2d2, 0xbad1d1d1, 0xbdd0d0d0, 0xbed0d0d0, + 0xbfd0d0d0, 0xc0cfcfcf, 0xc1cfcfcf, 0xc1cfcfcf, 0xc1cfcfcf, + 0xc1cfcfcf, 0xc1cfcfcf, 0xc2cfcfcf, 0xc2cfcfcf, 0xc2cfcfcf, + 0xc2cfcfcf, 0xc2cfcfcf, 0xc2cfcfcf, 0xc2cfcfcf, 0xc2cfcfcf, + 0xc1cfcfcf, 0xc1cfcfcf, 0xc1cfcfcf, 0xc1cfcfcf, 0xc1cfcfcf, + 0xc0cfcfcf, 0xbfd0d0d0, 0xbed0d0d0, 0xbdd0d0d0, 0xbad1d1d1, + 0xb7d2d2d2, 0xb2d3d3d3, 0xadd4d4d4, 0xa6d6d6d6, 0x9dd8d8d8, + 0x93dbdbdb, 0x88dddddd, 0x7ce0e0e0, 0x6fe4e4e4, 0x61e7e7e7, + 0x53ebebeb, 0x45eeeeee, 0x39f1f1f1, 0x2df4f4f4, 0x23f6f6f6, + 0x1af9f9f9, 0x16fafafa, 0x1df8f8f8, 0x26f6f6f6, 0x30f3f3f3, + 0x3cf0f0f0, 0x48ededed, 0x54eaeaea, 0x61e7e7e7, 0x6de4e4e4, + 0x79e1e1e1, 0x83dfdfdf, 0x8ddcdcdc, 0x95dadada, 0x9bd9d9d9, + 0xa1d7d7d7, 0xa5d6d6d6, 0xa9d5d5d5, 0xabd5d5d5, 0xadd4d4d4, + 0xaed4d4d4, 0xafd4d4d4, 0xb0d4d4d4, 0xb0d3d3d3, 0xb0d3d3d3, + 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d3d3d3, + 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d3d3d3, + 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d3d3d3, 0xb0d4d4d4, + 0xafd4d4d4, 0xaed4d4d4, 0xadd4d4d4, 0xabd5d5d5, 0xa9d5d5d5, + 0xa5d6d6d6, 0xa1d7d7d7, 0x9bd9d9d9, 0x95dadada, 0x8ddcdcdc, + 0x83dfdfdf, 0x79e1e1e1, 0x6de4e4e4, 0x61e7e7e7, 0x54eaeaea, + 0x48ededed, 0x3cf0f0f0, 0x30f3f3f3, 0x26f6f6f6, 0x1df8f8f8, + 0x16fafafa, 0x12fbfbfb, 0x18f9f9f9, 0x20f7f7f7, 0x28f5f5f5, + 0x32f3f3f3, 0x3df0f0f0, 0x48ededed, 0x53eaeaea, 0x5ee8e8e8, + 0x68e5e5e5, 0x72e3e3e3, 0x7be1e1e1, 0x82dfdfdf, 0x89dddddd, + 0x8edcdcdc, 0x93dbdbdb, 0x96dadada, 0x98d9d9d9, 0x9ad9d9d9, + 0x9bd9d9d9, 0x9cd8d8d8, 0x9dd8d8d8, 0x9dd8d8d8, 0x9dd8d8d8, + 0x9ed8d8d8, 0x9ed8d8d8, 0x9ed8d8d8, 0x9ed8d8d8, 0x9ed8d8d8, + 0x9ed8d8d8, 0x9ed8d8d8, 0x9ed8d8d8, 0x9ed8d8d8, 0x9ed8d8d8, + 0x9ed8d8d8, 0x9ed8d8d8, 0x9dd8d8d8, 0x9dd8d8d8, 0x9dd8d8d8, + 0x9cd8d8d8, 0x9bd9d9d9, 0x9ad9d9d9, 0x98d9d9d9, 0x96dadada, + 0x93dbdbdb, 0x8edcdcdc, 0x89dddddd, 0x82dfdfdf, 0x7be1e1e1, + 0x72e3e3e3, 0x68e5e5e5, 0x5ee8e8e8, 0x53eaeaea, 0x48ededed, + 0x3df0f0f0, 0x32f3f3f3, 0x28f5f5f5, 0x20f7f7f7, 0x18f9f9f9, + 0x12fbfbfb, 0x0efbfbfb, 0x14fafafa, 0x1af9f9f9, 0x21f7f7f7, + 0x29f5f5f5, 0x32f3f3f3, 0x3cf0f0f0, 0x45eeeeee, 0x4febebeb, + 0x58e9e9e9, 0x61e7e7e7, 0x69e5e5e5, 0x70e3e3e3, 0x76e2e2e2, + 0x7be1e1e1, 0x7fe0e0e0, 0x82dfdfdf, 0x85dedede, 0x86dedede, + 0x87dedede, 0x88dddddd, 0x89dddddd, 0x89dddddd, 0x89dddddd, + 0x8adddddd, 0x8adddddd, 0x8adddddd, 0x8adddddd, 0x8adddddd, + 0x8adddddd, 0x8adddddd, 0x8adddddd, 0x8adddddd, 0x8adddddd, + 0x8adddddd, 0x8adddddd, 0x89dddddd, 0x89dddddd, 0x89dddddd, + 0x88dddddd, 0x87dedede, 0x86dedede, 0x85dedede, 0x82dfdfdf, + 0x7fe0e0e0, 0x7be1e1e1, 0x76e2e2e2, 0x70e3e3e3, 0x69e5e5e5, + 0x61e7e7e7, 0x58e9e9e9, 0x4febebeb, 0x45eeeeee, 0x3cf0f0f0, + 0x32f3f3f3, 0x29f5f5f5, 0x21f7f7f7, 0x1af9f9f9, 0x14fafafa, + 0x0efbfbfb, 0x0bfcfcfc, 0x0ffbfbfb, 0x14fafafa, 0x1af8f8f8, + 0x21f7f7f7, 0x29f5f5f5, 0x30f3f3f3, 0x39f1f1f1, 0x41efefef, + 0x49ededed, 0x51ebebeb, 0x58e9e9e9, 0x5ee8e8e8, 0x63e6e6e6, + 0x68e5e5e5, 0x6be4e4e4, 0x6ee4e4e4, 0x70e3e3e3, 0x72e3e3e3, + 0x73e3e3e3, 0x74e2e2e2, 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, + 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, + 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, + 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, 0x75e2e2e2, + 0x74e2e2e2, 0x73e3e3e3, 0x72e3e3e3, 0x70e3e3e3, 0x6ee4e4e4, + 0x6be4e4e4, 0x68e5e5e5, 0x63e6e6e6, 0x5ee8e8e8, 0x58e9e9e9, + 0x51ebebeb, 0x49ededed, 0x41efefef, 0x39f1f1f1, 0x30f3f3f3, + 0x29f5f5f5, 0x21f7f7f7, 0x1af8f8f8, 0x14fafafa, 0x0ffbfbfb, + 0x0bfcfcfc, 0x09fdfdfd, 0x0cfcfcfc, 0x10fbfbfb, 0x14fafafa, + 0x1af9f9f9, 0x20f7f7f7, 0x26f6f6f6, 0x2df4f4f4, 0x34f2f2f2, + 0x3bf0f0f0, 0x41efefef, 0x47ededed, 0x4cececec, 0x51ebebeb, + 0x55eaeaea, 0x58e9e9e9, 0x5be9e9e9, 0x5de8e8e8, 0x5ee8e8e8, + 0x5fe7e7e7, 0x60e7e7e7, 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, + 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, + 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, + 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, 0x61e7e7e7, + 0x60e7e7e7, 0x5fe7e7e7, 0x5ee8e8e8, 0x5de8e8e8, 0x5be9e9e9, + 0x58e9e9e9, 0x55eaeaea, 0x51ebebeb, 0x4cececec, 0x47ededed, + 0x41efefef, 0x3bf0f0f0, 0x34f2f2f2, 0x2df4f4f4, 0x26f6f6f6, + 0x20f7f7f7, 0x1af9f9f9, 0x14fafafa, 0x10fbfbfb, 0x0cfcfcfc, + 0x09fdfdfd, 0x06fdfdfd, 0x09fdfdfd, 0x0cfcfcfc, 0x0ffbfbfb, + 0x14fafafa, 0x18f9f9f9, 0x1df8f8f8, 0x23f6f6f6, 0x28f5f5f5, + 0x2ef4f4f4, 0x33f2f2f2, 0x38f1f1f1, 0x3df0f0f0, 0x41efefef, + 0x44eeeeee, 0x47eeeeee, 0x49ededed, 0x4bededed, 0x4cececec, + 0x4dececec, 0x4dececec, 0x4eececec, 0x4eececec, 0x4eececec, + 0x4eececec, 0x4eececec, 0x4fececec, 0x4fececec, 0x4fececec, + 0x4fececec, 0x4fececec, 0x4fececec, 0x4fececec, 0x4fececec, + 0x4eececec, 0x4eececec, 0x4eececec, 0x4eececec, 0x4eececec, + 0x4dececec, 0x4dececec, 0x4cececec, 0x4bededed, 0x49ededed, + 0x47eeeeee, 0x44eeeeee, 0x41efefef, 0x3df0f0f0, 0x38f1f1f1, + 0x33f2f2f2, 0x2ef4f4f4, 0x28f5f5f5, 0x23f6f6f6, 0x1df8f8f8, + 0x18f9f9f9, 0x14fafafa, 0x0ffbfbfb, 0x0cfcfcfc, 0x09fdfdfd, + 0x06fdfdfd, }; + + Image shadowImage; + + public ShadowComposite(Composite parent, int style) { + super(parent, style); + addPaintListener(new PaintListener() { + + public void paintControl(PaintEvent e) { + Point size = getSize(); + Rectangle bodyRect = new Rectangle(0, 0, size.x, size.y); + drawTabBody(e.gc, bodyRect, 0); + drawTabHeader(e.gc, bodyRect, 0); + } + }); + } + + @Override + public Rectangle getClientArea() { + Rectangle area = super.getClientArea(); + return new Rectangle(15, 15, area.width - 30, area.height - 30); + } + + + + void drawTabHeader(GC gc, Rectangle bounds, int state) { + // gc.setClipping(bounds.x, bounds.y, bounds.width, + // parent.getTabHeight() + 1); + + int[] points = new int[1024]; + int index = 0; + int radius = CORNER_SIZE / 2; +// int marginWidth = parent.marginWidth; +// int marginHeight = parent.marginHeight; + int delta = INNER_KEYLINE + OUTER_KEYLINE + 2 * SIDE_DROP_WIDTH + 2 + * marginWidth; + int width = bounds.width - delta; + int height = bounds.height - INNER_KEYLINE - OUTER_KEYLINE - 2 + * marginHeight - BOTTOM_DROP_WIDTH; + int circX = bounds.x + delta / 2 + radius; + int circY = bounds.y + radius; + + // Fill in background + Region clipping = new Region(); + gc.getClipping(clipping); + Region region = new Region(); + region.add(shape); + region.intersect(clipping); + gc.setClipping(region); + +// int header = 3; // TODO: this needs to be added to computeTrim for +// // HEADER +// Rectangle trim = computeTrim(PART_HEADER, state, 0, 0, 0, 0); +// trim.width = bounds.width - trim.width; +// trim.height = (parent.getTabHeight() + 1 + header) - trim.height; +// trim.x = -trim.x; +// trim.y = -trim.y; +// +// draw(PART_BACKGROUND, SWT.NONE, trim, gc); + + gc.setClipping(clipping); + clipping.dispose(); + region.dispose(); + + int[] ltt = drawCircle(circX + 1, circY + 1, radius, LEFT_TOP); + System.arraycopy(ltt, 0, points, index, ltt.length); + index += ltt.length; + + int[] lbb = drawCircle(circX + 1, circY + height - (radius * 2) - 2, + radius, LEFT_BOTTOM); + System.arraycopy(lbb, 0, points, index, lbb.length); + index += lbb.length; + + int[] rb = drawCircle(circX + width - (radius * 2) - 2, circY + height + - (radius * 2) - 2, radius, RIGHT_BOTTOM); + System.arraycopy(rb, 0, points, index, rb.length); + index += rb.length; + + int[] rt = drawCircle(circX + width - (radius * 2) - 2, circY + 1, + radius, RIGHT_TOP); + System.arraycopy(rt, 0, points, index, rt.length); + index += rt.length; + points[index++] = points[0]; + points[index++] = points[1]; + + int[] tempPoints = new int[index]; + System.arraycopy(points, 0, tempPoints, 0, index); + + // White Keyline + // gc.setAntialias(SWT.ON); + gc.setForeground(gc.getDevice().getSystemColor(SWT.COLOR_WHITE)); + gc.drawPolyline(tempPoints); + + ltt = drawCircle(circX + 2, circY + 2, radius, LEFT_TOP); + System.arraycopy(ltt, 0, points, index, ltt.length); + gc.drawPolyline(ltt); + + rt = drawCircle(circX + width - (radius * 2) - 3, circY + 2, radius, + RIGHT_TOP); + System.arraycopy(rt, 0, points, index, rt.length); + gc.drawPolyline(rt); + + int rtLength = rt.length; + gc.drawLine(rt[rtLength - 2], rt[rtLength - 1], ltt[0], ltt[1]); + + Color borderBlue = new Color(gc.getDevice(), 190, 216, 237); + gc.setForeground(borderBlue); + gc.drawPolyline(shape); + borderBlue.dispose(); + } + + void drawTabBody(GC gc, Rectangle bounds, int state) { + int[] points = new int[1024]; + int index = 0; + int radius = CORNER_SIZE / 2; +// int marginWidth = parent.marginWidth; +// int marginHeight = parent.marginHeight; + int delta = INNER_KEYLINE + OUTER_KEYLINE + 2 * SIDE_DROP_WIDTH + 2 + * marginWidth; + int width = bounds.width - delta; + int height = bounds.height - INNER_KEYLINE - OUTER_KEYLINE - 2 + * marginHeight - BOTTOM_DROP_WIDTH; + + int circX = bounds.x + delta / 2 + radius; + int circY = bounds.y + radius; + + // Body + index = 0; + int[] ltt = drawCircle(circX, circY, radius, LEFT_TOP); + System.arraycopy(ltt, 0, points, index, ltt.length); + index += ltt.length; + + int[] lbb = drawCircle(circX, circY + height - (radius * 2), radius, + LEFT_BOTTOM); + System.arraycopy(lbb, 0, points, index, lbb.length); + index += lbb.length; + + int[] rb = drawCircle(circX + width - (radius * 2), circY + height + - (radius * 2), radius, RIGHT_BOTTOM); + System.arraycopy(rb, 0, points, index, rb.length); + index += rb.length; + + int[] rt = drawCircle(circX + width - (radius * 2), circY, radius, + RIGHT_TOP); + System.arraycopy(rt, 0, points, index, rt.length); + index += rt.length; + points[index++] = circX; + points[index++] = circY - radius; + + int[] tempPoints = new int[index]; + System.arraycopy(points, 0, tempPoints, 0, index); + shape = tempPoints; + gc.fillPolygon(shape); + + // Fill in parent background for non-rectangular shape + Region r = new Region(); + r.add(bounds); + r.subtract(shape); + gc.setBackground(getParent().getBackground()); + Display display = getDisplay(); + Region clipping = new Region(); + gc.getClipping(clipping); + r.intersect(clipping); + gc.setClipping(r); + Rectangle mappedBounds = display + .map(this, getParent(), bounds); + getParent().drawBackground(gc, bounds.x, bounds.y, bounds.width, + bounds.height, mappedBounds.x, mappedBounds.y); + + // Shadow + drawShadow(display, bounds, gc); + + gc.setClipping(clipping); + clipping.dispose(); + r.dispose(); + } + + static int[] drawCircle(int xC, int yC, int r, int circlePart) { + int x = 0, y = r, u = 1, v = 2 * r - 1, e = 0; + int[] points = new int[1024]; + int[] pointsMirror = new int[1024]; + int loop = 0; + int loopMirror = 0; + while (x < y) { + if (circlePart == RIGHT_BOTTOM) { + points[loop++] = xC + x; + points[loop++] = yC + y; + } + if (circlePart == RIGHT_TOP) { + points[loop++] = xC + y; + points[loop++] = yC - x; + } + if (circlePart == LEFT_TOP) { + points[loop++] = xC - x; + points[loop++] = yC - y; + } + if (circlePart == LEFT_BOTTOM) { + points[loop++] = xC - y; + points[loop++] = yC + x; + } + x++; + e += u; + u += 2; + if (v < 2 * e) { + y--; + e -= v; + v -= 2; + } + if (x > y) + break; + if (circlePart == RIGHT_BOTTOM) { + pointsMirror[loopMirror++] = xC + y; + pointsMirror[loopMirror++] = yC + x; + } + if (circlePart == RIGHT_TOP) { + pointsMirror[loopMirror++] = xC + x; + pointsMirror[loopMirror++] = yC - y; + } + if (circlePart == LEFT_TOP) { + pointsMirror[loopMirror++] = xC - y; + pointsMirror[loopMirror++] = yC - x; + } + if (circlePart == LEFT_BOTTOM) { + pointsMirror[loopMirror++] = xC - x; + pointsMirror[loopMirror++] = yC + y; + } + // grow? + if ((loop + 1) > points.length) { + int length = points.length * 2; + int[] newPointTable = new int[length]; + int[] newPointTableMirror = new int[length]; + System.arraycopy(points, 0, newPointTable, 0, points.length); + points = newPointTable; + System.arraycopy(pointsMirror, 0, newPointTableMirror, 0, + pointsMirror.length); + pointsMirror = newPointTableMirror; + } + } + int[] finalArray = new int[loop + loopMirror]; + System.arraycopy(points, 0, finalArray, 0, loop); + for (int i = loopMirror - 1, j = loop; i > 0; i = i - 2, j = j + 2) { + int tempY = pointsMirror[i]; + int tempX = pointsMirror[i - 1]; + finalArray[j] = tempX; + finalArray[j + 1] = tempY; + } + return finalArray; + } + + void drawShadow(final Display display, Rectangle bounds, GC gc) { + if (shadowImage == null) + createShadow(display); + int x = bounds.x; + int y = bounds.y; + int SIZE = shadowImage.getBounds().width / 3; + // top left + gc.drawImage(shadowImage, 0, 0, SIZE, SIZE, 0, 0, SIZE, 20); + int fillHeight = bounds.height - SIZE * 2; + int fillWidth = bounds.width + 5 - SIZE * 2; + + int xFill = 0; + for (int i = SIZE; i < fillHeight; i += SIZE) { + xFill = i; + gc.drawImage(shadowImage, 0, SIZE, SIZE, SIZE, 0, i, SIZE, SIZE); + } + + // Pad the rest of the shadow + gc.drawImage(shadowImage, 0, SIZE, SIZE, fillHeight - xFill, 0, xFill + + SIZE, SIZE, fillHeight - xFill); + + // bl + gc.drawImage(shadowImage, 0, 40, 20, 20, 0, y + bounds.height - SIZE, + 20, 20); + int yFill = 0; + for (int i = SIZE; i <= fillWidth; i += SIZE) { + yFill = i; + gc.drawImage(shadowImage, SIZE, SIZE * 2, SIZE, SIZE, i, y + + bounds.height - SIZE, SIZE, SIZE); + } + // Pad the rest of the shadow + gc.drawImage(shadowImage, SIZE, SIZE * 2, fillWidth - yFill, SIZE, + yFill + SIZE, y + bounds.height - SIZE, fillWidth - yFill, SIZE); + + // br + gc.drawImage(shadowImage, SIZE * 2, SIZE * 2, SIZE, SIZE, x + + bounds.width - SIZE + 5, y + bounds.height - SIZE, SIZE, SIZE); + + // tr + gc.drawImage(shadowImage, SIZE * 2, 0, SIZE, SIZE, x + bounds.width + - SIZE + 5, y, SIZE, SIZE); + + xFill = 0; + for (int i = SIZE; i < fillHeight; i += SIZE) { + xFill = i; + gc.drawImage(shadowImage, SIZE * 2, SIZE, SIZE, SIZE, x + + bounds.width - SIZE + 5, i, SIZE, SIZE); + } + + // Pad the rest of the shadow + gc.drawImage(shadowImage, SIZE * 2, SIZE, SIZE, fillHeight - xFill, x + + bounds.width - SIZE + 5, xFill + SIZE, SIZE, fillHeight + - xFill); + } + + void createShadow(final Display display) { + Object obj = display.getData(E4_SHADOW_IMAGE); + if (obj != null) { + shadowImage = (Image) obj; + } else { + ImageData data = new ImageData(60, 60, 32, new PaletteData( + 0xFF0000, 0xFF00, 0xFF)); + for (int y = 0, index = 0; y < 60; y++) { + for (int x = 0; x < 60; x++) { + data.setPixel(x, y, shadow[index] & 0xFFFFFF); + data.setAlpha(x, y, (shadow[index] >> 24) & 0xFF); + index++; + } + } + shadowImage = new Image(display, data); + display.setData(E4_SHADOW_IMAGE, shadowImage); + display.disposeExec(new Runnable() { + public void run() { + Object obj = display.getData(E4_SHADOW_IMAGE); + if (obj != null) { + Image tmp = (Image) obj; + tmp.dispose(); + display.setData(E4_SHADOW_IMAGE, null); + } + } + }); + } + } +} diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/ComponentLabelProvider.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/ComponentLabelProvider.java new file mode 100644 index 00000000..2030f986 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/ComponentLabelProvider.java @@ -0,0 +1,141 @@ +/******************************************************************************* + * Copyright (c) 2010 BestSolution.at and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation + ******************************************************************************/ +package org.eclipse.e4.tools.emf.ui.internal.common; + +import org.eclipse.e4.ui.model.application.MModelComponent; +import org.eclipse.e4.ui.model.application.MModelComponents; +import org.eclipse.e4.ui.model.application.MPart; +import org.eclipse.e4.ui.model.application.MPartDescriptor; +import org.eclipse.jface.viewers.StyledCellLabelProvider; +import org.eclipse.jface.viewers.StyledString; +import org.eclipse.jface.viewers.ViewerCell; +import org.eclipse.jface.viewers.StyledString.Styler; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.TextStyle; + +public class ComponentLabelProvider extends StyledCellLabelProvider { + private Image modelComponentsImage; + private Image modelComonentImage; + private Image partsImage; + private Image menusImage; + private Image partImage; + private Image partDescriptorImage; + + @Override + public void update(final ViewerCell cell) { + if( cell.getElement() instanceof MModelComponents ) { + cell.setText("Model Components"); + if( modelComponentsImage == null ) { + modelComponentsImage = new Image(cell.getControl().getDisplay(), getClass().getClassLoader().getResourceAsStream("/icons/application_view_icons.png")); + } + cell.setImage(modelComponentsImage); + } else if( cell.getElement() instanceof MModelComponent ) { + MModelComponent m = (MModelComponent) cell.getElement(); + StyledString styledString = new StyledString("Model Component", null); + String decoration = " - " + m.getParentID(); + Styler styler = new Styler() { + + @Override + public void applyStyles(TextStyle textStyle) { + textStyle.foreground = cell.getControl().getDisplay().getSystemColor(SWT.COLOR_GRAY); + } + }; + + styledString.append(decoration, styler); + cell.setText(styledString.getString()); + cell.setStyleRanges(styledString.getStyleRanges()); + if( modelComonentImage == null ) { + modelComonentImage = new Image(cell.getControl().getDisplay(), getClass().getClassLoader().getResourceAsStream("/icons/package_go.png")); + } + cell.setImage(modelComonentImage); + } else if( cell.getElement() instanceof VirtualEntry<?> ) { + String s = cell.getElement().toString(); + cell.setText(s); + if( "Parts".equals(s) ) { + if( partsImage == null ) { + partsImage = new Image(cell.getControl().getDisplay(), getClass().getClassLoader().getResourceAsStream("/icons/application_double.png")); + } + cell.setImage(partsImage); + } else if( "Menus".equals(s) ) { + if( menusImage == null ) { + menusImage = new Image(cell.getControl().getDisplay(), getClass().getClassLoader().getResourceAsStream("/icons/cog.png")); + } + cell.setImage(menusImage); + } + } else if( cell.getElement() instanceof MPart ) { + MPart part = (MPart) cell.getElement(); + String label; + if( cell.getElement() instanceof MPartDescriptor ) { + label = "Part Descriptor"; + if( partDescriptorImage == null ) { + partDescriptorImage = new Image(cell.getControl().getDisplay(), getClass().getClassLoader().getResourceAsStream("/icons/application_form_edit.png")); + } + cell.setImage(partImage); + } else { + label = "Part"; + if( partImage == null ) { + partImage = new Image(cell.getControl().getDisplay(), getClass().getClassLoader().getResourceAsStream("/icons/application_form.png")); + } + cell.setImage(partImage); + } + StyledString styledString = new StyledString(label, null); + String decoration = " - " + part.getLabel(); + Styler styler = new Styler() { + + @Override + public void applyStyles(TextStyle textStyle) { + textStyle.foreground = cell.getControl().getDisplay().getSystemColor(SWT.COLOR_GRAY); + } + }; + + styledString.append(decoration, styler); + cell.setText(styledString.getString()); + cell.setStyleRanges(styledString.getStyleRanges()); + } else { + cell.setText(cell.getElement()+""); + } + } + + @Override + public void dispose() { + if( modelComponentsImage != null ) { + modelComponentsImage.dispose(); + modelComponentsImage = null; + } + + if( modelComonentImage != null ) { + modelComonentImage.dispose(); + modelComonentImage = null; + } + + if( partsImage != null ) { + partsImage.dispose(); + partsImage = null; + } + + if( menusImage != null ) { + menusImage.dispose(); + menusImage = null; + } + + if( partImage != null ) { + partImage.dispose(); + partImage = null; + } + + if( partDescriptorImage != null ) { + partDescriptorImage.dispose(); + partDescriptorImage = null; + } + super.dispose(); + } +} diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/ModelEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/ModelEditor.java new file mode 100644 index 00000000..dee48397 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/ModelEditor.java @@ -0,0 +1,233 @@ +/******************************************************************************* + * Copyright (c) 2010 BestSolution.at and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation + ******************************************************************************/ +package org.eclipse.e4.tools.emf.ui.internal.common; + +import java.util.HashMap; +import java.util.Map; + +import javax.inject.Inject; + +import org.eclipse.core.databinding.observable.IObservable; +import org.eclipse.core.databinding.observable.list.IObservableList; +import org.eclipse.core.databinding.observable.list.WritableList; +import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory; +import org.eclipse.core.databinding.property.list.IListProperty; +import org.eclipse.e4.tools.emf.ui.common.IModelResource; +import org.eclipse.e4.tools.emf.ui.common.component.AbstractComponentEditor; +import org.eclipse.e4.tools.emf.ui.internal.ShadowComposite; +import org.eclipse.e4.tools.emf.ui.internal.common.component.ApplicationEditor; +import org.eclipse.e4.tools.emf.ui.internal.common.component.ModelComponentEditor; +import org.eclipse.e4.tools.emf.ui.internal.common.component.ModelComponentsEditor; +import org.eclipse.e4.tools.emf.ui.internal.common.component.PartDescriptorEditor; +import org.eclipse.e4.tools.emf.ui.internal.common.component.PartEditor; +import org.eclipse.e4.ui.model.application.MApplicationPackage; +import org.eclipse.e4.ui.model.application.MModelComponent; +import org.eclipse.e4.ui.model.application.MModelComponents; +import org.eclipse.e4.ui.model.application.MPart; +import org.eclipse.emf.databinding.EMFProperties; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.jface.databinding.viewers.ObservableListTreeContentProvider; +import org.eclipse.jface.databinding.viewers.TreeStructureAdvisor; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.SashForm; +import org.eclipse.swt.custom.StackLayout; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + +public class ModelEditor { + private static final int VIRTUAL_MENU = 1; + private static final int VIRTUAL_PART = 2; + private static final int VIRTUAL_HANDLER = 3; + private static final int VIRTUAL_BINDING = 4; + + private Map<EClass, AbstractComponentEditor> editorMap = new HashMap<EClass, AbstractComponentEditor>(); +// private List<AbstractComponentEditor> editors = new ArrayList<AbstractComponentEditor>(); + + private TreeViewer viewer; + private IModelResource modelProvider; + + @Inject + public ModelEditor(Composite composite, IModelResource modelProvider) { + this.modelProvider = modelProvider; + registerDefaultEditors(); + SashForm form = new SashForm(composite, SWT.HORIZONTAL); + form.setBackground(form.getDisplay().getSystemColor(SWT.COLOR_WHITE)); + + viewer = createTreeViewerArea(form); + + Composite parent = new Composite(form,SWT.NONE); + parent.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE)); + FillLayout l = new FillLayout(); + l.marginWidth=5; + parent.setLayout(l); + + ShadowComposite editingArea = new ShadowComposite(parent,SWT.NONE); + GridLayout gl = new GridLayout(); + gl.marginTop=0; + gl.marginHeight=0; + editingArea.setLayout(gl); + editingArea.setBackgroundMode(SWT.INHERIT_DEFAULT); + editingArea.setData("org.eclipse.e4.ui.css.CssClassName","contentContainer"); + + Composite headerContainer = new Composite(editingArea,SWT.NONE); + headerContainer.setBackgroundMode(SWT.INHERIT_DEFAULT); + headerContainer.setData("org.eclipse.e4.ui.css.CssClassName", "headerSectionContainer"); + headerContainer.setLayout(new GridLayout(2, false)); + headerContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + final Label iconLabel = new Label(headerContainer,SWT.NONE); + iconLabel.setLayoutData(new GridData(20, 20)); + + final Label textLabel = new Label(headerContainer, SWT.NONE); + textLabel.setData("org.eclipse.e4.ui.css.CssClassName", "sectionHeader"); + textLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + final Composite contentContainer = new Composite(editingArea,SWT.NONE); + contentContainer.setLayoutData(new GridData(GridData.FILL_BOTH)); + final StackLayout layout = new StackLayout(); + contentContainer.setLayout(layout); + + viewer.addSelectionChangedListener(new ISelectionChangedListener() { + + public void selectionChanged(SelectionChangedEvent event) { + if( ! event.getSelection().isEmpty() ) { + IStructuredSelection s = (IStructuredSelection) event.getSelection(); + if( s.getFirstElement() instanceof EObject ) { + EObject obj = (EObject) s.getFirstElement(); + AbstractComponentEditor editor = editorMap.get(obj.eClass()); + if( editor != null ) { + textLabel.setText(editor.getLabel()); + iconLabel.setImage(editor.getImage(iconLabel.getDisplay())); + Composite comp = editor.getEditor(contentContainer, s.getFirstElement()); + comp.setBackgroundMode(SWT.INHERIT_DEFAULT); + layout.topControl = comp; + contentContainer.layout(true); + } + } + } + } + }); + + form.setWeights(new int[] { 1 , 2 }); + } + + private TreeViewer createTreeViewerArea(Composite parent) { + parent = new Composite(parent,SWT.NONE); + parent.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE)); + FillLayout l = new FillLayout(); + l.marginWidth=5; + parent.setLayout(l); + ShadowComposite editingArea = new ShadowComposite(parent,SWT.NONE); + editingArea.setLayout(new FillLayout()); + TreeViewer viewer = new TreeViewer(editingArea); + viewer.setLabelProvider(new ComponentLabelProvider()); + ObservableListTreeContentProvider contentProvider = new ObservableListTreeContentProvider( + new ObservableFactoryImpl(), new TreeStructureAdvisorImpl()); + viewer.setContentProvider(contentProvider); + viewer.setInput(modelProvider.getRoot()); + + return viewer; + } + + private void registerDefaultEditors() { + registerEditor( MApplicationPackage.Literals.APPLICATION, new ApplicationEditor()); + registerEditor( MApplicationPackage.Literals.MODEL_COMPONENTS, new ModelComponentsEditor()); + registerEditor( MApplicationPackage.Literals.MODEL_COMPONENT, new ModelComponentEditor()); + registerEditor( MApplicationPackage.Literals.PART, new PartEditor()); + registerEditor( MApplicationPackage.Literals.PART_DESCRIPTOR, new PartDescriptorEditor()); + } + + public void registerEditor(EClass eClass, AbstractComponentEditor editor) { + editorMap.put(eClass, editor); + } + + private static class TreeStructureAdvisorImpl extends TreeStructureAdvisor { + + } + + private static class ObservableFactoryImpl implements IObservableFactory { + private IListProperty MODEL_COMPONENTS__COMPONENTS = EMFProperties.list(MApplicationPackage.Literals.MODEL_COMPONENTS__COMPONENTS); + private IListProperty MODEL_COMPONENT__CHILDREN = EMFProperties.list(MApplicationPackage.Literals.MODEL_COMPONENT__CHILDREN); + private IListProperty PART__MENUS = EMFProperties.list(MApplicationPackage.Literals.PART__MENUS); + private IListProperty HANDLER_CONTAINER__HANDLERS = EMFProperties.list(MApplicationPackage.Literals.HANDLER_CONTAINER__HANDLERS); + private IListProperty BINDING_CONTAINER__BINDINGS = EMFProperties.list(MApplicationPackage.Literals.BINDING_CONTAINER__BINDINGS); + + public IObservable createObservable(Object target) { + if( target instanceof IObservableList ) { + return (IObservable) target; + } else if( target instanceof MModelComponents ) { + return MODEL_COMPONENTS__COMPONENTS.observe(target); + } else if( target instanceof MModelComponent ) { + WritableList list = new WritableList(); + list.add(new VirtualEntry<Object>( VIRTUAL_MENU, MODEL_COMPONENT__CHILDREN, target, "Menus") { + + @Override + protected boolean accepted(Object o) { + return false; + } + + }); + list.add(new VirtualEntry<Object>( VIRTUAL_PART, MODEL_COMPONENT__CHILDREN, target, "Parts") { + + @Override + protected boolean accepted(Object o) { + return o instanceof MPart; + } + + }); + return list; + } else if( target instanceof VirtualEntry<?> ) { + return ((VirtualEntry<?>)target).getList(); + } else if( target instanceof MPart ) { + WritableList list = new WritableList(); + list.add(new VirtualEntry<Object>( VIRTUAL_MENU, PART__MENUS, target, "Menus") { + + @Override + protected boolean accepted(Object o) { + return true; + } + + }); + + list.add(new VirtualEntry<Object>( VIRTUAL_HANDLER, HANDLER_CONTAINER__HANDLERS, target, "Handlers") { + + @Override + protected boolean accepted(Object o) { + return true; + } + + }); + + list.add(new VirtualEntry<Object>( VIRTUAL_BINDING, BINDING_CONTAINER__BINDINGS, target, "Bindings") { + + @Override + protected boolean accepted(Object o) { + return true; + } + + }); + + return list; + } + + // TODO Auto-generated method stub + return null; + } + } +}
\ No newline at end of file diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/VirtualEntry.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/VirtualEntry.java new file mode 100644 index 00000000..a045a765 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/VirtualEntry.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2010 BestSolution.at and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation + ******************************************************************************/ +package org.eclipse.e4.tools.emf.ui.internal.common; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.databinding.observable.Diffs; +import org.eclipse.core.databinding.observable.list.IListChangeListener; +import org.eclipse.core.databinding.observable.list.IObservableList; +import org.eclipse.core.databinding.observable.list.ListChangeEvent; +import org.eclipse.core.databinding.observable.list.ListDiff; +import org.eclipse.core.databinding.observable.list.WritableList; +import org.eclipse.core.databinding.property.list.IListProperty; + +public abstract class VirtualEntry<M> { + private int id; + private Object originalParent; + private String label; + private IObservableList list; + + public VirtualEntry(int id, IListProperty property, Object originalParent, String label) { + this.id = id; + this.originalParent = originalParent; + this.label = label; + this.list = new WritableList(); + IObservableList origList = property.observe(originalParent); + list.addAll(cleanedList(origList)); + + origList.addListChangeListener(new IListChangeListener() { + + public void handleListChange(ListChangeEvent event) { + List<Object> clean = cleanedList(event.getObservableList()); + ListDiff diff = Diffs.computeListDiff(VirtualEntry.this.list, clean); + diff.applyTo(VirtualEntry.this.list); + } + }); + } + + private List<Object> cleanedList(IObservableList list) { + List<Object> l = new ArrayList<Object>(list.size()); + + for( Object o : list ) { + if( accepted((M) o) ) { + l.add(o); + } + } + + return l; + } + + protected abstract boolean accepted(M o); + + public IObservableList getList() { + return list; + } + + public Object getOriginalParent() { + return originalParent; + } + + public int getId() { + return id; + } + + @Override + public String toString() { + return label; + } +} diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ApplicationEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ApplicationEditor.java new file mode 100644 index 00000000..0e59ccdf --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ApplicationEditor.java @@ -0,0 +1,53 @@ +package org.eclipse.e4.tools.emf.ui.internal.common.component; + +import org.eclipse.core.databinding.DataBindingContext; +import org.eclipse.core.databinding.observable.value.IObservableValue; +import org.eclipse.core.databinding.observable.value.WritableValue; +import org.eclipse.e4.tools.emf.ui.common.component.AbstractComponentEditor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; + +public class ApplicationEditor extends AbstractComponentEditor { + private Composite composite; + private WritableValue master = new WritableValue(); + private Image image; + private DataBindingContext context; + + @Override + public Image getImage(Display display) { + if( image == null ) { + image = new Image(display, getClass().getClassLoader().getResourceAsStream("/icons/application.png")); + } + + return image; + } + + @Override + public String getLabel() { + return "Application"; + } + + @Override + public String getDescription() { + return "Application bla, bla, bla"; + } + + @Override + public Composite getEditor(Composite parent, Object object) { + if( composite == null ) { + context = new DataBindingContext(); + composite = createForm(parent,context, master); + } + master.setValue(object); + return composite; + } + + protected Composite createForm(Composite parent, DataBindingContext context, IObservableValue master) { + parent = new Composite(parent,SWT.NONE); + + return parent; + } + +} diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ModelComponentEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ModelComponentEditor.java new file mode 100644 index 00000000..0b7fe77d --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ModelComponentEditor.java @@ -0,0 +1,151 @@ +/******************************************************************************* + * Copyright (c) 2010 BestSolution.at and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation + ******************************************************************************/ +package org.eclipse.e4.tools.emf.ui.internal.common.component; + +import org.eclipse.core.databinding.DataBindingContext; +import org.eclipse.core.databinding.observable.value.WritableValue; +import org.eclipse.core.databinding.property.value.IValueProperty; +import org.eclipse.e4.tools.emf.ui.common.component.AbstractComponentEditor; +import org.eclipse.e4.ui.model.application.MApplicationPackage; +import org.eclipse.emf.databinding.EMFProperties; +import org.eclipse.jface.databinding.swt.WidgetProperties; +import org.eclipse.jface.viewers.ListViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +public class ModelComponentEditor extends AbstractComponentEditor { + private Composite composite; + private WritableValue master = new WritableValue(); + private Image image; + private DataBindingContext context; + + @Override + public Composite getEditor(Composite parent, Object object) { + if( composite == null ) { + context = new DataBindingContext(); + composite = createForm(parent); + } + master.setValue(object); + return composite; + } + + public void dispose() { + if( image != null ) { + image.dispose(); + image = null; + } + + if( composite != null ) { + composite.dispose(); + composite = null; + } + + if( context != null ) { + context.dispose(); + context = null; + } + } + + private Composite createForm(Composite parent) { + parent = new Composite(parent,SWT.NONE); + parent.setLayout(new GridLayout(3, false)); + + IValueProperty textProp = WidgetProperties.text(); + + Label l = new Label(parent, SWT.NONE); + l.setText("Id"); + + Text t = new Text(parent, SWT.BORDER); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + t.setLayoutData(gd); + context.bindValue(textProp.observe(t), EMFProperties.value(MApplicationPackage.Literals.APPLICATION_ELEMENT__ID).observeDetail(master)); + + // ------------------------------------------------------------ + + l = new Label(parent, SWT.NONE); + l.setText("Tags"); + + t = new Text(parent, SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + t.setLayoutData(gd); + + l = new Label(parent, SWT.NONE); + ListViewer viewer = new ListViewer(parent); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + gd.heightHint = 130; + viewer.getList().setLayoutData(gd); + + + // ------------------------------------------------------------ + + l = new Label(parent, SWT.NONE); + l.setText("Parent-Id"); + + t = new Text(parent, SWT.BORDER); + t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + context.bindValue(textProp.observe(t), EMFProperties.value(MApplicationPackage.Literals.MODEL_COMPONENT__PARENT_ID).observeDetail(master)); + + Button b = new Button(parent, SWT.PUSH|SWT.FLAT); + b.setText("Find ..."); + + // ------------------------------------------------------------ + + l = new Label(parent, SWT.NONE); + l.setText("Position in Parent"); + + t = new Text(parent, SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + t.setLayoutData(gd); + context.bindValue(textProp.observe(t), EMFProperties.value(MApplicationPackage.Literals.MODEL_COMPONENT__POSITION_IN_PARENT).observeDetail(master)); + + // ------------------------------------------------------------ + + l = new Label(parent, SWT.NONE); + l.setText("Processor"); + + t = new Text(parent, SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + t.setLayoutData(gd); + context.bindValue(textProp.observe(t), EMFProperties.value(MApplicationPackage.Literals.MODEL_COMPONENT__PROCESSOR).observeDetail(master)); + + return parent; + } + + @Override + public Image getImage(Display display) { + if( image == null ) { + image = new Image(display, getClass().getClassLoader().getResourceAsStream("/icons/package_go.png")); + } + return image; + } + + @Override + public String getLabel() { + return "Model Component"; + } + + @Override + public String getDescription() { + return "The model component ... bla bla bla"; + } +} diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ModelComponentsEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ModelComponentsEditor.java new file mode 100644 index 00000000..3e036d74 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ModelComponentsEditor.java @@ -0,0 +1,51 @@ +package org.eclipse.e4.tools.emf.ui.internal.common.component; + +import org.eclipse.core.databinding.DataBindingContext; +import org.eclipse.core.databinding.observable.value.WritableValue; +import org.eclipse.e4.tools.emf.ui.common.component.AbstractComponentEditor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; + +public class ModelComponentsEditor extends AbstractComponentEditor { + private Composite composite; + private WritableValue master = new WritableValue(); + private Image image; + private DataBindingContext context; + + @Override + public Image getImage(Display display) { + if( image == null ) { + image = new Image(display, getClass().getClassLoader().getResourceAsStream("/icons/application_view_icons.png")); + } + return image; + } + + @Override + public String getLabel() { + return "Model Components"; + } + + @Override + public String getDescription() { + return "Some bla bla bla bla"; + } + + @Override + public Composite getEditor(Composite parent, Object object) { + if( composite == null ) { + context = new DataBindingContext(); + composite = createForm(parent); + } + master.setValue(object); + return composite; + } + + private Composite createForm(Composite parent) { + parent = new Composite(parent, SWT.NONE); + + return parent; + } + +} diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/PartDescriptorEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/PartDescriptorEditor.java new file mode 100644 index 00000000..a4c5748a --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/PartDescriptorEditor.java @@ -0,0 +1,37 @@ +package org.eclipse.e4.tools.emf.ui.internal.common.component; + +import org.eclipse.core.databinding.DataBindingContext; +import org.eclipse.core.databinding.observable.value.IObservableValue; +import org.eclipse.core.databinding.property.value.IValueProperty; +import org.eclipse.e4.ui.model.application.MApplicationPackage; +import org.eclipse.emf.databinding.EMFProperties; +import org.eclipse.jface.databinding.swt.WidgetProperties; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +public class PartDescriptorEditor extends PartEditor { + + @Override + protected Composite createForm(Composite parent, DataBindingContext context, IObservableValue master) { + Composite comp = super.createForm(parent,context,master); + + IValueProperty textProp = WidgetProperties.text(); + + Label l = new Label(parent, SWT.NONE); + l.setText("Label"); + + Text t = new Text(parent, SWT.BORDER); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + t.setLayoutData(gd); + context.bindValue(textProp.observe(t), EMFProperties.value(MApplicationPackage.Literals.UI_LABEL__LABEL).observeDetail(master)); + + // ------------------------------------------------------------ + + + return comp; + } +} diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/PartEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/PartEditor.java new file mode 100644 index 00000000..1dc0ae91 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/PartEditor.java @@ -0,0 +1,206 @@ +package org.eclipse.e4.tools.emf.ui.internal.common.component; + +import org.eclipse.core.databinding.DataBindingContext; +import org.eclipse.core.databinding.observable.value.IObservableValue; +import org.eclipse.core.databinding.observable.value.WritableValue; +import org.eclipse.core.databinding.property.value.IValueProperty; +import org.eclipse.e4.tools.emf.ui.common.component.AbstractComponentEditor; +import org.eclipse.e4.ui.model.application.MApplicationPackage; +import org.eclipse.emf.databinding.EMFProperties; +import org.eclipse.jface.databinding.swt.WidgetProperties; +import org.eclipse.jface.viewers.ListViewer; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +public class PartEditor extends AbstractComponentEditor { + private Composite composite; + private WritableValue master = new WritableValue(); + private Image image; + private DataBindingContext context; + + @Override + public Image getImage(Display display) { + if( image == null ) { + image = new Image(display, getClass().getClassLoader().getResourceAsStream("/icons/application_form.png")); + } + + return image; + } + + @Override + public String getLabel() { + return "Part Descriptor"; + } + + @Override + public String getDescription() { + return "Part Descriptor Bla Bla Bla Bla"; + } + + @Override + public Composite getEditor(Composite parent, Object object) { + if( composite == null ) { + context = new DataBindingContext(); + composite = createForm(parent,context, master); + } + master.setValue(object); + return composite; + } + + protected Composite createForm(Composite parent, DataBindingContext context, IObservableValue master) { + parent = new Composite(parent,SWT.NONE); + parent.setLayout(new GridLayout(3, false)); + + IValueProperty textProp = WidgetProperties.text(); + + Label l = new Label(parent, SWT.NONE); + l.setText("Id"); + + Text t = new Text(parent, SWT.BORDER); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + t.setLayoutData(gd); + context.bindValue(textProp.observe(t), EMFProperties.value(MApplicationPackage.Literals.APPLICATION_ELEMENT__ID).observeDetail(master)); + + // ------------------------------------------------------------ + + l = new Label(parent, SWT.NONE); + l.setText("Tags"); + + t = new Text(parent, SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + t.setLayoutData(gd); + + l = new Label(parent, SWT.NONE); + ListViewer viewer = new ListViewer(parent); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + gd.heightHint = 80; + viewer.getList().setLayoutData(gd); + + // ------------------------------------------------------------ + + l = new Label(parent, SWT.NONE); + l.setText("Label"); + + t = new Text(parent, SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + t.setLayoutData(gd); + context.bindValue(textProp.observe(t), EMFProperties.value(MApplicationPackage.Literals.UI_LABEL__LABEL).observeDetail(master)); + + // ------------------------------------------------------------ + + l = new Label(parent, SWT.NONE); + l.setText("Tooltip"); + + t = new Text(parent, SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + t.setLayoutData(gd); + context.bindValue(textProp.observe(t), EMFProperties.value(MApplicationPackage.Literals.UI_LABEL__TOOLTIP).observeDetail(master)); + + // ------------------------------------------------------------ + + l = new Label(parent, SWT.NONE); + l.setText("Icon URI"); + + t = new Text(parent, SWT.BORDER); + t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + context.bindValue(textProp.observe(t), EMFProperties.value(MApplicationPackage.Literals.UI_LABEL__ICON_URI).observeDetail(master)); + + Button b = new Button(parent, SWT.PUSH|SWT.FLAT); + b.setText("Find ..."); + + // ------------------------------------------------------------ + + l = new Label(parent, SWT.NONE); + l.setText("Class URI"); + + t = new Text(parent, SWT.BORDER); + t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + context.bindValue(textProp.observe(t), EMFProperties.value(MApplicationPackage.Literals.CONTRIBUTION__URI).observeDetail(master)); + + b = new Button(parent, SWT.PUSH|SWT.FLAT); + b.setText("Find ..."); + + // ------------------------------------------------------------ + + l = new Label(parent, SWT.NONE); + l.setText("Variables"); + + t = new Text(parent, SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + t.setLayoutData(gd); + + l = new Label(parent, SWT.NONE); + viewer = new ListViewer(parent); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + gd.heightHint = 80; + viewer.getList().setLayoutData(gd); + + // ------------------------------------------------------------ + + l = new Label(parent, SWT.NONE); + l.setText("Properties"); + + t = new Text(parent, SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + t.setLayoutData(gd); + + l = new Label(parent, SWT.NONE); + TableViewer tableviewer = new TableViewer(parent); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + gd.heightHint = 80; + tableviewer.getTable().setHeaderVisible(true); + tableviewer.getControl().setLayoutData(gd); + + TableViewerColumn column = new TableViewerColumn(tableviewer, SWT.NONE); + column.getColumn().setText("Key"); + column.getColumn().setWidth(200); + + column = new TableViewerColumn(tableviewer, SWT.NONE); + column.getColumn().setText("Value"); + column.getColumn().setWidth(200); + + // ------------------------------------------------------------ + + l = new Label(parent, SWT.NONE); + l.setText(""); + + Composite booleanContainer = new Composite(parent,SWT.NONE); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan=2; + booleanContainer.setBackgroundMode(SWT.INHERIT_DEFAULT); + booleanContainer.setLayoutData(gd); + booleanContainer.setLayout(new GridLayout(4,false)); + + Button checkbox = new Button(booleanContainer, SWT.CHECK); + checkbox.setText("to render"); + + checkbox = new Button(booleanContainer, SWT.CHECK); + checkbox.setText("on Top"); + + checkbox = new Button(booleanContainer, SWT.CHECK); + checkbox.setText("visible"); + + checkbox = new Button(booleanContainer, SWT.CHECK); + checkbox.setText("closeable"); + + return parent; + } +} diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/wbe/ExtensionModelEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/wbe/ExtensionModelEditor.java new file mode 100644 index 00000000..34636af5 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/wbe/ExtensionModelEditor.java @@ -0,0 +1,5 @@ +package org.eclipse.e4.tools.emf.ui.internal.wbe; + +public class ExtensionModelEditor { + +} diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/wbm/ApplicationModelEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/wbm/ApplicationModelEditor.java new file mode 100644 index 00000000..d140e5bd --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/wbm/ApplicationModelEditor.java @@ -0,0 +1,16 @@ +package org.eclipse.e4.tools.emf.ui.internal.wbm; + +import javax.inject.Inject; + +import org.eclipse.e4.tools.emf.ui.common.IModelResource; +import org.eclipse.e4.tools.emf.ui.internal.common.ModelEditor; +import org.eclipse.swt.widgets.Composite; + +public class ApplicationModelEditor extends ModelEditor { + @Inject + public ApplicationModelEditor(Composite composite, + IModelResource modelProvider) { + super(composite, modelProvider); + } + +} |