Share via


BizTalk: Sequential Convoy using Listen Shape

What is Sequential Convoy in BizTalk?

A sequential convoy enables multiple single messages to join together to achieve a required result. A sequential convoy is a set of related messages that have a predefined order. Although the messages do not have to be exactly the same, BizTalk Server must receive them in a sequential order.

Listen Shape in BizTalk

Listen shape in BizTalk is the most powerful shape available in Orchestration developer toolbox. It can be used in many design patterns for BizTalk Soluton. Listen shape listens for some event to take place in its every branch. Suppose there are three branches in Listen shape and an event on second branch takes place then all other branches would get terminated.

Sequential Convoy using Listen Shape

I am going to demonstrate a sequential convoy using listen shape.
Suppose we have a file for Purchase order (PO) and a second file for Customer detail for that particular PO. We have to concatenate these two files and send it further.

Schema for first File i.e PO:

https://4.bp.blogspot.com/-tYdL1jnzFYI/UN8SbO1WX7I/AAAAAAAAAKA/dhDq8JN25Q0/s400/1stSchema.png

Since we are using Sequential convoy we need to define a correlation set and type. Therefore I have promoted the PONo field in both the schema.

Schema for second File i.e Customer Details:

https://3.bp.blogspot.com/-A5vvhVSHFnA/UN8TfEzCHWI/AAAAAAAAAKM/rUbnNIk3gVw/s400/2ndSchema.png

Destination Schema:

https://3.bp.blogspot.com/-5nly5YbApTk/UN8UD-C-naI/AAAAAAAAAKY/oaoqDcMMH94/s400/Destination.png

Orchestration goes like this:

https://4.bp.blogspot.com/-xEiz0Tb1bzo/UN8U9JkpCKI/AAAAAAAAAKk/jjhdf9BWDyM/s400/Orchestration_View.png

In Orchestration I have used a Uniform Sequential convoy which means that the Orchestration can receive messages from same logical Orchestration port. There are two receive shapes in Orchestration where the first receive shape initializes the correlation set and is marked activating. The second receive shape follows the correlation set. The only thing that we need to take care is that ordered **delivery **property of the receive port must to true.

First branch of Listen shape contain receive shape and transform shape. When Orchestration receives the PO file, the orchestration becomes dehydrate and waits for the second file i.e customer file to arrive. If the file comes before the time specified in the delay shape then the first branch of listen shape executes otherwise second branch of expression shape executes.

Map:

https://1.bp.blogspot.com/-tuN9Av3AXSI/UN8hjPKCidI/AAAAAAAAALA/kIWotPeYwQw/s400/Map.png

Input Files:

PO file

<ns0:PO xmlns:ns0="http://Working_With_ListenShape.SourceSch">
 
  <PODetails>
 
    <PONo>10</PONo>
 
    <Date>20121229</Date>
 
  </PODetails>
 
</ns0:PO>

Customer file:

<ns0:Customer xmlns:ns0="http://Working_With_ListenShape.SourceSch1">
 
  <Details>
 
    <ID>99</ID>
 
    <FirstName>John</FirstName>
 
    <LastName>Cena</LastName>
 
    <Address>Nashville,US</Address>
 
    <PONo>10</PONo>
 
  </Details>
 
</ns0:Customer>

Output: 

Case 1: When second file arrives before the time specified in delay shape.

https://1.bp.blogspot.com/-o84B6-VBmNE/UN8mmlHqt1I/AAAAAAAAALU/SZhfSaYtdmk/s400/Output_After_Dropping_2ndFile.png

**

**

Case 2: When event on Delay branch happens then output in Debug View:

https://2.bp.blogspot.com/-_P9zHXwwyZ4/UN8nQnElVfI/AAAAAAAAALc/wvLFEv1AID8/s400/Output.png

A sequential convoy enables multiple single messages to join together to achieve a required result. A sequential convoy is a set of related messages that have a predefined order. Although the messages do not have to be exactly the same, BizTalk Server must receive them in a sequential order.

Listen Shape in BizTalk Example -:

Listen shape in BizTalk is the most powerful shape available in Orchestration developer toolbox. It can be used in many design patterns for BizTalk Soluton. Listen shape listens for some event to take place in its every branch. Suppose there are 3 branches in Listen shape and an event on 2nd branch takes place then all other branches would get terminated.

Sequential Convoy using Listen Shape 

I am going to demonstrate a sequential convoy using listen shape.

Suppose we have a file for Purchase order (PO) and a second file for Customer detail for that particular PO. We have to concatenate these two files and send it further. 

Schema for 1st File i.e PO :

https://4.bp.blogspot.com/-tYdL1jnzFYI/UN8SbO1WX7I/AAAAAAAAAKA/dhDq8JN25Q0/s400/1stSchema.png

Since we are using Sequential convoy we need to define a correlation set and type. Therefore I have promoted the PONo field in both the schema.

Schema for 2nd File i.e Customer Details :

https://3.bp.blogspot.com/-A5vvhVSHFnA/UN8TfEzCHWI/AAAAAAAAAKM/rUbnNIk3gVw/s400/2ndSchema.png

Destination Schema :

https://3.bp.blogspot.com/-5nly5YbApTk/UN8UD-C-naI/AAAAAAAAAKY/oaoqDcMMH94/s400/Destination.png

Orchestration goes like this :

https://4.bp.blogspot.com/-xEiz0Tb1bzo/UN8U9JkpCKI/AAAAAAAAAKk/jjhdf9BWDyM/s400/Orchestration_View.png

In Orchestration I have used a Uniform Sequential convoy which means that the Orchestration can receive messages from same logical Orchestration port. There are two receive shapes in Orchestration where the 1st receive shape initializes the correlation set and is marked activating. The 2nd receive shape follows the correlation set. The only thing that we need to take care is that ordered **delivery **property of the receive port must to true.

First branch of Listen shape contain receive shape and transform shape. When Orchestration receives the PO file, the orchestration becomes dehydrate and waits for the 2nd file i.e customer file to arrive. If the file comes before the time specified in the delay shape then the first branch of listen shape executes otherwise second branch of expression shape executes.

Map :

https://1.bp.blogspot.com/-tuN9Av3AXSI/UN8hjPKCidI/AAAAAAAAALA/kIWotPeYwQw/s400/Map.png

Input Files :

PO file

<ns0:PO xmlns:ns0="http://Working_With_ListenShape.SourceSch">

**  <PODetails>**

**    <PONo>10</PONo>**

**    <Date>20121229</Date>**

**  </PODetails>**

</ns0:PO>

Customer file :

<ns0:Customer xmlns:ns0="http://Working_With_ListenShape.SourceSch1">

  <Details>

    <ID>99</ID>

    <FirstName>John</FirstName>

    <LastName>Cena</LastName>

    <Address>Nashville,US</Address>

    <PONo>10</PONo>

  </Details>

</ns0:Customer>

**Output : **

Case 1 : When 2nd file arrives before the time specified in delay shape.

https://1.bp.blogspot.com/-o84B6-VBmNE/UN8mmlHqt1I/AAAAAAAAALU/SZhfSaYtdmk/s400/Output_After_Dropping_2ndFile.png

**

**

Case 2 : When event on Delay branch happens then output in Debug View :

https://2.bp.blogspot.com/-_P9zHXwwyZ4/UN8nQnElVfI/AAAAAAAAALc/wvLFEv1AID8/s400/Output.png

A sequential convoy enables multiple single messages to join together to achieve a required result. A sequential convoy is a set of related messages that have a predefined order. Although the messages do not have to be exactly the same, BizTalk Server must receive them in a sequential order.

Listen Shape in BizTalk Example -:

Listen shape in BizTalk is the most powerful shape available in Orchestration developer toolbox. It can be used in many design patterns for BizTalk Soluton. Listen shape listens for some event to take place in its every branch. Suppose there are 3 branches in Listen shape and an event on 2nd branch takes place then all other branches would get terminated.

Sequential Convoy using Listen Shape 

I am going to demonstrate a sequential convoy using listen shape.

Suppose we have a file for Purchase order (PO) and a second file for Customer detail for that particular PO. We have to concatenate these two files and send it further. 

Schema for 1st File i.e PO :

https://4.bp.blogspot.com/-tYdL1jnzFYI/UN8SbO1WX7I/AAAAAAAAAKA/dhDq8JN25Q0/s400/1stSchema.png

Since we are using Sequential convoy we need to define a correlation set and type. Therefore I have promoted the PONo field in both the schema.

Schema for 2nd File i.e Customer Details :

https://3.bp.blogspot.com/-A5vvhVSHFnA/UN8TfEzCHWI/AAAAAAAAAKM/rUbnNIk3gVw/s400/2ndSchema.png

Destination Schema :

https://3.bp.blogspot.com/-5nly5YbApTk/UN8UD-C-naI/AAAAAAAAAKY/oaoqDcMMH94/s400/Destination.png

Orchestration goes like this :

https://4.bp.blogspot.com/-xEiz0Tb1bzo/UN8U9JkpCKI/AAAAAAAAAKk/jjhdf9BWDyM/s400/Orchestration_View.png

In Orchestration I have used a Uniform Sequential convoy which means that the Orchestration can receive messages from same logical Orchestration port. There are two receive shapes in Orchestration where the 1st receive shape initializes the correlation set and is marked activating. The 2nd receive shape follows the correlation set. The only thing that we need to take care is that ordered **delivery **property of the receive port must to true.

First branch of Listen shape contain receive shape and transform shape. When Orchestration receives the PO file, the orchestration becomes dehydrate and waits for the 2nd file i.e customer file to arrive. If the file comes before the time specified in the delay shape then the first branch of listen shape executes otherwise second branch of expression shape executes.

Map :

https://1.bp.blogspot.com/-tuN9Av3AXSI/UN8hjPKCidI/AAAAAAAAALA/kIWotPeYwQw/s400/Map.png

Input Files :

PO file

<ns0:PO xmlns:ns0="http://Working_With_ListenShape.SourceSch">

**  <PODetails>**

**    <PONo>10</PONo>**

**    <Date>20121229</Date>**

**  </PODetails>**

</ns0:PO>

Customer file :

<ns0:Customer xmlns:ns0="http://Working_With_ListenShape.SourceSch1">

  <Details>

    <ID>99</ID>

    <FirstName>John</FirstName>

    <LastName>Cena</LastName>

    <Address>Nashville,US</Address>

    <PONo>10</PONo>

  </Details>

</ns0:Customer>

**Output : **

Case 1 : When 2nd file arrives before the time specified in delay shape.

https://1.bp.blogspot.com/-o84B6-VBmNE/UN8mmlHqt1I/AAAAAAAAALU/SZhfSaYtdmk/s400/Output_After_Dropping_2ndFile.png

**

**

Case 2 : When event on Delay branch happens then output in Debug View :

https://2.bp.blogspot.com/-_P9zHXwwyZ4/UN8nQnElVfI/AAAAAAAAALc/wvLFEv1AID8/s400/Output.png

A sequential convoy enables multiple single messages to join together to achieve a required result. A sequential convoy is a set of related messages that have a predefined order. Although the messages do not have to be exactly the same, BizTalk Server must receive them in a sequential order.

Listen Shape in BizTalk Example -:

Listen shape in BizTalk is the most powerful shape available in Orchestration developer toolbox. It can be used in many design patterns for BizTalk Soluton. Listen shape listens for some event to take place in its every branch. Suppose there are 3 branches in Listen shape and an event on 2nd branch takes place then all other branches would get terminated.

Sequential Convoy using Listen Shape 

I am going to demonstrate a sequential convoy using listen shape.

Suppose we have a file for Purchase order (PO) and a second file for Customer detail for that particular PO. We have to concatenate these two files and send it further. 

Schema for 1st File i.e PO :

https://4.bp.blogspot.com/-tYdL1jnzFYI/UN8SbO1WX7I/AAAAAAAAAKA/dhDq8JN25Q0/s400/1stSchema.png

Since we are using Sequential convoy we need to define a correlation set and type. Therefore I have promoted the PONo field in both the schema.

Schema for 2nd File i.e Customer Details :

https://3.bp.blogspot.com/-A5vvhVSHFnA/UN8TfEzCHWI/AAAAAAAAAKM/rUbnNIk3gVw/s400/2ndSchema.png

Destination Schema :

https://3.bp.blogspot.com/-5nly5YbApTk/UN8UD-C-naI/AAAAAAAAAKY/oaoqDcMMH94/s400/Destination.png

Orchestration goes like this :

https://4.bp.blogspot.com/-xEiz0Tb1bzo/UN8U9JkpCKI/AAAAAAAAAKk/jjhdf9BWDyM/s400/Orchestration_View.png

In Orchestration I have used a Uniform Sequential convoy which means that the Orchestration can receive messages from same logical Orchestration port. There are two receive shapes in Orchestration where the 1st receive shape initializes the correlation set and is marked activating. The 2nd receive shape follows the correlation set. The only thing that we need to take care is that ordered **delivery **property of the receive port must to true.

First branch of Listen shape contain receive shape and transform shape. When Orchestration receives the PO file, the orchestration becomes dehydrate and waits for the 2nd file i.e customer file to arrive. If the file comes before the time specified in the delay shape then the first branch of listen shape executes otherwise second branch of expression shape executes.

Map :

https://1.bp.blogspot.com/-tuN9Av3AXSI/UN8hjPKCidI/AAAAAAAAALA/kIWotPeYwQw/s400/Map.png

Input Files :

PO file

<ns0:PO xmlns:ns0="http://Working_With_ListenShape.SourceSch">

**  <PODetails>**

**    <PONo>10</PONo>**

**    <Date>20121229</Date>**

**  </PODetails>**

</ns0:PO>

Customer file :

<ns0:Customer xmlns:ns0="http://Working_With_ListenShape.SourceSch1">

  <Details>

    <ID>99</ID>

    <FirstName>John</FirstName>

    <LastName>Cena</LastName>

    <Address>Nashville,US</Address>

    <PONo>10</PONo>

  </Details>

</ns0:Customer>

**Output : **

Case 1 : When 2nd file arrives before the time specified in delay shape.

https://1.bp.blogspot.com/-o84B6-VBmNE/UN8mmlHqt1I/AAAAAAAAALU/SZhfSaYtdmk/s400/Output_After_Dropping_2ndFile.png

**

**

Case 2 : When event on Delay branch happens then output in Debug View :

https://2.bp.blogspot.com/-_P9zHXwwyZ4/UN8nQnElVfI/AAAAAAAAALc/wvLFEv1AID8/s400/Output.png

A sequential convoy enables multiple single messages to join together to achieve a required result. A sequential convoy is a set of related messages that have a predefined order. Although the messages do not have to be exactly the same, BizTalk Server must receive them in a sequential order.

Listen Shape in BizTalk Example -:

Listen shape in BizTalk is the most powerful shape available in Orchestration developer toolbox. It can be used in many design patterns for BizTalk Soluton. Listen shape listens for some event to take place in its every branch. Suppose there are 3 branches in Listen shape and an event on 2nd branch takes place then all other branches would get terminated.

Sequential Convoy using Listen Shape 

I am going to demonstrate a sequential convoy using listen shape.

Suppose we have a file for Purchase order (PO) and a second file for Customer detail for that particular PO. We have to concatenate these two files and send it further. 

Schema for 1st File i.e PO :

https://4.bp.blogspot.com/-tYdL1jnzFYI/UN8SbO1WX7I/AAAAAAAAAKA/dhDq8JN25Q0/s400/1stSchema.png

Since we are using Sequential convoy we need to define a correlation set and type. Therefore I have promoted the PONo field in both the schema.

Schema for 2nd File i.e Customer Details :

https://3.bp.blogspot.com/-A5vvhVSHFnA/UN8TfEzCHWI/AAAAAAAAAKM/rUbnNIk3gVw/s400/2ndSchema.png

Destination Schema :

https://3.bp.blogspot.com/-5nly5YbApTk/UN8UD-C-naI/AAAAAAAAAKY/oaoqDcMMH94/s400/Destination.png

Orchestration goes like this :

https://4.bp.blogspot.com/-xEiz0Tb1bzo/UN8U9JkpCKI/AAAAAAAAAKk/jjhdf9BWDyM/s400/Orchestration_View.png

In Orchestration I have used a Uniform Sequential convoy which means that the Orchestration can receive messages from same logical Orchestration port. There are two receive shapes in Orchestration where the 1st receive shape initializes the correlation set and is marked activating. The 2nd receive shape follows the correlation set. The only thing that we need to take care is that ordered **delivery **property of the receive port must to true.

First branch of Listen shape contain receive shape and transform shape. When Orchestration receives the PO file, the orchestration becomes dehydrate and waits for the 2nd file i.e customer file to arrive. If the file comes before the time specified in the delay shape then the first branch of listen shape executes otherwise second branch of expression shape executes.

Map :

https://1.bp.blogspot.com/-tuN9Av3AXSI/UN8hjPKCidI/AAAAAAAAALA/kIWotPeYwQw/s400/Map.png

Input Files :

PO file

<ns0:PO xmlns:ns0="http://Working_With_ListenShape.SourceSch">

**  <PODetails>**

**    <PONo>10</PONo>**

**    <Date>20121229</Date>**

**  </PODetails>**

</ns0:PO>

Customer file :

<ns0:Customer xmlns:ns0="http://Working_With_ListenShape.SourceSch1">

  <Details>

    <ID>99</ID>

    <FirstName>John</FirstName>

    <LastName>Cena</LastName>

    <Address>Nashville,US</Address>

    <PONo>10</PONo>

  </Details>

</ns0:Customer>

**Output : **

Case 1 : When 2nd file arrives before the time specified in delay shape.

https://1.bp.blogspot.com/-o84B6-VBmNE/UN8mmlHqt1I/AAAAAAAAALU/SZhfSaYtdmk/s400/Output_After_Dropping_2ndFile.png

**

**

Case 2 : When event on Delay branch happens then output in Debug View :

https://2.bp.blogspot.com/-_P9zHXwwyZ4/UN8nQnElVfI/AAAAAAAAALc/wvLFEv1AID8/s400/Output.png

A sequential convoy enables multiple single messages to join together to achieve a required result. A sequential convoy is a set of related messages that have a predefined order. Although the messages do not have to be exactly the same, BizTalk Server must receive them in a sequential order.

Listen Shape in BizTalk Example -:

Listen shape in BizTalk is the most powerful shape available in Orchestration developer toolbox. It can be used in many design patterns for BizTalk Soluton. Listen shape listens for some event to take place in its every branch. Suppose there are 3 branches in Listen shape and an event on 2nd branch takes place then all other branches would get terminated.

Sequential Convoy using Listen Shape 

I am going to demonstrate a sequential convoy using listen shape.

Suppose we have a file for Purchase order (PO) and a second file for Customer detail for that particular PO. We have to concatenate these two files and send it further. 

Schema for 1st File i.e PO :

https://4.bp.blogspot.com/-tYdL1jnzFYI/UN8SbO1WX7I/AAAAAAAAAKA/dhDq8JN25Q0/s400/1stSchema.png

Since we are using Sequential convoy we need to define a correlation set and type. Therefore I have promoted the PONo field in both the schema.

Schema for 2nd File i.e Customer Details :

https://3.bp.blogspot.com/-A5vvhVSHFnA/UN8TfEzCHWI/AAAAAAAAAKM/rUbnNIk3gVw/s400/2ndSchema.png

Destination Schema :

https://3.bp.blogspot.com/-5nly5YbApTk/UN8UD-C-naI/AAAAAAAAAKY/oaoqDcMMH94/s400/Destination.png

Orchestration goes like this :

https://4.bp.blogspot.com/-xEiz0Tb1bzo/UN8U9JkpCKI/AAAAAAAAAKk/jjhdf9BWDyM/s400/Orchestration_View.png

In Orchestration I have used a Uniform Sequential convoy which means that the Orchestration can receive messages from same logical Orchestration port. There are two receive shapes in Orchestration where the 1st receive shape initializes the correlation set and is marked activating. The 2nd receive shape follows the correlation set. The only thing that we need to take care is that ordered **delivery **property of the receive port must to true.

First branch of Listen shape contain receive shape and transform shape. When Orchestration receives the PO file, the orchestration becomes dehydrate and waits for the 2nd file i.e customer file to arrive. If the file comes before the time specified in the delay shape then the first branch of listen shape executes otherwise second branch of expression shape executes.

Map :

https://1.bp.blogspot.com/-tuN9Av3AXSI/UN8hjPKCidI/AAAAAAAAALA/kIWotPeYwQw/s400/Map.png

Input Files :

PO file

<ns0:PO xmlns:ns0="http://Working_With_ListenShape.SourceSch">

**  <PODetails>**

**    <PONo>10</PONo>**

**    <Date>20121229</Date>**

**  </PODetails>**

</ns0:PO>

Customer file :

<ns0:Customer xmlns:ns0="http://Working_With_ListenShape.SourceSch1">

  <Details>

    <ID>99</ID>

    <FirstName>John</FirstName>

    <LastName>Cena</LastName>

    <Address>Nashville,US</Address>

    <PONo>10</PONo>

  </Details>

