Commit f799c630 authored by Depasse Arthur's avatar Depasse Arthur

Modif de la génération asn1

parent 11fc3b10
......@@ -59,3 +59,4 @@ _UI_StringToStringMap_key_feature = Key
_UI_StringToStringMap_value_feature = Value
_UI_Message_name_feature = Name
_UI_FSM_dataTypes_feature = Data Types
_UI_Message_enumsDef_feature = Enums Def
......@@ -2,6 +2,7 @@
*/
package fr.supelec.plong9.fsm.provider;
import fr.supelec.plong9.fsm.FsmFactory;
import fr.supelec.plong9.fsm.FsmPackage;
import fr.supelec.plong9.fsm.Message;
......@@ -12,6 +13,7 @@ import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.ResourceLocator;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
......@@ -103,6 +105,36 @@ public class MessageItemProvider extends ItemProviderAdapter implements IEditing
ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
}
/**
* This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
* {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
* {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
if (childrenFeatures == null) {
super.getChildrenFeatures(object);
childrenFeatures.add(FsmPackage.Literals.MESSAGE__ENUMS_DEF);
}
return childrenFeatures;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected EStructuralFeature getChildFeature(Object object, Object child) {
// Check the type of the specified child object and return the proper feature to use for
// adding (see {@link AddCommand}) it as a child.
return super.getChildFeature(object, child);
}
/**
* This returns Message.gif.
* <!-- begin-user-doc -->
......@@ -154,6 +186,9 @@ public class MessageItemProvider extends ItemProviderAdapter implements IEditing
case FsmPackage.MESSAGE__NAME:
fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
return;
case FsmPackage.MESSAGE__ENUMS_DEF:
fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
return;
}
super.notifyChanged(notification);
}
......@@ -168,6 +203,9 @@ public class MessageItemProvider extends ItemProviderAdapter implements IEditing
@Override
protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
super.collectNewChildDescriptors(newChildDescriptors, object);
newChildDescriptors.add(createChildParameter(FsmPackage.Literals.MESSAGE__ENUMS_DEF,
FsmFactory.eINSTANCE.create(FsmPackage.Literals.STRING_TO_STRING_MAP)));
}
/**
......
......@@ -472,6 +472,22 @@
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_OtM08HWjEemLj80b9HKNdQ" id="(0.7288135593220338,1.0)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_OtM08XWjEemLj80b9HKNdQ" id="(0.0,0.8163265306122449)"/>
</edges>
<edges xmi:type="notation:Edge" xmi:id="_tewHgHWsEemLj80b9HKNdQ" type="4001" element="_tefo0HWsEemLj80b9HKNdQ" source="_QjJLQHWVEemSG6CGjg3iew" target="_Q46fkHWYEemSG6CGjg3iew">
<children xmi:type="notation:Node" xmi:id="_tewHhHWsEemLj80b9HKNdQ" type="6001">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_tewHhXWsEemLj80b9HKNdQ" x="18" y="-12"/>
</children>
<children xmi:type="notation:Node" xmi:id="_tewHhnWsEemLj80b9HKNdQ" type="6002">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_tewHh3WsEemLj80b9HKNdQ" y="10"/>
</children>
<children xmi:type="notation:Node" xmi:id="_tewukHWsEemLj80b9HKNdQ" type="6003">
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_tewukXWsEemLj80b9HKNdQ" y="10"/>
</children>
<styles xmi:type="notation:ConnectorStyle" xmi:id="_tewHgXWsEemLj80b9HKNdQ" routing="Rectilinear"/>
<styles xmi:type="notation:FontStyle" xmi:id="_tewHgnWsEemLj80b9HKNdQ" fontColor="7490599" fontName=".AppleSystemUIFont" fontHeight="8"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_tewHg3WsEemLj80b9HKNdQ" points="[0, 0, 0, -298]$[0, 298, 0, 0]"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_tewuknWsEemLj80b9HKNdQ" id="(0.9745762711864406,1.0)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_tewuk3WsEemLj80b9HKNdQ" id="(0.7711864406779662,0.0)"/>
</edges>
</data>
</ownedAnnotationEntries>
<ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_o0qEMC8REemUD62u2ND_rQ" name="FSM" tooltipText="" outgoingEdges="_Ll21EF-gEemRWcGjpF2T8A _Ll5RUF-gEemRWcGjpF2T8A _Ll6fcF-gEemRWcGjpF2T8A _LmDpYF-gEemRWcGjpF2T8A _36f_EGXREemlk9JwcFvGuA _EAE1EGtJEemJMoCNZztO6w _Hm05UGtJEemJMoCNZztO6w _TJPDwHWVEemSG6CGjg3iew _OsiGkHWjEemLj80b9HKNdQ" width="12" height="10">
......@@ -778,7 +794,7 @@
</ownedStyle>
<actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
</ownedDiagramElements>
<ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_Qio08HWVEemSG6CGjg3iew" name="Message" tooltipText="" outgoingEdges="_txebwHWXEemSG6CGjg3iew _p1RPcHWYEemSG6CGjg3iew" incomingEdges="_TJPDwHWVEemSG6CGjg3iew _OGyysHWXEemSG6CGjg3iew" width="12" height="10">
<ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_Qio08HWVEemSG6CGjg3iew" name="Message" tooltipText="" outgoingEdges="_txebwHWXEemSG6CGjg3iew _p1RPcHWYEemSG6CGjg3iew _tefo0HWsEemLj80b9HKNdQ" incomingEdges="_TJPDwHWVEemSG6CGjg3iew _OGyysHWXEemSG6CGjg3iew" width="12" height="10">
<target xmi:type="ecore:EClass" href="fsm.ecore#//Message"/>
<semanticElements xmi:type="ecore:EClass" href="fsm.ecore#//Message"/>
<arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
......@@ -835,7 +851,7 @@
</ownedStyle>
<actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
</ownedDiagramElements>
<ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_Q4x8sHWYEemSG6CGjg3iew" name="StringToStringMap" tooltipText="" incomingEdges="_p1RPcHWYEemSG6CGjg3iew _OsiGkHWjEemLj80b9HKNdQ" width="12" height="10">
<ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_Q4x8sHWYEemSG6CGjg3iew" name="StringToStringMap" tooltipText="" incomingEdges="_p1RPcHWYEemSG6CGjg3iew _OsiGkHWjEemLj80b9HKNdQ _tefo0HWsEemLj80b9HKNdQ" width="12" height="10">
<target xmi:type="ecore:EClass" href="fsm.ecore#//StringToStringMap"/>
<semanticElements xmi:type="ecore:EClass" href="fsm.ecore#//StringToStringMap"/>
<ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_cmb2oHWYEemSG6CGjg3iew" borderSize="1" borderSizeComputationExpression="1" backgroundStyle="Liquid" foregroundColor="255,252,216">
......@@ -885,6 +901,19 @@
</ownedStyle>
<actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
</ownedDiagramElements>
<ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_tefo0HWsEemLj80b9HKNdQ" name="[0..*] enumsDef" sourceNode="_Qio08HWVEemSG6CGjg3iew" targetNode="_Q4x8sHWYEemSG6CGjg3iew">
<target xmi:type="ecore:EReference" href="fsm.ecore#//Message/enumsDef"/>
<semanticElements xmi:type="ecore:EReference" href="fsm.ecore#//Message/enumsDef"/>
<ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_teg28HWsEemLj80b9HKNdQ" description="_36gmIGXREemlk9JwcFvGuA" sourceArrow="FillDiamond" routingStyle="manhattan" strokeColor="0,0,0">
<centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_teg28XWsEemLj80b9HKNdQ" showIcon="false">
<customFeatures>labelSize</customFeatures>
</centerLabelStyle>
<endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_teg28nWsEemLj80b9HKNdQ" showIcon="false" labelColor="39,76,114">
<customFeatures>labelSize</customFeatures>
</endLabelStyle>
</ownedStyle>
<actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
</ownedDiagramElements>
<description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
<filterVariableHistory xmi:type="diagram:FilterVariableHistory" xmi:id="_jGVPci8REemUD62u2ND_rQ"/>
<activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/>
......
......@@ -63,6 +63,8 @@
<eStructuralFeatures xsi:type="ecore:EReference" name="data" upperBound="-1" eType="#//StringToStringMap"
containment="true"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="enumsDef" upperBound="-1"
eType="#//StringToStringMap" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="StringToStringMap" instanceClassName="java.util.Map$Entry">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="key" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
......
......@@ -54,6 +54,7 @@
<genFeatures createChild="false" ecoreFeature="ecore:EReference fsm.ecore#//Message/event"/>
<genFeatures createChild="false" ecoreFeature="ecore:EReference fsm.ecore#//Message/data"/>
<genFeatures createChild="false" ecoreFeature="ecore:EAttribute fsm.ecore#//Message/name"/>
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference fsm.ecore#//Message/enumsDef"/>
</genClasses>
<genClasses ecoreClass="fsm.ecore#//StringToStringMap">
<genFeatures createChild="false" ecoreFeature="ecore:EAttribute fsm.ecore#//StringToStringMap/key"/>
......
......@@ -513,6 +513,15 @@ public interface FsmPackage extends EPackage {
*/
int MESSAGE__NAME = 2;
/**
* The feature id for the '<em><b>Enums Def</b></em>' map.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
* @ordered
*/
int MESSAGE__ENUMS_DEF = 3;
/**
* The number of structural features of the '<em>Message</em>' class.
* <!-- begin-user-doc -->
......@@ -520,7 +529,7 @@ public interface FsmPackage extends EPackage {
* @generated
* @ordered
*/
int MESSAGE_FEATURE_COUNT = 3;
int MESSAGE_FEATURE_COUNT = 4;
/**
* The number of operations of the '<em>Message</em>' class.
......@@ -988,6 +997,17 @@ public interface FsmPackage extends EPackage {
*/
EAttribute getMessage_Name();
/**
* Returns the meta object for the map '{@link fr.supelec.plong9.fsm.Message#getEnumsDef <em>Enums Def</em>}'.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @return the meta object for the map '<em>Enums Def</em>'.
* @see fr.supelec.plong9.fsm.Message#getEnumsDef()
* @see #getMessage()
* @generated
*/
EReference getMessage_EnumsDef();
/**
* Returns the meta object for class '{@link java.util.Map.Entry <em>String To String Map</em>}'.
* <!-- begin-user-doc -->
......@@ -1363,6 +1383,14 @@ public interface FsmPackage extends EPackage {
*/
EAttribute MESSAGE__NAME = eINSTANCE.getMessage_Name();
/**
* The meta object literal for the '<em><b>Enums Def</b></em>' map feature.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
EReference MESSAGE__ENUMS_DEF = eINSTANCE.getMessage_EnumsDef();
/**
* The meta object literal for the '{@link fr.supelec.plong9.fsm.impl.StringToStringMapImpl <em>String To String Map</em>}' class.
* <!-- begin-user-doc -->
......
......@@ -18,6 +18,7 @@ import org.eclipse.emf.ecore.EObject;
* <li>{@link fr.supelec.plong9.fsm.Message#getEvent <em>Event</em>}</li>
* <li>{@link fr.supelec.plong9.fsm.Message#getData <em>Data</em>}</li>
* <li>{@link fr.supelec.plong9.fsm.Message#getName <em>Name</em>}</li>
* <li>{@link fr.supelec.plong9.fsm.Message#getEnumsDef <em>Enums Def</em>}</li>
* </ul>
*
* @see fr.supelec.plong9.fsm.FsmPackage#getMessage()
......@@ -94,4 +95,21 @@ public interface Message extends EObject {
*/
void setName(String value);
/**
* Returns the value of the '<em><b>Enums Def</b></em>' map.
* The key is of type {@link java.lang.String},
* and the value is of type {@link java.lang.String},
* <!-- begin-user-doc -->
* <p>
* If the meaning of the '<em>Enums Def</em>' map isn't clear,
* there really should be more of a description here...
* </p>
* <!-- end-user-doc -->
* @return the value of the '<em>Enums Def</em>' map.
* @see fr.supelec.plong9.fsm.FsmPackage#getMessage_EnumsDef()
* @model mapType="fr.supelec.plong9.fsm.StringToStringMap&lt;org.eclipse.emf.ecore.EString, org.eclipse.emf.ecore.EString&gt;"
* @generated
*/
EMap<String, String> getEnumsDef();
} // Message
......@@ -489,6 +489,15 @@ public class FsmPackageImpl extends EPackageImpl implements FsmPackage {
return (EAttribute) messageEClass.getEStructuralFeatures().get(2);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EReference getMessage_EnumsDef() {
return (EReference) messageEClass.getEStructuralFeatures().get(3);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
......@@ -589,6 +598,7 @@ public class FsmPackageImpl extends EPackageImpl implements FsmPackage {
createEReference(messageEClass, MESSAGE__EVENT);
createEReference(messageEClass, MESSAGE__DATA);
createEAttribute(messageEClass, MESSAGE__NAME);
createEReference(messageEClass, MESSAGE__ENUMS_DEF);
stringToStringMapEClass = createEClass(STRING_TO_STRING_MAP);
createEAttribute(stringToStringMapEClass, STRING_TO_STRING_MAP__KEY);
......@@ -727,6 +737,9 @@ public class FsmPackageImpl extends EPackageImpl implements FsmPackage {
IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
initEAttribute(getMessage_Name(), ecorePackage.getEString(), "name", null, 0, 1, Message.class, !IS_TRANSIENT,
!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
initEReference(getMessage_EnumsDef(), this.getStringToStringMap(), null, "enumsDef", null, 0, -1, Message.class,
!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE,
IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
initEClass(stringToStringMapEClass, Map.Entry.class, "StringToStringMap", !IS_ABSTRACT, !IS_INTERFACE,
!IS_GENERATED_INSTANCE_CLASS);
......
......@@ -32,6 +32,7 @@ import org.eclipse.emf.ecore.util.InternalEList;
* <li>{@link fr.supelec.plong9.fsm.impl.MessageImpl#getEvent <em>Event</em>}</li>
* <li>{@link fr.supelec.plong9.fsm.impl.MessageImpl#getData <em>Data</em>}</li>
* <li>{@link fr.supelec.plong9.fsm.impl.MessageImpl#getName <em>Name</em>}</li>
* <li>{@link fr.supelec.plong9.fsm.impl.MessageImpl#getEnumsDef <em>Enums Def</em>}</li>
* </ul>
*
* @generated
......@@ -77,6 +78,16 @@ public class MessageImpl extends MinimalEObjectImpl.Container implements Message
*/
protected String name = NAME_EDEFAULT;
/**
* The cached value of the '{@link #getEnumsDef() <em>Enums Def</em>}' map.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getEnumsDef()
* @generated
* @ordered
*/
protected EMap<String, String> enumsDef;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
......@@ -169,6 +180,19 @@ public class MessageImpl extends MinimalEObjectImpl.Container implements Message
eNotify(new ENotificationImpl(this, Notification.SET, FsmPackage.MESSAGE__NAME, oldName, name));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EMap<String, String> getEnumsDef() {
if (enumsDef == null) {
enumsDef = new EcoreEMap<String, String>(FsmPackage.Literals.STRING_TO_STRING_MAP,
StringToStringMapImpl.class, this, FsmPackage.MESSAGE__ENUMS_DEF);
}
return enumsDef;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
......@@ -179,6 +203,8 @@ public class MessageImpl extends MinimalEObjectImpl.Container implements Message
switch (featureID) {
case FsmPackage.MESSAGE__DATA:
return ((InternalEList<?>) getData()).basicRemove(otherEnd, msgs);
case FsmPackage.MESSAGE__ENUMS_DEF:
return ((InternalEList<?>) getEnumsDef()).basicRemove(otherEnd, msgs);
}
return super.eInverseRemove(otherEnd, featureID, msgs);
}
......@@ -202,6 +228,11 @@ public class MessageImpl extends MinimalEObjectImpl.Container implements Message
return getData().map();
case FsmPackage.MESSAGE__NAME:
return getName();
case FsmPackage.MESSAGE__ENUMS_DEF:
if (coreType)
return getEnumsDef();
else
return getEnumsDef().map();
}
return super.eGet(featureID, resolve, coreType);
}
......@@ -223,6 +254,9 @@ public class MessageImpl extends MinimalEObjectImpl.Container implements Message
case FsmPackage.MESSAGE__NAME:
setName((String) newValue);
return;
case FsmPackage.MESSAGE__ENUMS_DEF:
((EStructuralFeature.Setting) getEnumsDef()).set(newValue);
return;
}
super.eSet(featureID, newValue);
}
......@@ -244,6 +278,9 @@ public class MessageImpl extends MinimalEObjectImpl.Container implements Message
case FsmPackage.MESSAGE__NAME:
setName(NAME_EDEFAULT);
return;
case FsmPackage.MESSAGE__ENUMS_DEF:
getEnumsDef().clear();
return;
}
super.eUnset(featureID);
}
......@@ -262,6 +299,8 @@ public class MessageImpl extends MinimalEObjectImpl.Container implements Message
return data != null && !data.isEmpty();
case FsmPackage.MESSAGE__NAME:
return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
case FsmPackage.MESSAGE__ENUMS_DEF:
return enumsDef != null && !enumsDef.isEmpty();
}
return super.eIsSet(featureID);
}
......
......@@ -8,17 +8,13 @@
[msg.name/] DEFINITIONS IMPLICIT TAGS::=
BEGIN
[for (d : StringToStringMap | msg.data)]
[if (d.value.startsWith('ENUMDEF:'))]
[d.key.toUpper()/] ::= ENUMERATED {[d.value.substring(9)/]}
[/if]
[for (d : StringToStringMap | msg.enumsDef)]
[d.key.toUpper()/] ::= ENUMERATED {[d.value/]}
[/for]
[msg.name/] ::= SEQUENCE {
[for (d : StringToStringMap | msg.data) separator(',')]
[if (not d.value.startsWith('ENUMDEF:'))]
[d.key.toLower()/] [d.value.toUpper()/]
[/if]
[/for]
}
......
......@@ -18,8 +18,8 @@
<ownedActions name="PongAction2"/>
<ownedGuards name="PongGuard"/>
<ownedMessages event="//@ownedEvents.0" name="MessagePing">
<data key="MessageType" value="ENUMDEF:ping,pong"/>
<data key="id" value="INTEGER"/>
<data key="type" value="MessageType"/>
<enumsDef key="MessageType" value="ping, pong"/>
</ownedMessages>
</fsm:FSM>
MessagePing DEFINITIONS IMPLICIT TAGS::=
BEGIN
MESSAGETYPE ::= ENUMERATED {ping,pong}
MESSAGETYPE ::= ENUMERATED {ping, pong}
MessagePing ::= SEQUENCE {
, id INTEGER
id INTEGER
, type MESSAGETYPE
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment