Best Citrus code snippet using com.consol.citrus.channel.ChannelEndpointBuilder.channel
Source: CitrusEndpoints.java
...13 * See the License for the specific language governing permissions and14 * limitations under the License.15 */16package com.consol.citrus.dsl.endpoint;17import com.consol.citrus.channel.ChannelEndpointBuilder;18import com.consol.citrus.channel.ChannelSyncEndpointBuilder;19import com.consol.citrus.docker.client.DockerClientBuilder;20import com.consol.citrus.dsl.endpoint.jdbc.JdbcDbServerEndpointBuilder;21import com.consol.citrus.dsl.endpoint.selenium.SeleniumBrowserEndpointBuilder;22import com.consol.citrus.endpoint.Endpoint;23import com.consol.citrus.endpoint.EndpointBuilder;24import com.consol.citrus.ftp.client.*;25import com.consol.citrus.ftp.server.FtpServerBuilder;26import com.consol.citrus.ftp.server.SftpServerBuilder;27import com.consol.citrus.http.client.HttpClientBuilder;28import com.consol.citrus.http.server.HttpServerBuilder;29import com.consol.citrus.jms.endpoint.JmsEndpointBuilder;30import com.consol.citrus.jms.endpoint.JmsSyncEndpointBuilder;31import com.consol.citrus.jmx.client.JmxClientBuilder;32import com.consol.citrus.jmx.server.JmxServerBuilder;33import com.consol.citrus.kafka.endpoint.KafkaEndpointBuilder;34import com.consol.citrus.kubernetes.client.KubernetesClientBuilder;35import com.consol.citrus.mail.client.MailClientBuilder;36import com.consol.citrus.mail.server.MailServerBuilder;37import com.consol.citrus.rmi.client.RmiClientBuilder;38import com.consol.citrus.rmi.server.RmiServerBuilder;39import com.consol.citrus.ssh.client.SshClientBuilder;40import com.consol.citrus.ssh.server.SshServerBuilder;41import com.consol.citrus.vertx.endpoint.VertxEndpointBuilder;42import com.consol.citrus.vertx.endpoint.VertxSyncEndpointBuilder;43import com.consol.citrus.websocket.client.WebSocketClientBuilder;44import com.consol.citrus.websocket.server.WebSocketServerBuilder;45import com.consol.citrus.ws.client.WebServiceClientBuilder;46import com.consol.citrus.ws.server.WebServiceServerBuilder;47/**48 * @author Christoph Deppisch49 * @since 2.550 */51public abstract class CitrusEndpoints {52 /**53 * Prevent public instantiation.54 */55 protected CitrusEndpoints() {56 super();57 }58 /**59 * Creates new ChannelEndpoint sync or async builder.60 * @return61 */62 public static AsyncSyncEndpointBuilder<ChannelEndpointBuilder, ChannelSyncEndpointBuilder> channel() {63 return new AsyncSyncEndpointBuilder<>(new ChannelEndpointBuilder(), new ChannelSyncEndpointBuilder());64 }65 /**66 * Creates new JmsEndpoint sync or async builder.67 * @return68 */69 public static AsyncSyncEndpointBuilder<JmsEndpointBuilder, JmsSyncEndpointBuilder> jms() {70 return new AsyncSyncEndpointBuilder<>(new JmsEndpointBuilder(), new JmsSyncEndpointBuilder());71 }72 /**73 * Creates new HttpClient or HttpServer builder.74 * @return75 */76 public static ClientServerEndpointBuilder<HttpClientBuilder, HttpServerBuilder> http() {...
Source: ChannelEndpointBuilder.java
...12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.13 * See the License for the specific language governing permissions and14 * limitations under the License.15 */16package com.consol.citrus.channel;17import com.consol.citrus.endpoint.AbstractEndpointBuilder;18import org.springframework.integration.core.MessagingTemplate;19import org.springframework.messaging.MessageChannel;20import org.springframework.messaging.core.DestinationResolver;21/**22 * @author Christoph Deppisch23 * @since 2.7.624 */25public class ChannelEndpointBuilder extends AbstractEndpointBuilder<ChannelEndpoint> {26 /** Endpoint target */27 private ChannelEndpoint endpoint = new ChannelEndpoint();28 @Override29 protected ChannelEndpoint getEndpoint() {30 return endpoint;31 }32 /**33 * Sets the channelName property.34 * @param channelName35 * @return36 */37 public ChannelEndpointBuilder channel(String channelName) {38 endpoint.getEndpointConfiguration().setChannelName(channelName);39 return this;40 }41 /**42 * Sets the channel property.43 * @param channel44 * @return45 */46 public ChannelEndpointBuilder channel(MessageChannel channel) {47 endpoint.getEndpointConfiguration().setChannel(channel);48 return this;49 }50 /**51 * Sets the messagingTemplate property.52 * @param messagingTemplate53 * @return54 */55 public ChannelEndpointBuilder messagingTemplate(MessagingTemplate messagingTemplate) {56 endpoint.getEndpointConfiguration().setMessagingTemplate(messagingTemplate);57 return this;58 }59 /**60 * Sets the messageConverter property.61 * @param messageConverter62 * @return63 */64 public ChannelEndpointBuilder messageConverter(ChannelMessageConverter messageConverter) {65 endpoint.getEndpointConfiguration().setMessageConverter(messageConverter);66 return this;67 }68 /**69 * Sets the channel resolver.70 * @param resolver71 * @return72 */73 public ChannelEndpointBuilder channelResolver(DestinationResolver resolver) {74 endpoint.getEndpointConfiguration().setChannelResolver(resolver);75 return this;76 }77 /**78 * Sets the useObjectMessages property.79 * @param useObjectMessages80 * @return81 */82 public ChannelEndpointBuilder useObjectMessages(boolean useObjectMessages) {83 endpoint.getEndpointConfiguration().setUseObjectMessages(useObjectMessages);84 return this;85 }86 /**87 * Sets the default timeout....
Source: ChannelEndpointConfigParser.java
...14 * limitations under the License.15 */16package com.consol.citrus.config.annotation;17import com.consol.citrus.TestActor;18import com.consol.citrus.channel.*;19import com.consol.citrus.context.ReferenceResolver;20import org.springframework.integration.core.MessagingTemplate;21import org.springframework.messaging.MessageChannel;22import org.springframework.messaging.core.DestinationResolver;23import org.springframework.util.StringUtils;24/**25 * @author Christoph Deppisch26 * @since 2.7.627 */28public class ChannelEndpointConfigParser extends AbstractAnnotationConfigParser<ChannelEndpointConfig, ChannelEndpoint> {29 /**30 * Constructor matching super.31 * @param referenceResolver32 */33 public ChannelEndpointConfigParser(ReferenceResolver referenceResolver) {34 super(referenceResolver);35 }36 @Override37 public ChannelEndpoint parse(ChannelEndpointConfig annotation) {38 ChannelEndpointBuilder builder = new ChannelEndpointBuilder();39 String channel = annotation.channel();40 String channelName = annotation.channelName();41 if (StringUtils.hasText(channel)) {42 builder.channel(getReferenceResolver().resolve(annotation.channel(), MessageChannel.class));43 }44 if (StringUtils.hasText(channelName)) {45 builder.channel(annotation.channelName());46 }47 if (StringUtils.hasText(annotation.messagingTemplate())) {48 //messagingTemplate49 String messagingTemplate = "messagingTemplate"; //default value50 if (StringUtils.hasText(annotation.messagingTemplate())) {51 messagingTemplate = annotation.messagingTemplate();52 }53 builder.messagingTemplate(getReferenceResolver().resolve(messagingTemplate, MessagingTemplate.class));54 }55 builder.useObjectMessages(annotation.useObjectMessages());56 if (StringUtils.hasText(annotation.messageConverter())) {57 builder.messageConverter(getReferenceResolver().resolve(annotation.messageConverter(), ChannelMessageConverter.class));58 }59 if (StringUtils.hasText(annotation.channelResolver())) {60 builder.channelResolver(getReferenceResolver().resolve(annotation.channelResolver(), DestinationResolver.class));61 }62 builder.timeout(annotation.timeout());63 if (StringUtils.hasText(annotation.actor())) {64 builder.actor(getReferenceResolver().resolve(annotation.actor(), TestActor.class));65 }66 return builder.initialize().build();67 }68}...
channel
Using AI Code Generation
1package com.consol.citrus.samples;2import com.consol.citrus.dsl.endpoint.CitrusEndpoints;3import com.consol.citrus.dsl.testng.TestNGCitrusTestDesigner;4import org.springframework.context.annotation.Bean;5import org.springframework.context.annotation.Configuration;6import org.springframework.integration.channel.DirectChannel;7import org.springframework.integration.channel.QueueChannel;8import org.springframework.integration.dsl.IntegrationFlow;9import org.springframework.integration.dsl.IntegrationFlows;10import org.testng.annotations.Test;11public class ChannelEndpointBuilderTest extends TestNGCitrusTestDesigner {12 protected void configure() {13 variable("name", "Test");14 variable("age", "20");15 variable("country", "India");16 echo("Sending Message to Channel");17 send(channel("channelEndpoint"))18 .payload("<person><name>${name}</name><age>${age}</age><country>${country}</country></person>");19 echo("Receiving Message from Channel");20 receive(channel("channelEndpoint"))21 .payload("<person><name>${name}</name><age>${age}</age><country>${country}</country></person>");22 }23 public static class EndpointConfig {24 public DirectChannel channelEndpoint() {25 return new DirectChannel();26 }27 public QueueChannel channelEndpointReply() {28 return new QueueChannel();29 }30 public IntegrationFlow channelEndpointFlow() {31 return IntegrationFlows.from(channelEndpoint())32 .transform(p -> p)33 .channel(channelEndpointReply())34 .get();35 }36 }37}
channel
Using AI Code Generation
1package com.consol.citrus.dsl.endpoint;2import org.springframework.context.annotation.Bean;3import org.springframework.context.annotation.Configuration;4import org.springframework.context.annotation.Import;5import org.springframework.integration.channel.DirectChannel;6import org.springframework.integration.channel.QueueChannel;7import org.springframework.integration.channel.interceptor.WireTap;8import org.springframework.integration.dsl.IntegrationFlow;9import org.springframework.integration.dsl.IntegrationFlows;10import org.springframework.integration.store.MessageGroupStore;11import org.springframework.integration.store.SimpleMessageStore;12import org.springframework.integration.support.channel.BeanFactoryChannelResolver;13import org.springframework.messaging.MessageChannel;14import com.consol.citrus.channel.ChannelEndpoint;15import com.consol.citrus.channel.ChannelEndpointBuilder;16import com.consol.citrus.dsl.runner.TestRunner;17import com.consol.citrus.message.MessageQueue;18import com.consol.citrus.message.MessageQueueBuilder;19import com.consol.citrus.message.MessageQueueChannel;20import com.consol.citrus.message.MessageQueueChannelBuilder;21import com.consol.citrus.message.MessageQueueConsumer;22import com.consol.citrus.message.MessageQueueConsumerBuilder;23import com.consol.citrus.message.MessageQueueProducer;24import com.consol.citrus.message.MessageQueueProducerBuilder;25import com.consol.citrus.message.MessageQueueReceiver;26import com.consol.citrus.message.MessageQueueReceiverBuilder;27import com.consol.citrus.message.MessageQueueSender;28import com.consol.citrus.message.MessageQueueSenderBuilder;29import com.consol.citrus.message.MessageQueueStore;30import com.consol.citrus.message.MessageQueueStoreBuilder;31import com.consol.citrus.message.MessageQueueStub;32import com.consol.citrus.message.MessageQueueStubBuilder;33import com.consol.citrus.message.MessageQueueTestSupport;34import com.consol.citrus.message.MessageQueueTestSupportBuilder;35import com.consol.citrus.message.PollableChannelEndpoint;36import com.consol.citrus.message.PollableChannelEndpointBuilder;37import com.consol.citrus.message.ReplyMessageChannel;38import com.consol.citrus.message.ReplyMessageChannelBuilder;39import com.consol.citrus.message.ReplyMessageCorrelator;40import com.consol.citrus.message.ReplyMessageCorrelatorBuilder;41import com.consol.citrus.message.ReplyMessageHandler;42import com.consol.citrus.message.ReplyMessageHandlerBuilder;43import com.consol.citrus.message.ReplyMessage
channel
Using AI Code Generation
1package org.mycompany;2import org.springframework.context.annotation.Bean;3import org.springframework.context.annotation.Configuration;4import org.springframework.integration.channel.DirectChannel;5import org.springframework.integration.channel.QueueChannel;6import org.springframework.integration.dsl.IntegrationFlow;7import org.springframework.integration.dsl.IntegrationFlows;8import org.springframework.integration.dsl.MessageChannels;9public class ChannelConfig {10public DirectChannel requestChannel() {11return MessageChannels.direct().get();12}13public QueueChannel responseChannel() {14return MessageChannels.queue().get();15}16public IntegrationFlow integrationFlow() {17.from(requestChannel())18.transform("payload")19.channel(responseChannel())20.get();21}22}23package org.mycompany;24import com.consol.citrus.dsl.endpoint.CitrusEndpoints;25import com.consol.citrus.dsl.runner.TestRunner;26import com.consol.citrus.dsl.testng.TestNGCitrusTest;27import com.consol.citrus.message.MessageType;28import org.springframework.beans.factory.annotation.Autowired;29import org.springframework.context.annotation.Import;30import org.testng.annotations.Test;31@Import(ChannelConfig.class)32public class ChannelIT extends TestNGCitrusTest {33private TestRunner runner;34private DirectChannel requestChannel;35private QueueChannel responseChannel;36public void testChannel() {37.channel()38.endpoint(requestChannel)39.endpoint(responseChannel)40.messageType(MessageType.PLAINTEXT)41.build()42.send(runner, runner.receive(runner.messageBuilder()43.payload("Hello Citrus!")44.build()));45}46}47package org.mycompany;48import com.consol.citrus.dsl.endpoint.CitrusEndpoints;49import com.consol.citrus.dsl.runner.TestRunner;50import com.consol.citrus.dsl.testng.TestNGCitrusTest;51import com.consol.citrus.message.MessageType;52import org.springframework.beans.factory.annotation.Autowired;53import org.springframework.context.annotation.Import;54import org.testng.annotations.Test;55@Import(ChannelConfig.class)56public class ChannelIT extends TestNGCitrusTest {57private TestRunner runner;58private DirectChannel requestChannel;59private QueueChannel responseChannel;60public void testChannel() {61.channel()62.endpoint(requestChannel)63.endpoint(responseChannel)64.messageType(Message
channel
Using AI Code Generation
1public class ChannelEndpointBuilderTest extends TestNGCitrusTestDesigner {2 private ApplicationContext applicationContext;3 private MessageChannel channel;4 public void channelEndpointBuilderTest() {5 echo("channelEndpointBuilderTest: start");6 echo("channelEndpointBuilderTest: create channelEndpointBuilder");7 ChannelEndpointBuilder channelEndpointBuilder = new ChannelEndpointBuilder();8 echo("channelEndpointBuilderTest: set channel");9 channelEndpointBuilder.channel(channel);10 echo("channelEndpointBuilderTest: set channelName");11 channelEndpointBuilder.channelName("channelName");12 echo("channelEndpointBuilderTest: set channelResolver");13 channelEndpointBuilder.channelResolver(new ChannelResolver() {14 public MessageChannel resolveDestination(String channelName) {15 return channel;16 }17 });18 echo("channelEndpointBuilderTest: set applicationContext");19 channelEndpointBuilder.applicationContext(applicationContext);20 echo("channelEndpointBuilderTest: set messageConverter");21 channelEndpointBuilder.messageConverter(new SimpleMessageConverter());22 echo("channelEndpointBuilderTest: set messageCorrelator");23 channelEndpointBuilder.messageCorrelator(new DefaultMessageCorrelator());24 echo("channelEndpointBuilderTest: set messageSelector");25 channelEndpointBuilder.messageSelector(new DefaultMessageSelector());26 echo("channelEndpointBuilderTest: set messageSelectorExpression");27 channelEndpointBuilder.messageSelectorExpression("messageSelectorExpression");28 echo("channelEndpointBuilderTest: set messageSelectorExpressionParser");29 channelEndpointBuilder.messageSelectorExpressionParser(new SpelExpressionParser());30 echo("channelEndpointBuilderTest: set messageSelectorType");31 channelEndpointBuilder.messageSelectorType("messageSelectorType");32 echo("channelEndpointBuilderTest: set messageSelectorValue");33 channelEndpointBuilder.messageSelectorValue("messageSelectorValue");34 echo("channelEndpointBuilderTest: set messageSelectorValueParser");35 channelEndpointBuilder.messageSelectorValueParser(new SimpleMessageSelectorValueParser());36 echo("channelEndpointBuilderTest: set timeout");37 channelEndpointBuilder.timeout(1000L);38 echo("channelEndpointBuilderTest: set pollInterval");39 channelEndpointBuilder.pollInterval(1000L);40 echo("channelEndpointBuilderTest: set autoStart");41 channelEndpointBuilder.autoStart(true);42 echo("channelEndpointBuilderTest: set endpointConfiguration");43 channelEndpointBuilder.endpointConfiguration(new ChannelEndpointConfiguration());44 echo("channelEndpointBuilderTest: set messageChannel");
channel
Using AI Code Generation
1public class 4 {2 public static void main(String[] args) {3 new Citrus().run(new TestBuilder() {4 public void configure() {5 echo("Hello World!");6 channel(builder -> builder.endpoint("myChannel"));7 }8 });9 }10}11public class 5 {12 public static void main(String[] args) {13 new Citrus().run(new TestBuilder() {14 public void configure() {15 echo("Hello World!");16 channel(builder -> builder.endpoint("myChannel"));17 }18 });19 }20}21public class 6 {22 public static void main(String[] args) {23 new Citrus().run(new TestBuilder() {24 public void configure() {25 echo("Hello World!");26 channel(builder -> builder.endpoint("myChannel"));27 }28 });29 }30}31public class 7 {32 public static void main(String[] args) {33 new Citrus().run(new TestBuilder() {34 public void configure() {35 echo("Hello World!");36 channel(builder -> builder.endpoint("myChannel"));37 }38 });39 }40}41public class 8 {42 public static void main(String[] args) {43 new Citrus().run(new TestBuilder() {44 public void configure() {45 echo("Hello World!");46 channel(builder -> builder.endpoint("myChannel"));47 }48 });49 }50}51public class 9 {52 public static void main(String[] args) {53 new Citrus().run(new TestBuilder() {54 public void configure() {55 echo("Hello World!");56 channel(builder -> builder.endpoint("myChannel"));57 }58 });59 }60}
channel
Using AI Code Generation
1package com.consol.citrus.samples;2import java.util.HashMap;3import java.util.Map;4import org.testng.Assert;5import org.testng.annotations.Test;6import com.consol.citrus.annotations.CitrusTest;7import com.consol.citrus.channel.ChannelEndpoint;8import com.consol.citrus.channel.ChannelEndpointBuilder;9import com.consol.citrus.channel.ChannelSyncEndpoint;10import com.consol.citrus.dsl.testng.TestNGCitrusTestDesigner;11import com.consol.citrus.message.MessageType;12public class ChannelTest extends TestNGCitrusTestDesigner {13 public void testChannel() {14 ChannelEndpoint channel = new ChannelEndpointBuilder()15 .channelName("myChannel")16 .channelType(ChannelEndpointBuilder.ChannelType.QUEUE)17 .messageType(MessageType.PLAINTEXT)18 .build();19 send(channel).payload("Test Message");20 receive(channel).payload("Test Message");21 }22 public void testChannelSync() {23 ChannelSyncEndpoint channel = new ChannelEndpointBuilder()24 .channelName("myChannel")25 .channelType(ChannelEndpointBuilder.ChannelType.QUEUE)26 .messageType(MessageType.PLAINTEXT)27 .build();28 send(channel).payload("Test Message");29 receive(channel).payload("Test Message");30 }31 public void testChannelSyncWithTimeout() {32 ChannelSyncEndpoint channel = new ChannelEndpointBuilder()33 .channelName("myChannel")34 .channelType(ChannelEndpointBuilder.ChannelType.QUEUE)35 .messageType(MessageType.PLAINTEXT)36 .timeout(5000L)37 .build();38 send(channel).payload("Test Message");39 receive(channel).payload("Test Message");40 }41 public void testChannelSyncWithTimeoutAndSelector() {
channel
Using AI Code Generation
1package com.consol.citrus;2import com.consol.citrus.dsl.builder.ReceiveMessageBuilder;3import com.consol.citrus.dsl.builder.SendMessageBuilder;4import com.consol.citrus.dsl.runner.TestRunner;5import com.consol.citrus.dsl.testng.TestNGCitrusTest;6import org.springframework.beans.factory.annotation.Autowired;7import org.springframework.context.annotation.Bean;8import org.springframework.context.annotation.Configuration;9import org.springframework.integration.channel.QueueChannel;10import org.springframework.integration.dsl.IntegrationFlow;11import org.springframework.integration.dsl.IntegrationFlows;12import org.springframework.integration.dsl.MessageChannels;13import org.springframework.integration.dsl.StandardIntegrationFlow;14import org.springframework.integration.dsl.channel.MessageChannelSpec;15import org.springframework.integration.dsl.channel.PollableChannelSpec;16import org.springframework.integration.dsl.support.Consumer;17import org.testng.annotations.Test;18public class ChannelEndpointBuilderTest extends TestNGCitrusTest {19 private TestRunner runner;20 public QueueChannel channel() {21 return MessageChannels.queue(10).get();22 }23 public IntegrationFlow channelFlow() {24 return IntegrationFlows.from("channel").handle("testBean", "handle").get();25 }26 public void testChannelEndpoint() {27 runner.echo("Testing Channel Endpoint");28 runner.receive(channelEndpointBuilder -> channelEndpointBuilder29 .channel(channel())30 .messageType(MessageType.PLAINTEXT)31 .payload("Hello World!"));32 runner.send(channelEndpointBuilder -> channelEndpointBuilder33 .channel(channel())34 .messageType(MessageType.PLAINTEXT)35 .payload("Hello World!"));36 }37}38package com.consol.citrus;39import com.consol.citrus.dsl.builder.ReceiveMessageBuilder;40import com.consol.citrus.dsl.builder.SendMessageBuilder;41import com.consol.citrus.dsl.runner.TestRunner;42import com.consol.citrus.dsl.testng.TestNGCitrusTest;43import org.springframework.beans.factory.annotation.Autowired;44import org.springframework.context.annotation.Bean;45import org.springframework.context.annotation.Configuration;46import org.springframework.integration.channel.QueueChannel;47import org.springframework.integration.dsl.IntegrationFlow;48import org.springframework.integration.dsl.IntegrationFlows
channel
Using AI Code Generation
1package com.consol.citrus.dsl.testng;2import org.testng.annotations.Test;3import com.consol.citrus.annotations.CitrusTest;4import com.consol.citrus.annotations.CitrusXmlTest;5import com.consol.citrus.testng.CitrusParameters;6public class ChannelIT extends AbstractTestNGCitrusTest {7 @CitrusXmlTest(name = "ChannelIT")8 public void ChannelIT() {}9}10 <import resource="classpath:com/consol/citrus/dsl/runner/testng/testng-xml-test-context.xml"/>11Citrus channel() method12Citrus channelEndpoint() method13The channelEndpoint() method is used to create a new channel endpoint builder instance. This method takes no
Check out the latest blogs from LambdaTest on this topic:
The QA testing career includes following an often long, winding road filled with fun, chaos, challenges, and complexity. Financially, the spectrum is broad and influenced by location, company type, company size, and the QA tester’s experience level. QA testing is a profitable, enjoyable, and thriving career choice.
Sometimes, in our test code, we need to handle actions that apparently could not be done automatically. For example, some mouse actions such as context click, double click, drag and drop, mouse movements, and some special key down and key up actions. These specific actions could be crucial depending on the project context.
When working on web automation with Selenium, I encountered scenarios where I needed to refresh pages from time to time. When does this happen? One scenario is that I needed to refresh the page to check that the data I expected to see was still available even after refreshing. Another possibility is to clear form data without going through each input individually.
Did you know that according to Statista, the number of smartphone users will reach 18.22 billion by 2025? Let’s face it, digital transformation is skyrocketing and will continue to do so. This swamps the mobile app development market with various options and gives rise to the need for the best mobile app testing tools
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!