</ns0:Customer>

**Output : **

Case 1 : When 2nd file arrives before the time specified in delay shape.

https://1.bp.blogspot.com/-o84B6-VBmNE/UN8mmlHqt1I/AAAAAAAAALU/SZhfSaYtdmk/s400/Output_After_Dropping_2ndFile.png

**

**

Case 2 : When event on Delay branch happens then output in Debug View :

https://2.bp.blogspot.com/-_P9zHXwwyZ4/UN8nQnElVfI/AAAAAAAAALc/wvLFEv1AID8/s400/Output.png

A sequential convoy enables multiple single messages to join together to achieve a required result. A sequential convoy is a set of related messages that have a predefined order. Although the messages do not have to be exactly the same, BizTalk Server must receive them in a sequential order.

Listen Shape in BizTalk Example -:

Listen shape in BizTalk is the most powerful shape available in Orchestration developer toolbox. It can be used in many design patterns for BizTalk Soluton. Listen shape listens for some event to take place in its every branch. Suppose there are 3 branches in Listen shape and an event on 2nd branch takes place then all other branches would get terminated.

Sequential Convoy using Listen Shape 

I am going to demonstrate a sequential convoy using listen shape.

Suppose we have a file for Purchase order (PO) and a second file for Customer detail for that particular PO. We have to concatenate these two files and send it further. 

Schema for 1st File i.e PO :

https://4.bp.blogspot.com/-tYdL1jnzFYI/UN8SbO1WX7I/AAAAAAAAAKA/dhDq8JN25Q0/s400/1stSchema.png

Since we are using Sequential convoy we need to define a correlation set and type. Therefore I have promoted the PONo field in both the schema.

Schema for 2nd File i.e Customer Details :

https://3.bp.blogspot.com/-A5vvhVSHFnA/UN8TfEzCHWI/AAAAAAAAAKM/rUbnNIk3gVw/s400/2ndSchema.png

Destination Schema :

https://3.bp.blogspot.com/-5nly5YbApTk/UN8UD-C-naI/AAAAAAAAAKY/oaoqDcMMH94/s400/Destination.png

Orchestration goes like this :

https://4.bp.blogspot.com/-xEiz0Tb1bzo/UN8U9JkpCKI/AAAAAAAAAKk/jjhdf9BWDyM/s400/Orchestration_View.png

In Orchestration I have used a Uniform Sequential convoy which means that the Orchestration can receive messages from same logical Orchestration port. There are two receive shapes in Orchestration where the 1st receive shape initializes the correlation set and is marked activating. The 2nd receive shape follows the correlation set. The only thing that we need to take care is that ordered **delivery **property of the receive port must to true.

First branch of Listen shape contain receive shape and transform shape. When Orchestration receives the PO file, the orchestration becomes dehydrate and waits for the 2nd file i.e customer file to arrive. If the file comes before the time specified in the delay shape then the first branch of listen shape executes otherwise second branch of expression shape executes.

Map :

https://1.bp.blogspot.com/-tuN9Av3AXSI/UN8hjPKCidI/AAAAAAAAALA/kIWotPeYwQw/s400/Map.png

Input Files :

PO file

<ns0:PO xmlns:ns0="http://Working_With_ListenShape.SourceSch">

**  <PODetails>**

**    <PONo>10</PONo>**

**    <Date>20121229</Date>**

**  </PODetails>**

</ns0:PO>

Customer file :

<ns0:Customer xmlns:ns0="http://Working_With_ListenShape.SourceSch1">

  <Details>

    <ID>99</ID>

    <FirstName>John</FirstName>

    <LastName>Cena</LastName>

    <Address>Nashville,US</Address>

    <PONo>10</PONo>

  </Details>

</ns0:Customer>

**Output : **

Case 1 : When 2nd file arrives before the time specified in delay shape.

https://1.bp.blogspot.com/-o84B6-VBmNE/UN8mmlHqt1I/AAAAAAAAALU/SZhfSaYtdmk/s400/Output_After_Dropping_2ndFile.png

Case 2 : When event on Delay branch happens then output in Debug View :

https://2.bp.blogspot.com/-_P9zHXwwyZ4/UN8nQnElVfI/AAAAAAAAALc/wvLFEv1AID8/s400/Output.png