lsd0003

LSD0003: Set Union
Log | Files | Refs | README

commit 9c42def25d73b5b284eaf0f58d66d5e4ffbef07c
parent a64e0931399f70e3b04e07dd848cf2c6af6a8727
Author: Elias Summermatter <elias.summermatter@seccom.ch>
Date:   Wed,  9 Jun 2021 22:14:30 +0200

Changed some stuff

Diffstat:
Mdraft-summermatter-set-union.pdf | 0
Mdraft-summermatter-set-union.xml | 1394+++++++++++++++++++++++++++++++++++++++----------------------------------------
Mstatemachine/full_state_machine.png | 0
Mstatemachine/full_state_machine.svg | 4++--
Mstatemachine/full_state_machine.xml | 4++--
Mstatemachine/state_machine_full | 4++--
Mstatemachine/state_machine_full.png | 0
Mstatemachine/state_machine_full.svg | 4++--
8 files changed, 697 insertions(+), 713 deletions(-)

diff --git a/draft-summermatter-set-union.pdf b/draft-summermatter-set-union.pdf Binary files differ. diff --git a/draft-summermatter-set-union.xml b/draft-summermatter-set-union.xml @@ -61,11 +61,11 @@ <section anchor="introduction" numbered="true" toc="default"> <name>Introduction</name> <t> - This document describes a Byzantine fault-tolerant set reconciliation protocol used to efficient and securely + This document describes a byzantine fault tolerant set reconciliation protocol used to efficient and securely compute the union of two sets across a network. </t> <t> - This Byzantine fault-tolerant set reconciliation + This byzantine fault tolerant set reconciliation protocol can be used in a variety of applications. Our primary envisioned application domain is the @@ -128,7 +128,7 @@ The objective here is to limit resources wasted on malicious actors. Malicious actors could send malformed messages, including malformed set elements, claim to - have much larger numbers of valid set elements than the + have much larger numbers of valid set elements than they actually hold, or request the retransmission of elements that they have already received in previous interactions. Bounding resources consumed by malicous @@ -228,7 +228,7 @@ ]]></artwork> </figure> <t> - Is easy to see that the M(element) = (0,3) could be in the BF below and M(element) = (0,2) can't be + It is easy to see that the M(element) = (0,3) could be in the BF below and M(element) = (0,2) cannot be in the BF below: </t> @@ -361,7 +361,7 @@ hashSum | HASHSUM | HASHSUM | HASHSUM | HASHSUM | H.. <section anchor="ibv_operations_insert" numbered="true" toc="default"> <name>Insert Element</name> <t> - To add an element to a IBF, the element is mapped to a subset of k buckets using + To add an element to an IBF, the element is mapped to a subset of k buckets using the mapping function M as described in the <xref target="bf" format="title" /> section introducing BFs. For the buckets selected by the mapping function, the counter is increased by one and the IDSUM field is set to the XOR of the element ID and the previously stored IDSUM. Furthermore, @@ -643,24 +643,21 @@ hashSum | 0x0101 | 0x0101 | 0x5050 | 0x0000 | <section anchor="ibf_format" numbered="true" toc="default"> <name>Wire format</name> <t> - To facilitate a reasonably CPU-efficient - implementation, this specification requires the - IBF counter always to use 8 bits. - FIXME: I thought we lifted this constraint!? - Fewer bits - would result in a particularly inefficient - implementation, while more bits are rarely useful - as sets with so many elements should be - represented using a larger number of buckets. This - means the counter of this design can reach a - minimum of -127 and a maximum of 127 before the - counter reaches "infinity" (-128). + The counter size transmitted over the wire + varies between 1 and 64 bit, depending on the + maximum counter in the IBF. This variable counter + should cover most areas of application. + The bit length for the transmitted IBF + is defined in the header of the + <em><xref target="messages_ibf" format="title" /></em> message + in the "IMCS" field as unsigned 8-bit integer. + For implementation details see section <xref target="performance_counter_variable_size" format="title" />. </t> <t> For the "IDSUM", we always use a 64-bit representation. The IDSUM value MUST have sufficient entropy for the mapping function M to yield reasonably random buckets - even for very large values of L. With a 32 bit + even for very large values of L. With a 32 bit value the chance that multiple elements may be mapped to the same ID would be quite high, even for moderately large sets. Using more than 64 bits would at best make @@ -695,10 +692,10 @@ hashSum | 0x0101 | 0x0101 | 0x5050 | 0x0000 | The ID is generated as 64-bit output from a <relref section="2" target="RFC5869" displayFormat="of">HKDF construction</relref> with HMAC-SHA512 as XTR and HMAC-SHA256 as PRF and salt is set to the unsigned 64-bit equivalent of 0. The output is then truncated to 64-bit. - Its important that the elements can be redistributed over the buckets in case the IBF does not - decode. That's why the ID is salted with a random salt given in the SALT field of this message. - Salting is done by calculation the a random salt modulo 64 (using only the lowest 6-bits of the salt) - and do a bitwise right rotation of output of KDF by the 6-bit salts numeric representation. + It is important that the elements can be redistributed over the buckets in case the IBF does not + decode. That is why the ID is salted with a random salt given in the SALT field of this message. + Salting is done by calculating a random salt modulo 64 (using only the lowest 6-bits of the salt) + and doing a bitwise right rotation of the output of KDF by the 6-bit salts numeric representation. </t> <t> Representation in pseudocode: @@ -829,12 +826,16 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) a reasonable choice of L should be highly unlikely), one can retry using a different mapping function M. </t> + <t> + In addition, when decoding the IBFs in the strata estimator, it is possible to determine + on which side which part of the difference is. For this purpose, the pure buckets with + counter 1 and -1 must be distinguished and assigned to the respective side when decoding the IBFs. + </t> </section> </section> - <section anchor="modeofoperation" numbered="true" toc="default"> - <name>Mode of operation</name> + <name>Mode of Operation</name> <t> The set union protocol uses IBFs and SEs as primitives. Depending on the state of the two sets there are different strategies or operation modes how to efficiently @@ -842,23 +843,22 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) </t> <t> - The simplest mode is the "full" synchronization mode. The idea is that if the difference between the sets of the two + The simplest mode is the "full" synchronisation mode. The idea is that if the difference between the sets of the two peers exceeds a certain threshold, the overhead to determine which elements are different outweighs the overhead of sending the complete set. In this case, the most efficient method can be just to exchange the full sets. </t> <t> - <!-- TODO: Add smaller version --> <eref target="https://git.gnunet.org/lsd0003.git/plain/statemachine/full_state_machine.png">Link to statemachine diagram</eref> </t> <t> The second possibility is that the difference of the sets is small compared to the set size. - In this case, an efficient "delta" synchronization mode is more efficient. These two possibilities given, + In this case, an efficient "differential" synchronisation mode is more efficient. These two possibilities given, the first steps of the protocol are used to determine which mode MUST be used. </t> <t> - Thus, the set synchronization protocol always begins with the following operation mode independent steps. + Thus, the set synchronisation protocol always begins with the following operation mode independent steps. </t> <t> @@ -873,24 +873,23 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) </t> <section anchor="modeofoperation_full-sync" numbered="true" toc="default"> <name>Full Synchronisation Mode</name> - <t> - When the initiating peer decides to use the full synchronisation mode and the set of the initiating peer is bigger than the set of the receiving peer, the initiating + When the initiating peer decides to use the full synchronisation mode and it is better that the other peer sends his set first, the initiating peer sends a <em><xref target="messages_request_full" format="title" /></em> message, and transitions from <strong>Expecting SE</strong> to the <strong>Full Receiving</strong> state. - If the set of the initiating peer is smaller, it sends all set elements to the other peer followed by the <em><xref target="messages_full_done" format="title" /></em> message, and - transitions into the <strong>Full Sending</strong> state. + If it has been determined that it is better that the initiating peer sends his set first, the initiating peer sends a <em><xref target="messages_send_full" format="title" /></em> message followed by all + set elements in <em><xref target="messages_full_element" format="title" /></em> messages to the other peer, followed by the <em><xref target="messages_full_done" format="title" /></em> message, and transitions into the <strong>Full Sending</strong> state. </t> <t> - <!-- TODO: Add smaller version --> - <eref target="https://git.gnunet.org/lsd0003.git/plain/statemaschine/full_state_maschine.jpg">Link to statemachine diagram</eref> + <eref target="https://git.gnunet.org/lsd0003.git/plain/statemachine/state_machine_full.png">Link to statemachine diagram</eref> </t> <t><strong>The behavior of the participants the different state is described below:</strong></t> <dl> <dt><strong>Expecting IBF:</strong></dt> <dd> If a peer in the <strong>Expecting IBF</strong> state receives a <em><xref target="messages_request_full" format="title" /></em> message from the other peer, the - peer sends all the elements of its set followed by a <em><xref target="messages_full_done" format="title" /></em> message to the other peer, and transitions to the - <strong>Full Sending</strong> state. If the peer receives an <em><xref target="messages_full_element" format="title" /></em> message, it processes the element and transitions to the <strong>Full Receiving</strong> state. + peer sends all the elements of his set followed by a <em><xref target="messages_full_done" format="title" /></em> message to the other peer, and transitions to the + <strong>Full Sending</strong> state. If the peer receives an <em><xref target="messages_send_full" format="title" /></em> message followed by + <em><xref target="messages_full_element" format="title" /></em> messages, the peer processes the element and transitions to the <strong>Full Receiving</strong> state. </dd> <dt><strong>Full Sending:</strong></dt> <dd> @@ -898,20 +897,20 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) peer. As soon as a the <em><xref target="messages_full_done" format="title" /></em> message is received, the peer transitions into the <strong>Finished</strong> state. </dd> - <dt><strong>Full Receiving (In code: Expecting IBF): </strong></dt> + <dt><strong>Full Receiving: </strong></dt> <dd> While a peer is in the <strong>Full Receiving</strong> state, it expects to continuously receive elements from the other peer. As soon as a the <em><xref target="messages_full_done" format="title" /></em> message is received, it sends - the remaining elements (those it did not receive) from its set to the other + the remaining elements (those it did not receive) from his set to the other peer, followed by a <em><xref target="messages_full_done" format="title" /></em>. After sending the last message, the peer transitions into the <strong>Finished</strong> state. </dd> </dl> </section> <section anchor="modeofoperation_individual-elements" numbered="true" toc="default"> - <name>Delta Synchronisation Mode</name> + <name>Differential Synchronisation Mode</name> <t> - When the initiating peer in the <strong>Expected SE</strong> state decides to use the delta synchronisation mode, it + When the initiating peer in the <strong>Expected SE</strong> state decides to use the differential synchronisation mode, it sends a <em><xref target="messages_ibf" format="title" /></em> to the receiving peer and transitions into the <strong>Passive Decoding</strong> state. </t> <t> @@ -928,8 +927,7 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) is called the passive peer. </t> <t> - <!-- TODO: Add smaler version --> - <eref target="https://git.gnunet.org/lsd0003.git/plain/statemaschine/full_state_machine.png">Link to statemachine diagram</eref> + <eref target="https://git.gnunet.org/lsd0003.git/plain/statemachine/differential_state_machine.png">Link to statemachine diagram</eref> </t> <t><strong>The behavior of the participants the different states is described below:</strong></t> <dl> @@ -971,7 +969,7 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) </dd> <dt><em><xref target="messages_elements" format="title" /></em> message:</dt> <dd> - When a new element message has been received the peer checks if a corresponding + When a new <em><xref target="messages_elements" format="title" /></em> message has been received the peer checks if a corresponding <em><xref target="messages_demand" format="title" /></em> for the element has been sent and the demand is still unsatisfied. If the element has been demanded the peer checks the element for validity, removes it from the list @@ -1109,9 +1107,12 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) is always used. The first case is when one of the peers announces having an empty set. This is announced by setting the SETSIZE field in the <em><xref target="messages_se" format="title" /></em> to 0. - The second case is if the application requests full synchronization explicitly. + The second case is if the application requests full synchronisation explicitly. This is useful for testing and MUST NOT be used in production. </t> + <t> + <eref target="https://git.gnunet.org/lsd0003.git/plain/statemachine/full_state_machine.png">Link to statemachine diagram</eref> + </t> </section> </section> @@ -1179,7 +1180,7 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) <section anchor="messages_ibf_description" numbered="true" toc="default"> <name>Description</name> <t> - The IBF message contains a slice of the IBF. + The <xref target="messages_ibf" format="title" /> message contains a slice of the IBF. </t> <t> The <em>IBF</em> message is sent at the start of the protocol from the initiating peer in the transaction @@ -1195,7 +1196,7 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) <artwork name="" type="" align="left" alt=""><![CDATA[ 0 8 16 24 32 40 48 56 +-----+-----+-----+-----+-----+-----+-----+-----+ - | MSG SIZE | MSG TYPE | SIZE | + | MSG SIZE | MSG TYPE | IBF SIZE | +-----+-----+-----+-----+-----+-----+-----+-----+ |IMCS | OFFSET | SALT | +-----+-----+-----+-----+-----+-----+-----+-----+ @@ -1216,7 +1217,7 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) the type of SETU_P2P_REQUEST_IBF as registered in <xref target="gana" format="title" /> in network byte order. </dd> - <dt>SIZE</dt> + <dt>IBF SIZE</dt> <dd> is a 32-bit unsigned integer which signals the number of buckets in the IBF. </dd> @@ -1226,8 +1227,6 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) is required to store a single counter. This is used for the unpacking function as described in the <xref target="performance_counter_variable_size" format="title" /> section. </dd> - - <dt>OFFSET</dt> <dd> is a 32-bit unsigned integer which signals the offset to the following ibf slices in the original. @@ -1246,9 +1245,9 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) by an array of HASHSUMS and ended with an array of COUNTERS (details are described in section <xref target="performance_counter_variable_size" format="default"/>). Length of the array is defined by MIN( SIZE - OFFSET, MAX_BUCKETS_PER_MESSAGE). MAX_BUCKETS_PER_MESSAGE is defined as - 32768 divided by the BUCKET_SIZE which is 13-byte (104-bit). + 32768 divided by the BUCKET_SIZE which is 13-byte (104-bit). The minimal number of buckets in a single + IBF is 79. </t> - <t> To get the IDSUM field, all IDs hitting a bucket are added up with a binary XOR operation. See <xref target="ibf_format_id_generation" format="title" /> details about ID generation. @@ -1290,7 +1289,7 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) </section> <section anchor="messages_ibf_last" numbered="true" toc="default"> - <name>IBF</name> + <name>IBF Last</name> <section anchor="messages_ibf_last_description" numbered="true" toc="default"> <name>Description</name> @@ -1317,13 +1316,13 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) <section anchor="messages_elements_description" numbered="true" toc="default"> <name>Description</name> <t> - The Element message contains an element that is synchronized in the <xref target="modeofoperation_individual-elements" format="title" /> + The <em><xref target="messages_elements" format="title" /></em> message contains an element that is synchronized in the <xref target="modeofoperation_individual-elements" format="title" /> and transmits a full element between the peers. </t> <t> This message is sent in the state <strong>Active Decoding</strong> and <strong>Passive Decoding</strong> as answer to a <em><xref target="messages_demand" format="title" /></em> message from the remote peer. - The Element message can also be received in the <strong>Finish Closing</strong> or <strong>Finish Waiting</strong> + The <em><xref target="messages_elements" format="title" /></em> message can also be received in the <strong>Finish Closing</strong> or <strong>Finish Waiting</strong> state after receiving a <em><xref target="messages_done" format="title" /></em> message from the remote peer, in this case the peer changes to the <strong>Finished</strong> state as soon as all demands for elements have been satisfied. </t> @@ -1387,9 +1386,9 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) <section anchor="messages_offer_description" numbered="true" toc="default"> <name>Description</name> <t> - The offer message is an answer to an <em><xref target="messages_inquiry" format="title" /></em> message + The <em><xref target="messages_offer" format="title" /></em> message is an answer to an <em><xref target="messages_inquiry" format="title" /></em> message and transmits the full hash of an element that has been requested by the other peer. - This full hash enables the other peer to check if the element is really missing in its set and + This full hash enables the other peer to check if the element is really missing in his set and eventually sends a <em><xref target="messages_demand" format="title" /></em> message for that element. </t> <t> @@ -1424,7 +1423,7 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) </dd> <dt>HASH</dt> <dd> - is a SHA 512-bit hash of the element that is requested with a inquiry message. + is a SHA 512-bit hash of the element that is requested with a <em><xref target="messages_inquiry" format="title" /></em> message. </dd> </dl> </section> @@ -1437,7 +1436,7 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) <section anchor="messages_inquiry_description" numbered="true" toc="default"> <name>Description</name> <t> - The Inquiry message is exclusively sent by the active peer in <strong>Active Decoding</strong> state + The <em><xref target="messages_inquiry" format="title" /></em> message is exclusively sent by the active peer in <strong>Active Decoding</strong> state to request the full hash of an element that is missing in the active peers set. This is normally answered by the passive peer with <em><xref target="messages_offer" format="title" /></em> message. </t> @@ -1481,10 +1480,10 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) <section anchor="messages_demand_description" numbered="true" toc="default"> <name>Description</name> <t> - The demand message is sent in the <strong>Active Decoding</strong> and in the <strong>Passive Decoding</strong> + The <em><xref target="messages_demand" format="title" /></em> message is sent in the <strong>Active Decoding</strong> and in the <strong>Passive Decoding</strong> state. It is an answer to a received <em><xref target="messages_offer" format="title" /></em> message and is sent if the element described in the <em><xref target="messages_offer" format="title" /></em> message - is missing in the peers set. In the normal workflow the answer to the demand message is an + is missing in the peers set. In the normal workflow the answer to the <em><xref target="messages_demand" format="title" /></em> message is an <em><xref target="messages_elements" format="title" /></em> message. </t> <t> @@ -1527,7 +1526,7 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) <section anchor="messages_done_description" numbered="true" toc="default"> <name>Description</name> <t> - The done message is sent when all <em><xref target="messages_demand" format="title" /></em> messages + The <em><xref target="messages_done" format="title" /></em> message is sent when all <em><xref target="messages_demand" format="title" /></em> messages have been successfully satisfied and the set is complete synchronized. </t> <t> @@ -1565,11 +1564,11 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) <section anchor="messages_full_done_description" numbered="true" toc="default"> <name>Description</name> <t> - The full done message is sent in the <xref target="modeofoperation_full-sync" format="title" /> + The <em><xref target="messages_full_done" format="title" /></em> message is sent in the <xref target="modeofoperation_full-sync" format="title" /> to signal that all remaining elements of the set have been sent. The message is received and sent in the - <strong>Full Sending</strong> and in the <strong>Full Receiving</strong> state. When the full done message is received + <strong>Full Sending</strong> and in the <strong>Full Receiving</strong> state. When the <em><xref target="messages_full_done" format="title" /></em> message is received in <strong>Full Sending</strong> state the peer changes directly into <strong>Finished</strong> state. In - <strong>Full Receiving</strong> state receiving a full done message initiates the sending of + <strong>Full Receiving</strong> state receiving a <em><xref target="messages_full_done" format="title" /></em> message initiates the sending of the remaining elements that are missing in the set of the other peer. </t> </section> @@ -1603,25 +1602,27 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) <section anchor="messages_request_full_description" numbered="true" toc="default"> <name>Description</name> <t> - The request full message is sent by the initiating peer in <strong>Expect SE</strong> state to the receiving peer if + The <em><xref target="messages_request_full" format="title" /></em> message is sent by the initiating peer in <strong>Expect SE</strong> state to the receiving peer, if the operation mode "<xref target="modeofoperation_full-sync" format="title" />" is - determined as the better <xref target="modeofoperation" format="title" /> and the set size of the initiating peer is smaller - than the set size of the receiving peer. The initiating peer changes after sending the request full message into + determined to be the superior <xref target="modeofoperation" format="title" /> and that it is the better choice that + the other peer sends his elements first. The initiating peer changes after sending the <em><xref target="messages_request_full" format="title" /></em> message into <strong>Full Receiving</strong> state. </t> <t> - The receiving peer receives the Request Full message in the <strong>Expecting IBF</strong>, afterwards the receiving peer - starts sending its complete set in <xref target="messages_full_element" format="title" /> messages to the initiating peer. + The receiving peer receives the <em><xref target="messages_request_full" format="title" /></em> message in the <strong>Expecting IBF</strong>, afterwards the receiving peer + starts sending his complete set in <xref target="messages_full_element" format="title" /> messages to the initiating peer. </t> </section> <section anchor="messages_request_full_structure" numbered="true" toc="default"> <name>Structure</name> <figure anchor="figure_request_full"> <artwork name="" type="" align="left" alt=""><![CDATA[ - 0 8 16 24 32 - +-----+-----+-----+-----+ - | MSG SIZE | MSG TYPE | - +-----+-----+-----+-----+ + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | MSG SIZE | MSG TYPE | REMOTE SET DIFF | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | REMOTE SET SIZE | LOCAL SET DIFF | + +-----+-----+-----+-----+-----+-----+-----+-----+ ]]></artwork> </figure> <t>where:</t> @@ -1634,10 +1635,85 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) <dd> the type of SETU_P2P_REQUEST_FULL as registered in <xref target="gana" format="title" /> in network byte order. </dd> + <dt>REMOTE SET DIFF</dt> + <dd> + is a 32-bit unsigned integer in network byte order which represents the remote (from the perspective of the + sending peer) set difference calculated with strata estimator. + </dd> + <dt>REMOTE SET SIZE</dt> + <dd> + is a 32-bit unsigned integer in network byte order which represents the total remote + (from the perspective of the sending peer) set size. + </dd> + <dt>LOCAL SET DIFF</dt> + <dd> + is a 32-bit unsigned integer in network byte order which represents the local + (from the perspective of the sending peer) set difference calculated with strata estimator. + </dd> </dl> </section> </section> + + <section anchor="messages_send_full" numbered="true" toc="default"> + <name>Send Full</name> + + <section anchor="messages_send_full_description" numbered="true" toc="default"> + <name>Description</name> + <t> + The <em><xref target="messages_send_full" format="title" /></em> message is sent by the initiating peer in <strong>Expect SE</strong> state to the receiving peer if + the operation mode "<xref target="modeofoperation_full-sync" format="title" />" is + determined as superior <xref target="modeofoperation" format="title" /> and that it is the better choice that the + peer sends his elements first. The initiating peer changes after sending the <em><xref target="messages_request_full" format="title" /></em> message into + <strong>Full Sending</strong> state. + </t> + <t> + The receiving peer receives the <em><xref target="messages_send_full" format="title" /></em> message in the <strong>Expecting IBF</strong> state, afterwards the receiving peer + changes into <strong>Full Receiving</strong> state and expects to receive the set of the remote peer. + </t> + </section> + <section anchor="messages_send_full_structure" numbered="true" toc="default"> + <name>Structure</name> + <figure anchor="figure_send_full"> + <artwork name="" type="" align="left" alt=""><![CDATA[ + 0 8 16 24 32 40 48 56 + +-----+-----+-----+-----+-----+-----+-----+-----+ + | MSG SIZE | MSG TYPE | REMOTE SET DIFF | + +-----+-----+-----+-----+-----+-----+-----+-----+ + | REMOTE SET SIZE | LOCAL SET DIFF | + +-----+-----+-----+-----+-----+-----+-----+-----+ + ]]></artwork> + </figure> + <t>where:</t> + <dl> + <dt>MSG SIZE</dt> + <dd> + is a 16-bit unsigned integer in network byte order which describes the message size in bytes and header included. + </dd> + <dt>MSG TYPE</dt> + <dd> + the type of SETU_P2P_REQUEST_FULL as registered in <xref target="gana" format="title" /> in network byte order. + </dd> + <dt>REMOTE SET DIFF</dt> + <dd> + is a 32-bit unsigned integer in network byte order which represents the remote (from the perspective of the sending peer) + set difference calculated with strata estimator. + </dd> + <dt>REMOTE SET SIZE</dt> + <dd> + is a 32-bit unsigned integer in network byte order which represents the total remote (from the perspective + of the sending peer) set size. + </dd> + <dt>LOCAL SET DIFF</dt> + <dd> + is a 32-bit unsigned integer in network byte order which represents the local (from the perspective of the sending peer) + set difference calculated with strata estimator. + </dd> + </dl> + </section> + </section> + + <section anchor="messages_se" numbered="true" toc="default"> <name>Strata Estimator</name> @@ -1652,9 +1728,16 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) </t> <t> When the initiating peer receives the strata estimator the peer decides which <xref target="modeofoperation" format="title" /> to use - for the synchronization. Depending on the size of the set difference and the <xref target="modeofoperation" format="title" /> the initiating peer + for the synchronisation. Depending on the size of the set difference and the <xref target="modeofoperation" format="title" /> the initiating peer changes into <strong>Full Sending</strong>, <strong>Full Receiving</strong> or <strong>Passive Decoding</strong> state. </t> + <t> + The <em><xref target="messages_se" format="title" /></em> message can contain one, two, four or eight strata estimators with different salts, depending on the initial size of the sets. + More details can be found in section <xref target="performance_multi_se" format="title" />. + </t> + <t> + The IBFs in a strata estimator always have 79 buckets. The reason why can be found in Summermatter's work. <xref target="byzantine_fault_tolerant_set_reconciliation" format="default"/> + </t> </section> <section anchor="messages_se_structure" numbered="true" toc="default"> <name>Structure</name> @@ -1662,7 +1745,7 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) <artwork name="" type="" align="left" alt=""><![CDATA[ 0 8 16 24 32 40 48 56 +-----+-----+-----+-----+-----+-----+-----+-----+ - | MSG SIZE | MSG TYPE | SETSIZE + | MSG SIZE | MSG TYPE | SEC | SETSIZE +-----+-----+-----+-----+-----+-----+-----+-----+ SETSIZE | SE-SLICES +-----+-----+-----+-----+ @@ -1680,13 +1763,19 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) <dd> the type of SETU_P2P_SE as registered in <xref target="gana" format="title" /> in network byte order. </dd> + <dt>SEC</dt> + <dd> + is a 8-bit unsigned integer in network byte order which indicates how many strata estimators + with different salts are attached to the message. Valid values are 1,2,4 or 8, more details can be found + in the section <xref target="performance_multi_se" format="title" />. + </dd> <dt>SETSIZE</dt> <dd> is a 64-bit unsigned integer that is defined by the size of the set the SE is </dd> <dt>SE-SLICES</dt> <dd> - is variable in size and contains the same structure as the IBF-SLICES field in the IBF message. + is variable in size and contains the same structure as the IBF-SLICES field in the <xref target="messages_ibf" format="title" /> message. </dd> </dl> </section> @@ -1715,17 +1804,17 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) <section anchor="messages_full_element_description" numbered="true" toc="default"> <name>Description</name> <t> - The full element message is the equivalent of the <xref target="messages_elements" format="title" /> message in + The <em><xref target="messages_full_element" format="title" /></em> message is the equivalent of the <xref target="messages_elements" format="title" /> message in the <xref target="modeofoperation_full-sync" format="title" />. It contains a complete element that is missing in the set of the peer that receives this message. </t> <t> - The full element message is exclusively sent in the transitions <strong>Expecting IBF</strong> -> <strong>Full Receiving</strong> and + The <em><xref target="messages_full_element" format="title" /></em> message is exclusively sent in the transitions <strong>Expecting IBF</strong> -> <strong>Full Receiving</strong> and <strong>Full Receiving</strong> -> <strong>Finished</strong>. The message is only received in the <strong> Full Sending</strong> and <strong>Full Receiving</strong> state. </t> <t> - After the last full element message has been sent the <xref target="messages_full_done" format="title" /> message + After the last <em><xref target="messages_full_element" format="title" /></em> message has been sent the <em><xref target="messages_full_done" format="title" /></em> message is sent to conclude the full synchronisation of the element sending peer. </t> </section> @@ -1780,7 +1869,6 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) </section> </section> -<!-- CORRECT --> <section anchor="performance" numbered="true" toc="default"> <name>Performance Considerations</name> <section anchor="performance_formulas" numbered="true" toc="default"> @@ -1788,31 +1876,31 @@ FUNCTION get_bucket_id (key, number_of_buckets_per_element, ibf_size) <section anchor="performance_formulas_operationmode" numbered="true" toc="default"> <name>Operation Mode</name> <t> - The decision which mode of operations is used is described by the following code. The function is complex - and more detailed explanations can be found in the accompanying thesis.<xref target="byzantine_fault_tolerant_set_reconciliation" format="default"/> + The decision which <xref target="modeofoperation" format="title"/> is used is described by the following code. The function is complex. + More detailed explanations can be found in the accompanying thesis.<xref target="byzantine_fault_tolerant_set_reconciliation" format="default"/> </t> <t> - The function takes as input the avg element size, the local setsize, the remote setsize, the - by the strata estimator calculated difference for local and remote set, + The function takes as input the average element size, the local setsize, the remote setsize, the + by the strata estimator calculated difference for local and remote set and the bandwith/roundtrips tradeoff. - The function returns the exact mode of operation as output: FULL_SYNC_REMOTE_SENDING_FIRST - if it is optimal that the other peer transmits its elements first, FULL_SYNC_LOCAL_SENDING_FIRST + The function returns the exact <xref target="modeofoperation" format="title"/> as output: FULL_SYNC_REMOTE_SENDING_FIRST + if it is optimal that the other peer transmits his elements first, FULL_SYNC_LOCAL_SENDING_FIRST if it is optimal that the elements are transmitted to the other peer directly and DIFFERENTIAL_SYNC if the differential synchronisation is optimal. </t> <t> The constant IBF_BUCKET_NUMBER_FACTOR is always 3 and IBF_MIN_SIZE is 37. The method for deriving - this can be found in Elias Summermatter's Thesis. <xref target="byzantine_fault_tolerant_set_reconciliation" format="default"/> + this can be found in Summermatter's work. <xref target="byzantine_fault_tolerant_set_reconciliation" format="default"/> </t> <figure anchor="performance_formulas_operationmode_code"> <artwork name="" type="" align="left" alt=""><![CDATA[ # CONSTANTS: # IBF_BUCKET_NUMBER_FACTOR = 2: The amount the IBF gets increased if decoding fails -# RTT_MIN_FULL = 2: Minimal Round Trips used for full sync (always 2 or 2.5) +# RTT_MIN_FULL = 2: Minimal round trips used for full syncronisation (always 2 or 2.5) # IBF_MIN_SIZE = 37: The minimal size of an IBF # MAX_BUCKETS_PER_MESSAGE: Custom value depending on the underlying protocol # INPUTS: -# avg_element_size: The avg element size +# avg_element_size: The average element size # local_set_size: The initial local setsize # remote_set_size: The remote setsize # est_local_set_diff: the estimated local set difference calculated by the strata estimator @@ -1898,7 +1986,7 @@ FUNCTION decide_operation_mode(avg_element_size, <section anchor="performance_formula_ibf_parameters" numbered="true" toc="default"> <name>IBF Size</name> <t> - The in this section described functions calculate the initial size (initial_ibf_size) optimal size + The functions, described in this section, calculate the initial size (initial_ibf_size) optimal size and in case of decoding failure the next bigger IBF size (get_next_ibf_size). </t> <t> @@ -1943,25 +2031,24 @@ FUNCTION END </t> </section> </section> - <!-- CORRECT --> <section anchor="performance_counter_variable_size" numbered="true" toc="default"> - <name>Counter variable size</name> + <name>Variable Counter Size</name> <t> Since the optimal number of bytes a counter in the IBF contains is very variable and varies due to different parameters. Details are described in the BSC thesis - by Elias Summermatter, BFH 2021<xref target="byzantine_fault_tolerant_set_reconciliation" format="default"/>. + by Summermatter <xref target="byzantine_fault_tolerant_set_reconciliation" format="default"/>. Therefore a compression algorithm has been implemented, which always creates the IBF counter in optimal size. and thus minimizes the bandwidth needed to transmit the IBF. </t> <t> A simple algorithm is used for the compression. In a first step it is determined, which is the largest counter - and how many bits are needed to store it. In a second step for every counter of every bucket the counter + and how many bits are needed to store it. In a second step for every counter of every bucket, the counter is stored in the bits determined in the first step and these are concatenated. </t> <t> - Three individual functions are used for this purpose. The first one is a function that iterates over each bucket of the - bucket of the IBF to get the maximum counter in the IBF. As second it needs - a function that compresses the counter of the IBF and thirdly a function that decompresses the IBF. + Three individual functions are used for this purpose. The first one is a function that iterates over each bucket of + the IBF to get the maximum counter in the IBF. As second it needs + a function that compresses the counter of the IBF and thirdly a function that decompresses the counter. </t> <figure anchor="performance_counter_variable_size_code"> <artwork name="" type="" align="left" alt=""><![CDATA[ @@ -1969,7 +2056,7 @@ FUNCTION END # INPUTS: # ibf: The IBF # OUTPUTS: -# returns: minimal amount of bytes required to store the counter +# returns: Minimal amount of bytes required to store the counter FUNCTION ibf_get_max_counter(ibf) max_counter=0 @@ -1982,9 +2069,9 @@ FUNCTION ibf_get_max_counter(ibf) # INPUTS: # ibf: The IBF # offset: The offset which defines the starting point from which bucket the compress operation starts -# count: The number of buckets to in the array that will be compressed +# count: The number of buckets in the array that will be compressed # OUTPUTS: -# returns: An byte array of compressed counters to send over the network +# returns: A byte array of compressed counters to send over the network FUNCTION pack_counter(ibf, offset, count) counter_bytes = ibf_get_max_counter(ibf) @@ -2037,7 +2124,7 @@ FUNCTION pack_counter(ibf, offset, count) # INPUTS: # ibf: The IBF # offset: The offset which defines the starting point from which bucket the compress operation starts -# count: The number of buckets to in the array that will be compressed +# count: The number of buckets in the array that will be compressed # counter_bit_length: The bit length of the counter can be found in the ibf message in the ibf_counter_bit_length field # packed_data: A byte array which contains the data packed with the pack_counter function # OUTPUTS: @@ -2091,6 +2178,54 @@ FUNCTION unpack_counter(ibf, offset, count, counter_bit_length, packed_data) ]]></artwork> </figure> </section> + <section anchor="performance_multi_se" numbered="true" toc="default"> + <name>Multi Strata Estimators</name> + <t> + In order to improve the precision of the estimates, not only one strata estimator + is transmitted for larger sets. One, two, four or eight strata estimators can be + transferred. Transmitting multiple strata estimators has the disadvantage that + additional bandwidth will be used, so despite the higher precision, it is not + always optimal to transmit eight strata estimators. Therefore, the following + rules are used, which are based on the average element size multiplied by the number + of elements in the set. This value is denoted as "b" in the table: + </t> + <dl> + <dt>SEs</dt> + <dd>Rule</dd> + <dt>1</dt> + <dd>b &lt; 68kb</dd> + <dt>2</dt> + <dd>b &gt; 68kb</dd> + <dt>4</dt> + <dd>b &gt; 269kb</dd> + <dt>8</dt> + <dd>b &gt; 1'077kb</dd> + </dl> + <t> + When creating multiple strata estimators, it is important to salt the keys for the IBFs in the strata + estimators differently, using the following bit rotation based salting method: + </t> + <figure anchor="performance_multi_se_salting_code"> + <artwork name="" type="" align="left" alt=""><![CDATA[ + +# Inputs: +# value: Input value to salt (needs to be 64 bit unsigned) +# salt: Salt to salt value with; Should always be ascending and start at zero + i.e. SE1 = Salt 0; SE2 = Salt 1 etc. +# Output: +# Returns: Salted value + +FUNCTION se_key_salting(value, salt) + s=(salt * 7) % 64 + return (value >> s) | (value << (64 - s)) + + ]]></artwork> + </figure> + <t> + Performance study and details about the reasoning for the used methods can be found in the work of Summermatter. + <xref target="byzantine_fault_tolerant_set_reconciliation" format="default"/> + </t> + </section> </section> @@ -2128,118 +2263,355 @@ FUNCTION unpack_counter(ibf, offset, count, counter_bit_length, packed_data) It is important to close and purge connections after a given timeout to prevent draining attacks. </t> - <section anchor="security_generic_functions" numbered="true" toc="default"> - <name>Generic functions</name> + <name>General Security Check</name> <t> - Some functions are used in most of the messages described in the State - section. + In this section general checks are described which should be applied to multiple states. </t> - <section anchor="security_generic_functions_missing_message" numbered="true" toc="default"> - <name>Duplicated or Missing Message detection</name> + + <section anchor="security_generic_functions_check_byzantine_boundaries" numbered="true" toc="default"> + <name>Byzantine Boundaries</name> <t> - Most of the messages received need to be checked that they are not - received multiple times. This is solved with a global store (message) - and the following code + To restrict an attacker there should be an upper and lower bound defined and check + at the beginning of the protocol, based + on prior knowledge, for the number of elements. + The lower byzantine bound can be, for example, the number of elements the + other peer had in his set at the last contact. + The upper byzantine bound can be a practical maximum e.g. the number + of e-voting votes, in Switzerland. </t> <figure anchor="security_generic_functions_missing_message_code"> <artwork name="" type="" align="left" alt=""><![CDATA[ +# Input: +# rec: Number of elements in remote set +# rsd: Number of elements differ in remote set +# lec: Number of elements in local set +# lsd: Number of elements differ in local set +# UPPER_BOUND: Given byzantine upper bound +# LOWER_BOUND: Given byzantine lower bound +# Output: +# returns TRUE if parameters in byzantine bounds otherwise returns FALSE +FUNCTION check_byzantine_bounds (rec,rsd,lec,lsd) + IF (rec + rsd > UPPER_BOUND) + RETURN FALSE + IF END + IF (lec + lsd > UPPER_BOUND) + RETURN FALSE + IF END + IF (rec < LOWER_BOUND) + RETURN FALSE + IF END + RETURN TRUE +FUNCTION END + ]]></artwork> + </figure> + <t> + For the byzantine upper bound checks to function flawlessly, it needs to be ensured that the estimates of the set size + difference added together never exceed the set byzantine upper bound. This could for example happen + if the strata estimator overestimates the set difference. + </t> + </section> -# Initially creates message store -# OUTPUTS: -# returns: Store -FUNCTION createStore() - store = {} - return store + <section anchor="security_generic_functions_check_valid_state" numbered="true" toc="default"> + <name>Valid State</name> + <t> + To harden the protocol against attacks, controls were introduced in the improved + implementation that check for each message whether the message was received + in the correct state. This is central so that an attacker finds as little attack + surface as possible and makes it more difficult for the attacker to send the + protocol into an endless loop, for example. + </t> + <t> + The following function is executed every time a message is processed. + The array allowed_state, which contains a list of allowed messages for + the current state of the application. + </t> + <figure anchor="security_generic_functions_check_valid_state_code"> + <artwork name="" type="" align="left" alt=""><![CDATA[ +# Input: +# allowed_states: A array containing all states in which the message can be received +# state: The state in which the protocol is in +# Output: +# Returns TRUE if message is valid in state and FALSE if not + +FUNCTION check_valid_state (allowed_states, state) + FOR (allowed_state in allowed_states) + IF (allowed_state == state) + RETURN TRUE + END IF + FOR END + RETURN FALSE +FUNCTION END + ]]></artwork> + </figure> + </section> + <section anchor="security_generic_functions_mfc" numbered="true" toc="default"> + <name>Message Flow Control</name> + <t> + For most messages received and sent there needs be a check in place that checks + that a message is not received multiple times. This is solved with a global store (message) + and the following code + </t> + <t> + The sequence in which messages are received and sent is arranged in a chain. + The messages are dependent on each other. There are dependencies that are + mandatory, e.g. for a sent "Demand" message, an "Element" message must + always be received. But there are also messages for which a response is + not mandatory, e.g. the "Inquiry" message is only followed by an + "Offer" message, if the corresponding element is in the set. Due to this + fact, checks can be installed to verify compliance with the following chain. + </t> + <figure anchor="security_generic_functions_mfc_chain"> + <artwork name="" type="" align="left" alt=""><![CDATA[ +Chain for elements +---------+ +---------+ +---------+ +---------+ +NOT in IBF decoding | INQUIRY | ---> | OFFER | ===> | DEMAND | ===> | ELEMENT | +peers set +---------+ +---------+ +---------+ +---------+ -# Returns adds a message to the store -# INPUTS: -# store: store to add key to -# key: unique key to add -# OUTPUTS: -# returns: Returns true if element could be added to store. -# Returns false if element could not be added to store. -FUNCTION addMessageToStore(store, key) - IF store.get(key) != NULL - return FALSE - store.set(key) = 1 - return TRUE - -# Check if hash is in store -# INPUTS: -# store: Store to search -# key: Unique key to add -# OUTPUTS: -# returns: Returns true if key is in store -# Returns false if key is not in store -FUNCTION markElementAsReceived(store, key) - IF store.get(key) != NULL || store.get(key) != 1 - return FALSE - store.update(key, 0) - return TRUE - -# Check if all elements added to store are also received -# INPUTS: -# store: Store to check for completion -# OUTPUTS: -# returns: Returns true if key all messages added are received -# Returns false if one or more messages are not received -FUNCTION isStoreComplete(store) - FOR elements in store - IF elements.value != 0: - return FALSE - ENDIF - ENDFOR - return TRUE - -# Returns the number of message received -# INPUTS: -# store: Store to count -# OUTPUTS: -# returns: Returns true if key all messages added are received -# Returns false if one or more messages are not received -FUNCTION getNumberOfMessage(store) - return store.size() +Chain for elements +---------+ +---------+ +---------+ +in IBF decoding | OFFER | ---> | DEMAND | ===> | ELEMENT | +peers set +---------+ +---------+ +---------+ + --->: Answer not mandatory + ===>: Always answer needed. ]]></artwork> </figure> + <t> + A possible implementation of the check in pseudocode could look as follows: + </t> + <figure anchor="security_generic_functions_mfc_code"> + <artwork name="" type="" align="left" alt=""><![CDATA[ +# ValidStates: +# The following message states are used to track the message flow. +# - NOT_INITIALIZED: Fresh initialized value +# - SENT: Element has been sent +# - EXPECTED: Element is expected +# - RECEIVED: Element is received + +# Function to initialize new store +# Output: +# Returns empty store +FUNCTION initialize_store() + RETURN {} +FUNCTION END + +# Function to initialize a store element +# Output: +# Returns an empty element for the store +FUNCTION initialize_element() + RETURN { + INQUIRY: NOT_INITIALIZED, + OFFER: NOT_INITIALIZED, + DEMAND: NOT_INITIALIZED, + ELEMENT: NOT_INITIALIZED + } +FUNCTION END + +# Function called every time a new message is transmitted to other peer +# Input: +# store: Store created by the initialize_store() function +# message_type: The message that was sent type e.g. INQUIRY or DEMAND +# hash: The hash of the element which is sent +# Output: +# Returns TRUE if the message flow was followed, otherwise FALSE +FUNCTION send(store, message_type, hash) + + IF NOT store.contains(hash) + store_element = initialize_element() + ELSE + store_element = store.get(hash) + END IF + + CASE based on message_type + CASE INQUIRY + IF store_element.INQUIRY == NOT_INITIALIZED + store_element.INQUIRY = SENT + ELSE + RETURN FALSE + END IF + CASE OFFER + IF store_element.OFFER == NOT_INITIALIZED + store_element.OFFER = SENT + store_element.DEMAND = EXPECTED + ELSE + RETURN FALSE + END IF + CASE DEMAND + IF store_element.DEMAND == NOT_INITIALIZED AND + (store_element.INQUIRY == SENT OR + store_element.INQUIRY == NOT_INITIALIZED) + store_element.DEMAND = SENT + store_element.ELEMENT = EXPECTED + ELSE + RETURN FALSE + END IF + CASE ELEMENT + IF store_element.ELEMENT == NOT_INITIALIZED AND + store_element.OFFER == SENT + store_element.ELEMENT = SENT + ELSE + RETURN FALSE + END IF + DEFAULT + RETURN FALSE + CASE END + store.put(hash,store_element) + RETURN TRUE +FUNCTION END + +# Function called every time a new message is received from the other peer +# Input: +# store: Store created by the initialize_store() function +# message_type: The message that was received type e.g. INQUIRY or DEMAND +# hash: The hash of the element which is received +# Output: +# Returns TRUE if the message flow was followed, otherwise FALSE +FUNCTION receive (store, message_type, hash) + IF NOT store.contains(hash) + store_element = initialize_element() + ELSE + store_element = store.get(hash) + END IF + + CASE based on message_type + CASE INQUIRY + IF store_element.INQUIRY == NOT_INITIALIZED + store_element.INQUIRY = RECEIVED + ELSE + RETURN FALSE + END IF + CASE OFFER + IF store_element.OFFER == NOT_INITIALIZED + store_element.OFFER = RECEIVED + ELSE + RETURN FALSE + END IF + CASE DEMAND + IF store_element.DEMAND == EXPECTED AND + store_element.OFFER == SENT + store_element.DEMAND = RECEIVED + ELSE + RETURN FALSE + END IF + CASE ELEMENT + IF store_element.ELEMENT == EXPECTED AND + store_element.DEMAND == SENT + store_element.ELEMENT = RECEIVED + ELSE + RETURN FALSE + END IF + DEFAULT + RETURN FALSE + CASE END + store.put(hash,store_element) + RETURN TRUE +FUNCTION END + +# Function called when the union operation is finished to ensure that all demands have +# been fulfilled +# Input: +# store: Store created by the initialize_store() function +# Output: +# Returns TRUE if all demands have been fulfilled otherwise FALSE +FUNCTION check_if_synchronisation_is_complete(store): + FOR element in store.getAll() + IF element.ELEMENT == EXPECTED OR + element.DEMAND == EXPECTED + RETURN FALSE + IF END + FOR END + RETURN TRUE +FUNCTION END + + ]]></artwork> + </figure> + <t> + This is based on the work of Summermatter. More details can be found in his thesis <xref target="byzantine_fault_tolerant_set_reconciliation" format="default"/>. + </t> </section> - <section anchor="security_generic_functions_element_nr" numbered="true" toc="default"> - <name>Store Remote Peers Element Number</name> - <t> - To prevent an other peer from requesting the same set multiple times, - it is important to memorize the number of elements a peer had in previous - reconciliation sessions. - </t> - <figure anchor="security_generic_functions_element_nr_code"> - <artwork name="" type="" align="left" alt=""><![CDATA[ -# Get the number of elements from previous sync -# INPUTS: -# client_id: A unique id that identifies the client -# OUTPUTS: -# returns: The number of elements from last sync -FUNCTION number_elements_last_sync(client_id) - IF number_store.get(clientID) - return number_store.get(client_id) - ENDIF - return 0 + <section anchor="security_generic_functions_active_passive_switches" numbered="true" toc="default"> + <name>Limit Active/Passive Decoding changes</name> + <t> + The limitation of the maximum allowed active/passive changes during differential synchronisation is key + to security. By limiting the maximum rounds in differential synchronisation an attacker can not waste + unlimited amount of resources by just pretending an IBF does not decode. + </t> + <t> + The question after how many active/passive switches it can be assumed that the other peer is not honest, + depends on many factors and can only be solved probabilistically. In the work of Summermatter <xref target="byzantine_fault_tolerant_set_reconciliation" format="default"/> + this is described in detail. From this work it is concluded that the probability of decoding failure is about + 15% for each round. The probability that there will be n active/passive changes is given by 0.15^{round number}. + Which means that after about 30 active/passive switches it can be said with a certainty of 2^80 that one of the peers + is not following the protocol. It is reasonable that a maximum of 30 active/passive changes should be set. + </t> + </section> -# Updates the stored remote -# INPUTS: -# client_id: A unique id that identifies the client -# remote_setsize: The set size of the remote peer -# OUTPUTS: -# returns: The number of elements from last sync -FUNCTION save_number_of_elements_last_sync(client_id, remote_setsize) - number_store.update(clientID, remote_setsize) - ]]></artwork> - </figure> - </section> - </section> + <section anchor="security_generic_functions_full_plausibility_check" numbered="true" toc="default"> + <name>Full Synchronisation Plausibility Check</name> + <t> + An attacker can try to use up a peer's bandwidth by pretending that the peer + needs full synchronisation, even if the set difference is very small and the attacker + only has a few (or even zero) elements that are not already synchronised. + In such a case, it would be ideal, if the plausibility could already be checked + during full synchronisation as to whether the other peer was honest or not with + regard to the estimation of the set size difference and thus the choice of mode + of operation. + </t> + <t> + In order to calculate this plausibility, in Summmermatters paper <xref target="byzantine_fault_tolerant_set_reconciliation" format="default"/> + a formula was developed, which depicts the probability with which one + can calculate the corresponding plausibility based on the number of + new and repeated elements after each received element. + </t> + <t> + Besides this approach from probability theory, there is an additional check + that can be made. After the entire set has been transferred to the other peer, + no known elements may be returned by the second peer, since the second peer + should only return the elements that are missing from the initial peer's set. + </t> + <t> + This two approaches are implemented in the following pseudocode: + </t> + + <figure anchor="security_generic_functions_full_plausibility_check_code"> + <artwork name="" type="" align="left" alt=""><![CDATA[ +# Input: +# SECURITY_LEVEL: The security level used e.g. 2^80 +# state: The statemachine state +# rs: Estimated remote set difference +# lis: Number of elements in set +# rd: Number of duplicated elements received +# rf: Number of fresh elements received +# Output: +# Returns TRUE if full syncronisation is plausible and FALSE otherwise + +FUNCTION full_sync_plausibility_check (state,rs,lis,rd,rf) + security_level_lb = 1 / SECURITY_LEVEL + IF (FULL_SENDING == state) + IF (rd > 0) + RETURN FALSE + IF END + IF END + IF (FULL_RECEIVING == state) + IF (0 <= rs) + rs = 1 + IF END + base = (1 - ( rs / (lis + rs))) + exponent = (rd - (rf * (lis/rs))) + value = POWER(base, exponent) + IF ((value < security_level_lb) || (value > SECURITY_LEVEL) + RETURN FALSE + IF END + IF END + RETURN TRUE +FUNCTION END + ]]></artwork> + </figure> + </section> + </section> <section anchor="security_states" numbered="true" toc="default"> <name>States</name> @@ -2257,209 +2629,28 @@ FUNCTION save_number_of_elements_last_sync(client_id, remote_setsize) <dt><xref target="messages_request_full" format="title" /></dt> <dd> <t> - It needs to be checked that the full synchronisation is - plausible according to the formula deciding which operation mode - is applicable. This is achieved by calculating the upper and lower - boundaries of the number of elements in the other peers set. - The lower boundary of number of elements can be easily - memorized as result from the last synchronisation and the upper - boundary can be estimated with prior knowledge of the maximal - plausible increase of elements since the last reconciliation and - the maximal plausible number of elements. + It needs to be checked that the full synchronisation mode with receiving peer + sending first, is plausible according to the algorithm deciding which operation mode + is applicable as described in <xref target="performance_formulas_operationmode" format="default"/>. </t> - <figure anchor="security_states_expecting_ibf_request_full_code"> - <artwork name="" type="" align="left" alt=""><![CDATA[ -# INPUTS: -# client_id: Unique remote peer id -# remote_setsize: The remote setsize -# local_setsize: The local setsize -# initial_local_size: The initial local setsize -# set_diff: The set difference calculated with the strata estimator -# OUTPUTS: -# returns: Boolean as indicator if message is valid -FUNCTION validate_messages_request_full(client_id, remote_setsize, local_setsize, initial_local_size, set_diff) - - last_setsize = getNumberOfElementsLastSync(clientId) - IF remote_setsize > last_setsize - return FALSE - ENDIF - - # Update number of elements in store - save_number_of_elements_last_sync(client_id, remote_setsize) - - # Check for max plausible set size as defined on use case basis (can be infinite) - plausible_setsize = getMaxPlausibleSetSize() - IF remote_setsize > plausible_setsize - return FALSE - ENDIF - - # Check for correct operation mode operation_mode function is described in performance section - IF decide_operation_mode(initial_local_size, remote_setsize, set_diff) != "FULL" - return FALSE - ENDIF - - # Check that the other peer is honest and we should send our set - IF decide_full_sending(local_size, initial_remote_setsize ) != "LOCAL" - return FALSE - ENDIF - return TRUE - ]]></artwork> - </figure> </dd> <dt><xref target="messages_ibf" format="title" /></dt> <dd> <t> - It is important to define a threshold to limit - the maximal number of IBFs that are expected from the other peer. - This maximal plausible size can be calculated with the known inputs: - number of elements in the local set and the predefined applications upper - limit, as described in the <xref target="performance" format="title" /> section. - That the other peer chooses the correct mode of operation MUST - be checked as described in the section above. + It needs to be checked that the differential synchronisation mode is plausible according + to the algorithm deciding which operation mode + is applicable as described in <xref target="performance_formulas_operationmode" format="default"/>. </t> - <figure anchor="security_states_expecting_ibf_message_ibf_code"> - <artwork name="" type="" align="left" alt=""><![CDATA[ -# INPUTS: -# remote_setsize: The remote setsize -# local_setsize: The local setsize -# initial_local_size: The initial local setsize -# set_diff: The set difference calculated with the strata estimator -# ibf_msg: received ibf message -# OUTPUTS: -# returns: Boolean as indicator if message is valid -FUNCTION validate_messages_ibf(remote_setsize, local_setsize, initial_local_size, set_diff, ibf_msg) - IF is_undefined(number_buckets_left) - number_buckets_left = get_bucket_number(remote_setsize, local_setsize, initial_local_size, set_diff, ibf_msg) - ENDIF - number_buckets_left -- - IF number_buckets_left < 0 - return FALSE - return TRUE -# Security check executed when first ibf message is received -# INPUTS: -# remote_setsize: The remote setsize -# local_setsize: The local setsize -# initial_local_size: The initial local setsize -# set_diff: The set difference calculated with the strata estimator -# ibf_msg: received ibf message -# OUTPUTS: -# returns: Boolean as indicator if message is valid -FUNCTION get_bucket_number(remote_setsize, local_setsize, initial_local_size, set_diff, ibf_msg) - - # Check for max plausible set size as defined on use case basis (can be infinite) - max_plausible_setsize = getMaxPlausibleSetSize() - IF remote_setsize > max_plausible_setsize - return 0 - ENDIF - - # Check for correct operation mode operation_mode function is described in performance section - IF decide_operation_mode(initial_local_size, remote_setsize, set_diff) != "DIFFERENTIAL" - return 0 - ENDIF - - ibf_params = calculate_optimal_IBF_params(local_setsize) - total_number_of_buckets = ibf_params[0] - number_of_bucket_per_element = ibf_params[0] - IF ( 2^(ibf.order) != total_number_of_buckets ) || - (ibf.number_of_bucket_per_element != number_of_bucket_per_element) - return 0 - - return total_number_of_buckets - ]]></artwork> - </figure> </dd> - <dt><xref target="messages_full_element" format="title" /></dt> + <dt><xref target="messages_send_full" format="title" /></dt> <dd> <t> - If a full element is received, the set of the other peer - is smaller than the set of the peer in the <strong>Expecting IBF</strong> - state and the set difference is smaller than threshold for - full synchronisation as described in the <xref target="performance" format="title" /> section. - This can be verified by calculating the plausible upper and lower boundaries - of the number of elements in the other peers set as described in - the first section. + It needs to be checked that the full synchronisation mode with initiating peer + sending first is plausible according to the algorithm deciding which operation mode + is applicable as described in <xref target="performance_formulas_operationmode" format="default"/>. </t> - <figure anchor="security_states_expecting_ibf_full_element_code"> - <artwork name="" type="" align="left" alt=""><![CDATA[ -# Security check executed when first ibf message is received -# INPUTS: -# client_id: Unique remote peer id -# remote_setsize: The remote setsize -# local_setsize: The local setsize -# initial_local_size: The initial local setsize -# set_diff: The set difference calculated with the strata estimator -# full_element_msg: received full element message -# OUTPUTS: -# returns: Boolean as indicator if message is valid -FUNCTION validate_messages_full_element(client_id, remote_setsize, - local_setsize, initial_local_size, set_diff, full_element_msg) - - # On first run create store and make initial checks - IF is_undefined(store) - full_element_msg_store = createStore() - IF ! validate_messages_full_element_init(client_id, remote_setsize, - local_setsize, initial_local_size, set_diff) - return FALSE - ENDIF - ENDIF - - # Prevent duplication of received message - IF ! addMessageToStore(full_element_msg_store, full_element_msg.unique_id) - return FALSE - ENDIF - - # Prevent to receive more elements than the remote peer has - number_received_messages = getNumberOfMessage(full_element_msg_store) - IF ( number_received_messages > remote_setsize ) - return FALSE - ENDIF - - return TRUE - - -# INPUTS: -# client_id: The initial local setsize -# remote_setsize: The remote setsize -# local_setsize: The local setsize -# initial_local_size: The initial local setsize -# set_diff: the set difference calculated by the strata estimator -# OUTPUTS: -# returns: Boolean as indicator if message is valid -FUNCTION validate_messages_full_element_init(client_id, remote_setsize, - local_setsize, initial_local_size, set_diff) - - last_setsize = getNumberOfElementsLastSync(clientId) - IF remote_setsize < last_setsize - return FALSE - ENDIF - - # Update number of elements in store - save_number_of_elements_last_sync(client_id, remote_setsize) - - # Check for max plausible set size as defined - # on use case basis (can be infinite) - plausible_setsize = getMaxPlausibleSetSize() - IF remote_setsize > plausible_setsize - return FALSE - ENDIF - - # Check for correct operation mode operation_mode - # function is described in performance section - IF decide_operation_mode(initial_local_size, remote_setsize, set_diff) != "FULL" - return FALSE - ENDIF - - # Check that the other peer is honest and he should send us his set - IF decide_full_sending(local_size, initial_remote_setsize ) != "REMOTE" - return FALSE - ENDIF - - return TRUE - - ]]></artwork> - </figure> </dd> </dl> </section> @@ -2471,50 +2662,21 @@ FUNCTION validate_messages_full_element_init(client_id, remote_setsize, <dt><xref target="messages_full_element" format="title" /></dt> <dd> <t> - When receiving full elements there needs to be checked, that every - element is a valid element, no element has been received more than once and - not more or less elements are received, as the other peer has committed - to in the beginning of the operation. Detail pseudocode implementation - can be found in <xref target="security_states_expecting_ibf" format="title" />. + When receiving full elements there needs to be checked, that every + element is a valid element, that no element has been received more than once and + not more or less elements are received, as the other peer has committed + to in the beginning of the operation. The plausibility should also be checked + with an algorithm as described in <xref target="security_generic_functions_full_plausibility_check" format="default"/>. </t> </dd> <dt><xref target="messages_full_done" format="title" /></dt> <dd> <t> - When receiving the full done message it is important to check that + When receiving the <em><xref target="messages_full_done" format="title" /></em> message, it is important to check that not less elements are received as the other peer has committed to send. If the sets differ, a resynchronisation is required. The number of possible - resynchronisation MUST be limited to prevent resource exhaustion attacks. + resynchronisation MUST be limited, to prevent resource exhaustion attacks. </t> - <figure anchor="security_states_full_sending_full_done_code"> - <artwork name="" type="" align="left" alt=""><![CDATA[ -# INPUTS: -# full_done_msg: received full done message -# full_element_msg_store: Store that stores the the uniq keys of -# full elements -# remote_setsize: The remote setsize -# local_set: The local set -# client_id: Unique remote peer id -# OUTPUTS: -# returns: Boolean as indicator if message is valid -FUNCTION validate_messages_full_done(full_done_msg, full_element_msg_store, - remote_setsize, local_set, client_id) - - # Check that correct number of elements has been received - number_received_messages = getNumberOfMessage(full_element_msg_store) - IF ( number_received_messages != remote_setsize ) - return FALSE - ENDIF - IF local_set.getFullHash() != full_done_msg.fullSetHash - return FALSE - ENDIF - - # Update other peers remote_setsize - save_number_of_elements_last_sync(client_id, remote_setsize) - - return TRUE - ]]></artwork> - </figure> </dd> </dl> </section> @@ -2526,28 +2688,23 @@ FUNCTION validate_messages_full_done(full_done_msg, full_element_msg_store, <dt><xref target="messages_ibf" format="title" /></dt> <dd> <t> - When receiving multiple IBFs it is important to check that the other - peer can only send as many IBFs as expected. The number of expected IBFs can - be calculated with the knowledge of the set difference as described in the - performance section. - </t> - <t> - Use pseudocode of the function "validate_messages_ibf" as described in - <xref target="security_states_expecting_ibf" format="title" /> section. + No special safety measures are necessary in this state. + The maximum of <xref target="messages_ibf" format="title" /> messages should be limited to a reasonable amount. </t> </dd> </dl> </section> + <section anchor="security_states_active_decoding" numbered="true" toc="default"> <name>Active Decoding</name> <t> - In the Active Decoding state it is important to prevent an attacker from + In the <strong>Active Decoding</strong> state it is important to prevent an attacker from generating and passing an unlimited amount of IBFs, that do not decode or - even worse, generate an IBF constructed, to send the peers in an endless loop. - To prevent an endless loop in decoding, a loop detection MUST be implemented. + even worse, generate an IBF constructed to send the peers in an endless loop. + To prevent an endless loop in decoding, a loop detection should be implemented. The simplest solution would be to prevent decoding of more than a given amount of elements. A more robust solution is to implement a algorithm that detects a loop by - analyzing past partially decoded IBFs. This can be archived + analyzing past partially decoded IBFs. This can be achieved by saving the hash of all prior partly decoded IBFs hashes in a hashmap and check for every inserted hash, if it is already in the hashmap. </t> @@ -2556,7 +2713,7 @@ FUNCTION validate_messages_full_done(full_done_msg, full_element_msg_store, operation MUST be terminated. The upper and lower threshold for the decoded elements can be calculated with the peers set sizes and the other peer committed set sizes from the <strong>Expecting IBF</strong> - State. + state. </t> <t>Security considerations for received messages:</t> @@ -2568,68 +2725,20 @@ FUNCTION validate_messages_full_done(full_done_msg, full_element_msg_store, an inquiry or if an offer is received twice, the operation MUST be terminated. This requirement can be fulfilled by saving lists that keep track of the state of all sent inquiries and offers. When answering offers these lists MUST be checked. + The sending and receiving of <xref target="messages_offer" format="title" /> messages should + always be protected with an <xref target="security_generic_functions_mfc" format="title" /> + to secure the protocol against missing, doubled, not in order or unexpected messages. </t> - <figure anchor="security_states_active_decoding_offer_code"> - <artwork name="" type="" align="left" alt=""><![CDATA[ -# INPUTS: -# offer_msg: Received offer message -# inquiry_msg_store: Store that stores the the uniq keys of -# the inquiries -# OUTPUTS: -# returns: Boolean as indicator if message is valid -FUNCTION validate_messages_offer(offer_msg,inquiry_msg_store) - IF is_undefined(store) - offer_msg_store = createStore() - ENDIF - - # Store message to prevent double sending of messages - IF ! addMessageToStore(offer_msg_store, offer_msg.unique_id) - return FALSE - ENDIF - - # Check that for every received offer a inquiry has been sent and non is - # sent multiple times - IF ! markElementAsReceived(inquiry_msg_store, offer_msg.unique_id) - return FALSE - return TRUE - ]]></artwork> - </figure> </dd> <dt><xref target="messages_elements" format="title" /></dt> <dd> <t> If an element that never has been requested by a demand or is received double the operation MUST be terminated. - This requirement can be fulfilled by a simple table that keeps track - of the state of all sent demands. - If an invalid element is received, the operation has failed and it - MUST be terminated. + The sending and receiving of <xref target="messages_elements" format="title" /> messages should + always be protected with an <xref target="security_generic_functions_mfc" format="title" /> + to secure the protocol against missing, doubled, not in order or unexpected messages. </t> - <figure anchor="security_states_active_decoding_elements_code"> - <artwork name="" type="" align="left" alt=""><![CDATA[ -# INPUTS: -# element_msg: Received element message -# demand_msg_store: Store that stores the the uniq keys of -# received demands. -# OUTPUTS: -# returns: Boolean as indicator if message is valid -FUNCTION validate_messages_elements(element_msg,demand_msg_store) - IF is_undefined(store) - element_msg_store = createStore() - ENDIF - - # Store message to prevent double sending of messages - IF ! addMessageToStore(element_msg_store, element_msg.unique_id) - return FALSE - ENDIF - - # Check that for every received element a demand has been sent and non is - # sent multiple times - IF ! markElementAsReceived(demand_msg_store, element_msg.unique_id) - return FALSE - return TRUE - ]]></artwork> - </figure> </dd> <dt><xref target="messages_demand" format="title" /></dt> <dd> @@ -2638,100 +2747,46 @@ FUNCTION validate_messages_elements(element_msg,demand_msg_store) for an element is received, that never has been offered or the offer already has been answered with a demand, the operation MUST be terminated. It is required to implement a list which keeps track of the state of all sent offers and received demands. + The sending and receiving of <em><xref target="messages_demand" format="title" /></em> messages should + always be protected with an <xref target="security_generic_functions_mfc" format="title" /> + to secure the protocol against missing, doubled, not in order or unexpected messages. </t> - <figure anchor="security_states_active_decoding_demand_code"> - <artwork name="" type="" align="left" alt=""><![CDATA[ -# INPUTS: -# demand_msg: Received demand message -# offer_msg_store: Store that stores the the uniq keys of -# send offers. -# OUTPUTS: -# returns: Boolean as indicator if message is valid -FUNCTION validate_messages_demand(demand_msg,offer_msg_store) - IF is_undefined(demand_msg_store) - demand_msg_store = createStore() - ENDIF - - # Store message to prevent double sending of messages - IF ! addMessageToStore(demand_msg_store, demand_msg.unique_id) - return FALSE - ENDIF - - # Check that for every received demand a offer has been sent and non is - # sent multiple times - IF ! markElementAsReceived(offer_msg_store, demand_msg.unique_id) - return FALSE - return TRUE - ]]></artwork> - </figure> </dd> <dt><xref target="messages_done" format="title" /></dt> <dd> <t> - The done message is only received, if the IBF has been finished - decoding and all offers have been sent. If the done message is received before + The <em><xref target="messages_done" format="title" /></em> message is only received, if the IBF has been finished + decoding and all offers have been sent. If the <em><xref target="messages_done" format="title" /></em> message is received before the decoding of the IBF is finished or all open offers and demands have been answered, the operation MUST be terminated. If the sets differ, a resynchronisation is required. The number of possible resynchronisation MUST be limited to prevent resource exhaustion attacks. </t> - <figure anchor="security_states_active_decoding_done_code"> - <artwork name="" type="" align="left" alt=""><![CDATA[ -# INPUTS: -# done_msg: received done message -# offer_msg_store: Store that stores the the uniq keys of -# received offers. -# demand_msg_store: Store that stores the the uniq keys of -# received demands. -# element_msg_store: Store that stores the the uniq keys of -# received elements. -# client_id: Unique remote peer id -# remote_setsize: The remote setsize -# OUTPUTS: -# returns: Boolean as indicator if message is valid -FUNCTION validate_messages_done(done_msg, offer_msg_store, - demand_msg_store, element_msg_store, client_id, remote_setsize) - - # Check that all offers have been received - IF ! isStoreComplete(offer_msg_store) - return FALSE - ENDIF - - # Check that all demands have been received - IF ! isStoreComplete(demand_msg_store) - return FALSE - ENDIF - - # Check that all elements have been received - IF ! isStoreComplete(element_msg_store) - return FALSE - ENDIF - - # Validate that set is truly identical - IF local_set.getFullHash() != done_msg.fullSetHash - return FALSE - ENDIF - - # Update other peers remote_setsize - save_number_of_elements_last_sync(client_id, remote_setsize) - - return TRUE - ]]></artwork> - </figure> + <t> + When a <em><xref target="messages_done" format="title" /></em> message is received the + "check_if_synchronisation_is_complete()" function from the <xref target="security_generic_functions_mfc" format="title" /> + is required to ensure that all demands have been satisfied successfully. + </t> </dd> </dl> </section> <section anchor="security_states_finish_closing" numbered="true" toc="default"> <name>Finish Closing</name> <t> - In case not all sent demands or inquiries have been answered in time, a predefined - timeout, the operation has failed and MUST be terminated. + In the <strong>Finish Closing</strong> state the protocol waits for + all sent demands to be fulfilled. + </t> + <t> + In case not all sent demands have been answered in time, + the operation has failed and MUST be terminated. </t> <t>Security considerations for received messages:</t> <dl> <dt><xref target="messages_elements" format="title" /></dt> <dd> - Checked as described in section <xref target="security_states_active_decoding" format="title" />. + When receiving <xref target="messages_elements" format="title" /> messages it is important + to always check the <xref target="security_generic_functions_mfc" format="title" /> + to secure the protocol against missing, doubled, not in order or unexpected messages. </dd> </dl> </section> @@ -2748,49 +2803,15 @@ FUNCTION validate_messages_done(done_msg, offer_msg_store, <dt><xref target="messages_se" format="title" /></dt> <dd> <t> - In case the Strata Estimator does not decode, the - operation MUST be terminated to prevent to get to a unresolvable state. + In case the strata estimator does not decode, the + operation MUST be terminated to prevent to get to an unresolvable state. The set difference calculated from the strata estimator needs to be plausible, - to ensure this, multiple factors need to be considered: The absolute plausible maximum of - elements in a set, which has to be predefined according - to the use case and the maximal plausible element increase since the last - successful set reconciliation, which SHOULD be either predefined or can be calculated - with the gaussian distribution function over all passed set reconciliations. + which means within the byzantine boundaries described in section <xref target="security_generic_functions_check_byzantine_boundaries" format="title" />. </t> <t> In case of compressed strata estimators the decompression algorithm needs to be protected against decompression memory corruption (memory overflow). </t> - <figure anchor="security_states_expect_se_se_code"> - <artwork name="" type="" align="left" alt=""><![CDATA[ -# INPUTS: -# se_msg: received strata estimator message -# remote_setsize: The remote setsize -# local_setsize: The local setsize -# OUTPUTS: -# returns: Boolean as indicator if message is valid -FUNCTION validate_messages_se(se_msg, remote_setsize, local_setsize) - - # Check that se decoded successfully if not return -1 - set_diff = decode_se(se_msg) - IF set_diff < 0 - return FALSE - ENDIF - - # Check that set difference cant be larger than local + remote setsize - IF set_diff > (remote_setsize + local_setsize) - return FALSE - ENDIF - - # Check for max plausible set size as defined on use case basis (can be infinite) - plausible_setsize = getMaxPlausibleSetSize() - IF set_diff > plausible_setsize - return FALSE - ENDIF - - return TRUE - ]]></artwork> - </figure> </dd> </dl> </section> @@ -2801,29 +2822,22 @@ FUNCTION validate_messages_se(se_msg, remote_setsize, local_setsize) <dt><xref target="messages_full_element" format="title" /></dt> <dd> <t> - The peer in <strong>Full Receiving</strong> state needs to check - that exactly the number of elements is received from the remote peer as - he has initially committed too. If the remote peer transmits less or - more elements the operation MUST be terminated. - </t> - <t> - Pseudocode for implementation described in section <xref target="security_states_expecting_ibf" format="title" />. + When receiving full elements there needs to be checked, that every + element is a valid element, no element has been received more than once and + not more or less elements are received, as the other peer has committed + to in the beginning of the operation. The plausibility should also be checked + with an algorithm as described in <xref target="security_generic_functions_full_plausibility_check" format="default"/>. </t> </dd> <dt><xref target="messages_full_done" format="title" /></dt> <dd> <t> - When the full done message is received from the remote peer all + When the <em><xref target="messages_full_done" format="title" /></em> message is received from the remote peer, all elements, that the remote peer has committed to, need to be received, otherwise the operation MUST be terminated. After receiving the - full done message, future elements MUST NOT be accepted. - The 512-bit hash of the complete reconciled set contained in - the full done message is required to ensure that both sets are truly identical. If + <em><xref target="messages_full_done" format="title" /></em> message, future elements MUST NOT be accepted. If the sets differ, a resynchronisation is required. The number of possible - resynchronisations MUST be limited to prevent resource exhaustion attacks. - </t> - <t> - Pseudocode for implementation described in section <xref target="security_states_full_sending" format="title" />. + resynchronisation MUST be limited to prevent resource exhaustion attacks. </t> </dd> </dl> @@ -2835,108 +2849,42 @@ FUNCTION validate_messages_se(se_msg, remote_setsize, local_setsize) <dt><xref target="messages_ibf" format="title" /></dt> <dd> <t> - In case an IBF message is received by the peer a active/passive role switch + In case an <xref target="messages_ibf" format="title" /> message is received by the peer a active/passive role switch is initiated by the active decoding remote peer. In this moment the peer MUST wait for all open offers and demands to be fulfilled, to prevent retransmission before switching into active decoding operation mode. A switch into active decoding mode MUST only be permitted for - a predefined number of times as described in the top section - of the security section. + a predefined number of times as described in <xref target="security_generic_functions_active_passive_switches" format="default"/> </t> - <figure anchor="security_states_passive_decoding_ibf_code"> - <artwork name="" type="" align="left" alt=""><![CDATA[ -# INPUTS: -# offer_msg_store: Store that stores the the uniq keys of -# received offers. -# demand_msg_store: Store that stores the the uniq keys of -# received demands. -# element_msg_store: Store that stores the the uniq keys of -# received elements. -# OUTPUTS: -# returns: Boolean as indicator if message is valid -FUNCTION validate_messages_ibf(offer_msg_store, demand_msg_store, element_msg_store) - - # Check that all offers have been received - IF ! isStoreComplete(offer_msg_store) - return FALSE - ENDIF - - # Check that all demands have been received - IF ! isStoreComplete(demand_msg_store) - return FALSE - ENDIF - - # Check that all elements have been received - IF ! isStoreComplete(element_msg_store) - return FALSE - ENDIF - - # Check that not more active/passive switches are done as configured - IF getNumberRollSwitches() > getMaxNumberRollSwitches() - return FALSE - ENDIF - - return TRUE - ]]></artwork> - </figure> </dd> <dt><xref target="messages_inquiry" format="title" /></dt> <dd> <t> A check needs to be in place that prevents receiving an inquiry for an element multiple times or more inquiries than are plausible. - The amount of inquiries that is plausible, can be estimated by considering - known values, as the remote set size, the local set size, the - predefined absolute maximum of elements in the set, which is defined - by real world limitations. - To implement this restrictions, a list with all received inquiries - MUST be stored and new inquiries MUST be checked against. + The sending and receiving of <xref target="messages_inquiry" format="title" /> messages should + always be protected with an <xref target="security_generic_functions_mfc" format="title" /> + to secure the protocol against missing, doubled, not in order or unexpected messages. </t> - <figure anchor="security_states_passive_decoding_inquiry_code"> - <artwork name="" type="" align="left" alt=""><![CDATA[ -# INPUTS: -# inquiry_msg: received inquiry message -# set_diff: The set difference calculated by strata estimator -# OUTPUTS: -# returns: Boolean as indicator if message is valid -FUNCTION validate_messages_inquiry(inquiry_msg, set_diff) - - IF is_undefined(inquiry_msg_store) - inquiry_msg_store = createStore() - ENDIF - - # Store message to prevent double sending of messages - IF ! addMessageToStore(inquiry_msg_store, inquiry_msg.unique_id) - return FALSE - ENDIF - - # Check that not more inquiries are received as estimated - IF set_diff < getNumberOfMessage(inquiry_msg_store) - return FALSE - ENDIF - - return TRUE - ]]></artwork> - </figure> </dd> <dt><xref target="messages_demand" format="title" /></dt> <dd> - Same action as described for demand message in section + Same action as described for <em><xref target="messages_demand" format="title" /></em> message in section <xref target="security_states_active_decoding" format="title"/>. </dd> <dt><xref target="messages_offer" format="title" /></dt> <dd> - Same action as described for offer message in section + Same action as described for <em><xref target="messages_offer" format="title" /></em> message in section <xref target="security_states_active_decoding" format="title"/>. </dd> <dt><xref target="messages_done" format="title" /></dt> <dd> - Same action as described for done message in section + Same action as described for <em><xref target="messages_done" format="title" /></em> message in section <xref target="security_states_active_decoding" format="title"/>. </dd> <dt><xref target="messages_elements" format="title" /></dt> <dd> - Same action as described for element message in section + Same action as described for <em><xref target="messages_elements" format="title" /></em> message in section <xref target="security_states_active_decoding" format="title"/>. </dd> @@ -2945,21 +2893,55 @@ FUNCTION validate_messages_inquiry(inquiry_msg, set_diff) <section anchor="security_states_finish_waiting" numbered="true" toc="default"> <name>Finish Waiting</name> <t> - In case not all sent demands or inquiries have ben answered in time, the operation + In the <strong>Finish Waiting</strong> state the protocol waits for + all send demands to be fulfilled. + </t> + <t> + In case not all sent demands have ben answered in time, the operation has failed and MUST be terminated. </t> <t>Security considerations for received messages:</t> <dl> <dt><xref target="messages_elements" format="title" /></dt> <dd> - Checked as described in section <xref target="security_states_active_decoding" format="title" />. + When receiving <xref target="messages_elements" format="title" /> messages it is important + to always check the <xref target="security_generic_functions_mfc" format="title" /> + to secure the protocol against missing, doubled, not in order or unexpected messages. </dd> </dl> </section> - </section> </section> - + <section anchor="constants" numbered="true" toc="default"> + <name>Constants</name> + <t> + The following table contains constants used by the protocol. The constants marked with a * are + validated through experiments in Summermatter's work <xref target="byzantine_fault_tolerant_set_reconciliation" format="default"/>. + </t> + <figure anchor="figure_constants"> + <artwork name="" type="" align="left" alt=""><![CDATA[ +Name | Value | Description +----------------------------+------------+-------------------------- +SE_STRATA_COUNT | 32 | Number of IBFs in a strata estimator +IBF_HASH_NUM* | 3 | Number of times an element is hashed to an IBF +IBF_FACTOR* | 2 | The factor by which the size of the IBF is increased + in case of decoding failure or initially from the + set difference +MAX_BUCKETS_PER_MESSAGE | 1120 | Maximum bucket of an IBF that are transmitted in single message +IBF_MIN_SIZE* | 37 | Minimal number of buckets in an IBF +DIFFERENTIAL_RTT_MEAN* | 3.65145 | The average RTT that is needed for a differential syncronisation +SECURITY_LEVEL* | 2^80 | Security level for probabilistic security algorithms +PROBABILITY_FOR_NEW_ROUND* | 0.15 | The probability for a IBF decoding failure in the differential + synchronisation mode +DIFFERENTIAL_RTT_MEAN* | 3.65145 | The average RTT that is needed for a differential syncronisation +MAX_IBF_SIZE | 1048576 | Maximal number of buckets in an IBF +AVG_BYTE_SIZE_SE* | 4221 | Average byte size of a single strata estimator +VALID_NUMBER_SE* | [1,2,4,8] | Valid number of SE in + + ]]></artwork> + </figure> + + </section> <section anchor="gana" numbered="true" toc="default"> <name>GANA Considerations</name> <t> @@ -2971,6 +2953,7 @@ FUNCTION validate_messages_inquiry(inquiry_msg, set_diff) Type | Name | References | Description --------+----------------------------+------------+-------------------------- 559 | SETU_P2P_REQUEST_FULL | [This.I-D] | Request the full set of the other peer + 710 | SETU_P2P_SEND_FULL | [This.I-D] | Signals to send the full set to the other peer 560 | SETU_P2P_DEMAND | [This.I-D] | Demand the whole element from the other peer, given only the hash code. 561 | SETU_P2P_INQUIRY | [This.I-D] | Tell the other peer to send us a list of hashes that match an IBF key. 562 | SETU_P2P_OFFER | [This.I-D] | Tell the other peer which hashes match a given IBF key. @@ -2981,8 +2964,8 @@ Type | Name | References | Description 567 | SETU_P2P_IBF_LAST | [This.I-D] | Invertible Bloom Filter Last Slice. 568 | SETU_P2P_DONE | [This.I-D] | Set operation is done. 569 | SETU_P2P_SEC | [This.I-D] | Strata Estimator compressed - 570 | SETU_P2P_FULL_DONE | [This.I-D] | All elements in full synchronization mode have been send is done. - 571 | SETU_P2P_FULL_ELEMENT | [This.I-D] | Send an actual element in full synchronization mode. + 570 | SETU_P2P_FULL_DONE | [This.I-D] | All elements in full synchronisation mode have been send is done. + 571 | SETU_P2P_FULL_ELEMENT | [This.I-D] | Send an actual element in full synchronisation mode. ]]></artwork> </figure> @@ -2991,7 +2974,7 @@ Type | Name | References | Description <section anchor="contributors" numbered="true" toc="default"> <name>Contributors</name> <t> - The original GNUnet implementation of the Byzantine Fault Tolerant Set Reconciliation + The original GNUnet implementation of the byzantine fault tolerant Set Reconciliation protocol has mainly been written by Florian Dold and Christian Grothoff. </t> @@ -3003,6 +2986,16 @@ Type | Name | References | Description &RFC5869; &RFC2119; + <reference anchor="byzantine_fault_tolerant_set_reconciliation" target="https://summermatter.net/byzantine-fault-tolerant-set-reconciliation-summermatter.pdf"> + <front> + <title>Byzantine Fault Tolerant Set Reconciliation</title> + <author initials="E." surname="Summermatter" fullname="Elias Summermatter"> + <organization>University of Applied Sciences Bern</organization> + </author> + <date year="2021"/> + </front> + </reference> + <reference anchor="GANA" target="https://gana.gnunet.org/"> <front> <title>GNUnet Assigned Numbers Authority (GANA)</title> @@ -3088,15 +3081,6 @@ Type | Name | References | Description <date year="2014"/> </front> </reference> - <reference anchor="byzantine_fault_tolerant_set_reconciliation" target="https://summermatter.net/byzantine-fault-tolerant-set-reconciliation-summermatter.pdf"> - <front> - <title>Secure Set Reconciliation</title> - <author initials="E." surname="Summermatter" fullname="Elias Summermatter"> - <organization>University of Applied Sciences Bern</organization> - </author> - <date year="2021"/> - </front> - </reference> </references> <section anchor="test_vectors" numbered="true" toc="default"> diff --git a/statemachine/full_state_machine.png b/statemachine/full_state_machine.png Binary files differ. diff --git a/statemachine/full_state_machine.svg b/statemachine/full_state_machine.svg @@ -1,3 +1,3 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" style="background-color: rgb(255, 255, 255);" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1541px" height="921px" viewBox="-0.5 -0.5 1541 921" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2021-05-20T13:48:38.286Z&quot; agent=&quot;5.0 (X11)&quot; etag=&quot;Nrj_kDXvqoQ1CdzchEh5&quot; version=&quot;14.6.12&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;C5RBs43oDa-KdzZeNtuy&quot; name=&quot;Page-1&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;"><defs><linearGradient x1="0%" y1="0%" x2="0%" y2="100%" id="mx-gradient-ffffff-1-ffffff-1-s-0"><stop offset="0%" style="stop-color:#ffffff"/><stop offset="100%" style="stop-color:#ffffff"/></linearGradient></defs><g><path d="M 315.5 40 L 315.5 128.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 315.5 133.88 L 312 126.88 L 315.5 128.63 L 319 126.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 88px; margin-left: 316px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Operation request<br /></div><div>send: SE(C) </div></div></div></div></foreignObject><text x="316" y="91" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Operation request...</text></switch></g><path d="M 363 160 L 783 160 L 783 355 L 1326.63 355" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1331.88 355 L 1324.88 358.5 L 1326.63 355 L 1324.88 351.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 158px; margin-left: 648px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Full element</div></div></div></foreignObject><text x="648" y="161" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full element</text></switch></g><ellipse cx="315.5" cy="160" rx="47.5" ry="25" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 93px; height: 1px; padding-top: 160px; margin-left: 269px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Expecting IBF</div></div></div></foreignObject><text x="316" y="164" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Expecting IBF</text></switch></g><path d="M 140.5 300 L 140.5 900 L 715.14 900" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 720.39 900 L 713.39 903.5 L 715.14 900 L 713.39 896.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 570px; margin-left: 141px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Full done</div></div></div></div></foreignObject><text x="141" y="573" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full done</text></switch></g><ellipse cx="140.5" cy="275" rx="47.5" ry="25" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 93px; height: 1px; padding-top: 275px; margin-left: 94px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Full Sending</div></div></div></foreignObject><text x="141" y="279" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Full Sending</text></switch></g><ellipse cx="618" cy="325" rx="55" ry="25" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 325px; margin-left: 564px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Expecting IBF Last</div></div></div></foreignObject><text x="618" y="329" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Expecting IBF Last</text></switch></g><ellipse cx="410.5" cy="535" rx="47.5" ry="25" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 93px; height: 1px; padding-top: 535px; margin-left: 364px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>Active <br /></div><div>Decoding</div></div></div></div></foreignObject><text x="411" y="539" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Active...</text></switch></g><path d="M 409.5 735 L 409.5 880 L 738 880 L 738 877.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 738 872.12 L 741.5 879.12 L 738 877.37 L 734.5 879.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 881px; margin-left: 576px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if: all demanded elements <br /></div>have been received</div></div></div></foreignObject><text x="576" y="884" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if: all demanded elements...</text></switch></g><ellipse cx="410.5" cy="710" rx="47.5" ry="25" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 93px; height: 1px; padding-top: 710px; margin-left: 364px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>Finish</div><div> Closing</div></div></div></div></foreignObject><text x="411" y="714" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Finish...</text></switch></g><path d="M 285.75 179.49 L 175.51 251.99" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 171.13 254.87 L 175.05 248.1 L 175.51 251.99 L 178.9 253.95 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 210px; margin-left: 234px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Request full<br /></div><div>send: Full element*</div><div>send: Full done</div></div></div></div></foreignObject><text x="234" y="214" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Request full...</text></switch></g><path d="M 348.56 177.95 L 577.23 302.73" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 581.84 305.25 L 574.02 304.97 L 577.23 302.73 L 577.37 298.82 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 211px; margin-left: 411px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: IBF</div></div></div></foreignObject><text x="411" y="214" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: IBF</text></switch></g><path d="M 595.44 347.8 L 436.85 508.28" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 433.16 512.01 L 435.59 504.57 L 436.85 508.28 L 440.57 509.49 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 402px; margin-left: 544px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div><div>recv: IBF-LAST</div></div></div></div></div></foreignObject><text x="544" y="406" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: IBF-LAST</text></switch></g><path d="M 410.5 560 L 410.5 678.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 410.5 683.88 L 407 676.88 L 410.5 678.63 L 414 676.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 650px; margin-left: 412px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Done</div></div></div></foreignObject><text x="412" y="653" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Done</text></switch></g><path d="M 438.88 555.05 L 494.81 594.26 Q 503 600 493.97 604.3 L 449.03 625.7 Q 440 630 438.67 620.09 L 431.68 568.16" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 430.98 562.96 L 435.38 569.43 L 431.68 568.16 L 428.44 570.36 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 604px; margin-left: 486px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if: IBF decoded <br /></div><div>with side = -1</div><div>send: Inquiry</div></div></div></div></foreignObject><text x="486" y="607" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if: IBF decoded...</text></switch></g><path d="M 364.35 529.08 L 302.92 521.26 Q 293 520 294.64 529.86 L 301.36 570.14 Q 303 580 312.23 576.15 L 367.52 553.06" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 372.36 551.04 L 367.25 556.96 L 367.52 553.06 L 364.55 550.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 550px; margin-left: 283px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if: IBF finished decoding<br /></div><div>send: Done</div></div></div></div></foreignObject><text x="283" y="553" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if: IBF finished decoding...</text></switch></g><path d="M 390.29 512.38 L 349.7 467.42 Q 343 460 335.93 467.07 L 320.07 482.93 Q 313 490 322.08 494.18 L 369.08 515.81" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 373.85 518 L 366.03 518.25 L 369.08 515.81 L 368.96 511.9 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 482px; margin-left: 328px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv:: Offer<br /></div><div>send: Demand</div></div></div></div></foreignObject><text x="328" y="485" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv:: Offer...</text></switch></g><path d="M 413.65 510.06 L 421.68 449.91 Q 423 440 432.7 442.43 L 453.3 447.57 Q 463 450 457.73 458.5 L 428.41 505.79" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 425.65 510.25 L 426.36 502.46 L 428.41 505.79 L 432.31 506.15 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 447px; margin-left: 445px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Element</div></div></div></foreignObject><text x="445" y="450" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Element</text></switch></g><path d="M 651.21 305.07 L 684.43 285.14 Q 693 280 697.22 289.07 L 708.78 313.93 Q 713 323 703 323.21 L 679.31 323.71" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 674.06 323.82 L 680.98 320.17 L 679.31 323.71 L 681.13 327.17 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 301px; margin-left: 703px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div><div>recv: IBF*</div></div></div></div></div></foreignObject><text x="703" y="304" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: IBF*</text></switch></g><ellipse cx="1378" cy="160" rx="35" ry="20" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 160px; margin-left: 1344px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Expect SE</div></div></div></foreignObject><text x="1378" y="164" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Expect SE</text></switch></g><path d="M 1378 375 L 1378 895 L 826.87 895" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 821.62 895 L 828.62 891.5 L 826.87 895 L 828.62 898.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 609px; margin-left: 1379px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div><div>recv: Full done</div>send:  Full element*</div><div>send: Full done</div></div></div></div></foreignObject><text x="1379" y="612" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full donesend:  Full element*...</text></switch></g><ellipse cx="1378" cy="355" rx="45" ry="20" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 355px; margin-left: 1334px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Full Receiving </div></div></div></foreignObject><text x="1378" y="359" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Full Receiving </text></switch></g><path d="M 1048 562.64 L 1048 686.13" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1048 691.38 L 1044.5 684.38 L 1048 686.13 L 1051.5 684.38 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 646px; margin-left: 1048px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Done</div></div></div></foreignObject><text x="1048" y="649" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Done</text></switch></g><ellipse cx="1048" cy="542.64" rx="35" ry="20" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 543px; margin-left: 1014px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Passive Decoding</div></div></div></foreignObject><text x="1048" y="546" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Passive Dec...</text></switch></g><path d="M 1362.53 177.94 L 1067.65 519.88" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1064.22 523.86 L 1066.14 516.27 L 1067.65 519.88 L 1071.44 520.84 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 407px; margin-left: 1164px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div><div>if:  Differential Sync is more efficient</div></div><div>recv: SE(C)</div><div>send: IBF* <br /></div><div>send: IBF-LAST <br /></div></div></div></div></foreignObject><text x="1164" y="411" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if:  Differential Sync is more efficient...</text></switch></g><path d="M 1378 180 L 1378 328.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1378 333.88 L 1374.5 326.88 L 1378 328.63 L 1381.5 326.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 271px; margin-left: 1404px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if:  Fullsync &amp;&amp; requesting from <br /></div><div>other site is more efficient<br /></div><div>recv: SE(C)</div><div>send: Request full<br /></div></div></div></div></foreignObject><text x="1404" y="274" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if:  Fullsync &amp;&amp; requesting from...</text></switch></g><path d="M 1343.49 163.33 L 194.34 274.39" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 189.11 274.89 L 195.74 270.74 L 194.34 274.39 L 196.42 277.7 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 201px; margin-left: 953px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if:  Fullsync &amp;&amp; requesting from <br /></div>other site is more efficient<div><div>send: Full element*</div><div>send: Full done</div></div></div></div></div></foreignObject><text x="953" y="204" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if:  Fullsync &amp;&amp; requesting from...</text></switch></g><path d="M 1051.64 522.75 L 1061.22 469.84 Q 1063 460 1053.19 461.96 L 1022.81 468.04 Q 1013 470 1017.33 479.01 L 1035.88 517.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1038.15 522.36 L 1031.96 517.57 L 1035.88 517.63 L 1038.27 514.54 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 471px; margin-left: 1013px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Demand</div><div>send: Element</div></div></div></div></foreignObject><text x="1013" y="474" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Demand...</text></switch></g><path d="M 1048 732.5 L 1048 880 L 816.87 880" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 811.62 880 L 818.62 876.5 L 816.87 880 L 818.62 883.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 799px; margin-left: 1050px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if: all demanded elements <br /></div><div>have been received<br /></div><div>send: Done</div></div></div></div></foreignObject><text x="1050" y="802" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if: all demanded elements...</text></switch></g><ellipse cx="1048" cy="712.5" rx="35" ry="20" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 713px; margin-left: 1014px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Finish Waiting</div></div></div></foreignObject><text x="1048" y="716" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Finish Wait...</text></switch></g><path d="M 1418.42 346.21 L 1483.23 332.12 Q 1493 330 1493 340 L 1493 370 Q 1493 380 1483.23 377.88 L 1424.65 365.14" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1419.52 364.03 L 1427.1 362.09 L 1424.65 365.14 L 1425.61 368.93 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 355px; margin-left: 1495px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Full element*</div></div></div></foreignObject><text x="1495" y="359" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full element*</text></switch></g><path d="M 1021.8 529.38 L 660.49 346.45" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 655.81 344.08 L 663.63 344.12 L 660.49 346.45 L 660.47 350.37 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 444px; margin-left: 853px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div><div>recv: IBF</div></div></div></div></div></foreignObject><text x="853" y="447" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: IBF</text></switch></g><path d="M 458 535 L 773.14 588.33 Q 783 590 792.84 588.24 L 1008.3 549.69" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1013.47 548.77 L 1007.2 553.44 L 1008.3 549.69 L 1005.97 546.55 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 590px; margin-left: 743px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if: IBF failed to decode <br /></div><div>send: IBF*</div><div>send: IBF-LAST</div></div></div></div></foreignObject><text x="743" y="594" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if: IBF failed to decode...</text></switch></g><path d="M 383.14 555.44 L 331.03 594.05 Q 323 600 331 606 L 355 624 Q 363 630 367.48 621.06 L 395.67 564.88" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 398.03 560.19 L 398.02 568.02 L 395.67 564.88 L 391.76 564.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 610px; margin-left: 336px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if IBF decoded <br /></div><div>with side = 1</div><div>send: Offer<br /></div></div></div></div></foreignObject><text x="336" y="613" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if IBF decoded...</text></switch></g><path d="M 1083.98 553.64 L 1153.3 536.41 Q 1163 534 1160.18 524.41 L 1155.82 509.59 Q 1153 500 1144.01 504.38 L 1089.7 530.85" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1084.98 533.15 L 1089.74 526.94 L 1089.7 530.85 L 1092.81 533.23 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 523px; margin-left: 1184px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Offer</div><div>send: Demand<br /></div></div></div></div></foreignObject><text x="1184" y="526" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Offer...</text></switch></g><path d="M 438.88 514.95 L 494.81 475.74 Q 503 470 507.47 478.94 L 518.53 501.06 Q 523 510 513.14 511.66 L 457.82 520.95" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 452.64 521.81 L 458.97 517.2 L 457.82 520.95 L 460.13 524.11 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 491px; margin-left: 524px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Demand</div>send: Element</div></div></div></foreignObject><text x="524" y="494" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Demandsend: Element</text></switch></g><path d="M 1026.97 558.63 L 980.94 593.92 Q 973 600 980.07 607.07 L 995.93 622.93 Q 1003 630 1007.58 621.11 L 1035.17 567.48" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1037.57 562.81 L 1037.48 570.64 L 1035.17 567.48 L 1031.25 567.44 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 611px; margin-left: 981px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Element</div></div></div></foreignObject><text x="981" y="614" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Element</text></switch></g><path d="M 1057.92 561.82 L 1088.42 621.11 Q 1093 630 1100.81 623.75 L 1135.19 596.25 Q 1143 590 1133.96 585.73 L 1078.51 559.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1073.76 557.26 L 1081.58 557.09 L 1078.51 559.5 L 1078.59 563.42 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 610px; margin-left: 1123px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Inquiry<br /></div><div>send: Offer<br /></div></div></div></div></foreignObject><text x="1123" y="614" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Inquiry...</text></switch></g><path d="M 321.73 184.78 L 402.66 504.05" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 403.95 509.14 L 398.83 503.21 L 402.66 504.05 L 405.62 501.49 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 311px; margin-left: 354px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: IBF-LAST</div></div></div></div></foreignObject><text x="354" y="315" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: IBF-LAST</text></switch></g><path d="M 1013.58 539.03 L 752.94 511.07 Q 743 510 733.03 510.75 L 463.87 530.98" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 458.64 531.38 L 465.35 527.36 L 463.87 530.98 L 465.88 534.34 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 509px; margin-left: 749px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: IBF-LAST</div></div></div></div></foreignObject><text x="749" y="512" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: IBF-LAST</text></switch></g><path d="M 117.85 253.03 L 80.22 216.92 Q 73 210 67 218 L 49 242 Q 43 250 52.69 252.47 L 91.67 262.43" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 96.76 263.73 L 89.11 265.39 L 91.67 262.43 L 90.84 258.61 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 230px; margin-left: 45px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Full element*</div></div></div></foreignObject><text x="45" y="234" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full element*</text></switch></g><path d="M 1072.75 726.64 L 1143 726.52 Q 1153 726.5 1150.52 716.81 L 1145.48 697.19 Q 1143 687.5 1133.12 689.03 L 1079.04 697.39" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1073.85 698.19 L 1080.24 693.66 L 1079.04 697.39 L 1081.31 700.58 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 711px; margin-left: 1145px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Element</div></div></div></foreignObject><text x="1145" y="714" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Element</text></switch></g><path d="M 457.43 713.85 L 523.03 719.19 Q 533 720 533 710 L 533 700 Q 533 690 523.13 691.61 L 462.14 701.54" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 456.95 702.39 L 463.3 697.81 L 462.14 701.54 L 464.43 704.71 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 705px; margin-left: 533px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Element</div></div></div></foreignObject><text x="533" y="708" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Element</text></switch></g><ellipse cx="770.5" cy="895" rx="50" ry="25" fill="url(#mx-gradient-ffffff-1-ffffff-1-s-0)" stroke="#000000" pointer-events="all"/><ellipse cx="770.5" cy="895" rx="47" ry="22" fill="transparent" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 92px; height: 1px; padding-top: 895px; margin-left: 725px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><pre class="moz-quote-pre">Finished</pre></div></div></div></foreignObject><text x="771" y="899" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Finished</text></switch></g><ellipse cx="315.5" cy="20" rx="50" ry="20" fill="url(#mx-gradient-ffffff-1-ffffff-1-s-0)" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 20px; margin-left: 267px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Expecting Connection</div></div></div></foreignObject><text x="316" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Expecting Connec...</text></switch></g><path d="M 1378 40 L 1378 133.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1378 138.88 L 1374.5 131.88 L 1378 133.63 L 1381.5 131.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 77px; margin-left: 1381px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">send: Operation request</div></div></div></foreignObject><text x="1381" y="80" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">send: Operation request</text></switch></g><ellipse cx="1378" cy="20" rx="50" ry="20" fill="url(#mx-gradient-ffffff-1-ffffff-1-s-0)" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 20px; margin-left: 1329px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>Initiating Connection<br /></div></div></div></div></foreignObject><text x="1378" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Initiating Conne...</text></switch></g><path d="M 1015.03 725.02 L 952.98 729.31 Q 943 730 945.43 720.3 L 950.57 699.7 Q 953 690 962.93 691.18 L 1016.93 697.61" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1022.14 698.23 L 1014.78 700.87 L 1016.93 697.61 L 1015.6 693.92 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 710px; margin-left: 951px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv:Demand<br /></div><div>send: Element</div></div></div></div></foreignObject><text x="951" y="713" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv:Demand...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg> -\ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1542px" height="921px" viewBox="-0.5 -0.5 1542 921" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2021-06-09T09:00:23.118Z&quot; agent=&quot;5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36&quot; etag=&quot;nBSEvaX3-Qq_OyputO_f&quot; version=&quot;14.7.6&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;C5RBs43oDa-KdzZeNtuy&quot; name=&quot;Page-1&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;" style="background-color: rgb(255, 255, 255);"><defs><linearGradient x1="0%" y1="0%" x2="0%" y2="100%" id="mx-gradient-ffffff-1-ffffff-1-s-0"><stop offset="0%" style="stop-color:#ffffff"/><stop offset="100%" style="stop-color:#ffffff"/></linearGradient></defs><g><path d="M 315.5 40 L 315.5 128.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 315.5 133.88 L 312 126.88 L 315.5 128.63 L 319 126.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 88px; margin-left: 316px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Operation request<br /></div><div>send: SE(C) </div></div></div></div></foreignObject><text x="316" y="91" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Operation request...</text></switch></g><path d="M 363 160 L 783 160 L 783 355 L 1326.63 355" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1331.88 355 L 1324.88 358.5 L 1326.63 355 L 1324.88 351.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 158px; margin-left: 648px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Send full</div></div></div></foreignObject><text x="648" y="161" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Send full</text></switch></g><ellipse cx="315.5" cy="160" rx="47.5" ry="25" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 93px; height: 1px; padding-top: 160px; margin-left: 269px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Expecting IBF</div></div></div></foreignObject><text x="316" y="164" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Expecting IBF</text></switch></g><path d="M 140.5 300 L 140.5 900 L 715.14 900" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 720.39 900 L 713.39 903.5 L 715.14 900 L 713.39 896.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 570px; margin-left: 141px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Full done</div></div></div></div></foreignObject><text x="141" y="573" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full done</text></switch></g><ellipse cx="140.5" cy="275" rx="47.5" ry="25" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 93px; height: 1px; padding-top: 275px; margin-left: 94px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Full Sending</div></div></div></foreignObject><text x="141" y="279" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Full Sending</text></switch></g><ellipse cx="618" cy="325" rx="55" ry="25" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 325px; margin-left: 564px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Expecting IBF Last</div></div></div></foreignObject><text x="618" y="329" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Expecting IBF Last</text></switch></g><ellipse cx="410.5" cy="535" rx="47.5" ry="25" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 93px; height: 1px; padding-top: 535px; margin-left: 364px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>Active <br /></div><div>Decoding</div></div></div></div></foreignObject><text x="411" y="539" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Active...</text></switch></g><path d="M 409.5 735 L 409.5 880 L 738 880 L 738 877.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 738 872.12 L 741.5 879.12 L 738 877.37 L 734.5 879.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 881px; margin-left: 576px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if: all demanded elements <br /></div>have been received</div></div></div></foreignObject><text x="576" y="884" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if: all demanded elements...</text></switch></g><ellipse cx="410.5" cy="710" rx="47.5" ry="25" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 93px; height: 1px; padding-top: 710px; margin-left: 364px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>Finish</div><div> Closing</div></div></div></div></foreignObject><text x="411" y="714" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Finish...</text></switch></g><path d="M 285.75 179.49 L 175.51 251.99" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 171.13 254.87 L 175.05 248.1 L 175.51 251.99 L 178.9 253.95 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 210px; margin-left: 234px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Request full<br /></div><div>send: Full element*</div><div>send: Full done</div></div></div></div></foreignObject><text x="234" y="214" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Request full...</text></switch></g><path d="M 348.56 177.95 L 577.23 302.73" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 581.84 305.25 L 574.02 304.97 L 577.23 302.73 L 577.37 298.82 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 211px; margin-left: 411px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: IBF</div></div></div></foreignObject><text x="411" y="214" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: IBF</text></switch></g><path d="M 595.44 347.8 L 436.85 508.28" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 433.16 512.01 L 435.59 504.57 L 436.85 508.28 L 440.57 509.49 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 402px; margin-left: 544px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div><div>recv: IBF-LAST</div></div></div></div></div></foreignObject><text x="544" y="406" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: IBF-LAST</text></switch></g><path d="M 410.5 560 L 410.5 678.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 410.5 683.88 L 407 676.88 L 410.5 678.63 L 414 676.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 650px; margin-left: 412px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Done</div></div></div></foreignObject><text x="412" y="653" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Done</text></switch></g><path d="M 438.88 555.05 L 494.81 594.26 Q 503 600 493.97 604.3 L 449.03 625.7 Q 440 630 438.67 620.09 L 431.68 568.16" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 430.98 562.96 L 435.38 569.43 L 431.68 568.16 L 428.44 570.36 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 604px; margin-left: 486px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if: IBF decoded <br /></div><div>with side = -1</div><div>send: Inquiry</div></div></div></div></foreignObject><text x="486" y="607" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if: IBF decoded...</text></switch></g><path d="M 364.35 529.08 L 302.92 521.26 Q 293 520 294.64 529.86 L 301.36 570.14 Q 303 580 312.23 576.15 L 367.52 553.06" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 372.36 551.04 L 367.25 556.96 L 367.52 553.06 L 364.55 550.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 550px; margin-left: 283px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if: IBF finished decoding<br /></div><div>send: Done</div></div></div></div></foreignObject><text x="283" y="553" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if: IBF finished decoding...</text></switch></g><path d="M 390.29 512.38 L 349.7 467.42 Q 343 460 335.93 467.07 L 320.07 482.93 Q 313 490 322.08 494.18 L 369.08 515.81" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 373.85 518 L 366.03 518.25 L 369.08 515.81 L 368.96 511.9 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 482px; margin-left: 328px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv:: Offer<br /></div><div>send: Demand</div></div></div></div></foreignObject><text x="328" y="485" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv:: Offer...</text></switch></g><path d="M 413.65 510.06 L 421.68 449.91 Q 423 440 432.7 442.43 L 453.3 447.57 Q 463 450 457.73 458.5 L 428.41 505.79" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 425.65 510.25 L 426.36 502.46 L 428.41 505.79 L 432.31 506.15 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 447px; margin-left: 445px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Element</div></div></div></foreignObject><text x="445" y="450" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Element</text></switch></g><path d="M 651.21 305.07 L 684.43 285.14 Q 693 280 697.22 289.07 L 708.78 313.93 Q 713 323 703 323.21 L 679.31 323.71" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 674.06 323.82 L 680.98 320.17 L 679.31 323.71 L 681.13 327.17 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 301px; margin-left: 703px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div><div>recv: IBF*</div></div></div></div></div></foreignObject><text x="703" y="304" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: IBF*</text></switch></g><ellipse cx="1378" cy="160" rx="35" ry="20" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 160px; margin-left: 1344px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Expect SE</div></div></div></foreignObject><text x="1378" y="164" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Expect SE</text></switch></g><path d="M 1378 375 L 1378 895 L 826.87 895" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 821.62 895 L 828.62 891.5 L 826.87 895 L 828.62 898.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 609px; margin-left: 1379px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div><div>recv: Full done</div>send:  Full element*</div><div>send: Full done</div></div></div></div></foreignObject><text x="1379" y="612" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full donesend:  Full element*...</text></switch></g><ellipse cx="1378" cy="355" rx="45" ry="20" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 355px; margin-left: 1334px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Full Receiving </div></div></div></foreignObject><text x="1378" y="359" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Full Receiving </text></switch></g><path d="M 1048 562.64 L 1048 686.13" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1048 691.38 L 1044.5 684.38 L 1048 686.13 L 1051.5 684.38 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 646px; margin-left: 1048px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Done</div></div></div></foreignObject><text x="1048" y="649" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Done</text></switch></g><ellipse cx="1048" cy="542.64" rx="35" ry="20" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 543px; margin-left: 1014px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Passive Decoding</div></div></div></foreignObject><text x="1048" y="546" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Passive Dec...</text></switch></g><path d="M 1362.53 177.94 L 1067.65 519.88" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1064.22 523.86 L 1066.14 516.27 L 1067.65 519.88 L 1071.44 520.84 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 407px; margin-left: 1164px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div><div>if:  Differential Sync is more efficient</div></div><div>recv: SE(C)</div><div>send: IBF* <br /></div><div>send: IBF-LAST <br /></div></div></div></div></foreignObject><text x="1164" y="411" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if:  Differential Sync is more efficient...</text></switch></g><path d="M 1378 180 L 1378 328.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1378 333.88 L 1374.5 326.88 L 1378 328.63 L 1381.5 326.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 271px; margin-left: 1404px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if:  Fullsync &amp;&amp; requesting from <br /></div><div>other site is more efficient<br /></div><div>recv: SE(C)</div><div>send: Request full<br /></div></div></div></div></foreignObject><text x="1404" y="274" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if:  Fullsync &amp;&amp; requesting from...</text></switch></g><path d="M 1343.49 163.33 L 194.34 274.39" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 189.11 274.89 L 195.74 270.74 L 194.34 274.39 L 196.42 277.7 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 201px; margin-left: 953px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if:  Fullsync &amp;&amp; requesting from <br /></div>other site is more efficient<br />send: Send full<br /><div><div>send: Full element*</div><div>send: Full done</div></div></div></div></div></foreignObject><text x="953" y="204" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if:  Fullsync &amp;&amp; requesting from...</text></switch></g><path d="M 1051.64 522.75 L 1061.22 469.84 Q 1063 460 1053.19 461.96 L 1022.81 468.04 Q 1013 470 1017.33 479.01 L 1035.88 517.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1038.15 522.36 L 1031.96 517.57 L 1035.88 517.63 L 1038.27 514.54 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 471px; margin-left: 1013px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Demand</div><div>send: Element</div></div></div></div></foreignObject><text x="1013" y="474" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Demand...</text></switch></g><path d="M 1048 732.5 L 1048 880 L 816.87 880" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 811.62 880 L 818.62 876.5 L 816.87 880 L 818.62 883.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 799px; margin-left: 1050px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if: all demanded elements <br /></div><div>have been received<br /></div><div>send: Done</div></div></div></div></foreignObject><text x="1050" y="802" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if: all demanded elements...</text></switch></g><ellipse cx="1048" cy="712.5" rx="35" ry="20" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 713px; margin-left: 1014px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Finish Waiting</div></div></div></foreignObject><text x="1048" y="716" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Finish Wait...</text></switch></g><path d="M 1418.42 346.21 L 1483.23 332.12 Q 1493 330 1493 340 L 1493 370 Q 1493 380 1483.23 377.88 L 1424.65 365.14" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1419.52 364.03 L 1427.1 362.09 L 1424.65 365.14 L 1425.61 368.93 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 355px; margin-left: 1495px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Full element*</div></div></div></foreignObject><text x="1495" y="359" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full element*</text></switch></g><path d="M 1021.8 529.38 L 660.49 346.45" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 655.81 344.08 L 663.63 344.12 L 660.49 346.45 L 660.47 350.37 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 444px; margin-left: 853px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div><div>recv: IBF</div></div></div></div></div></foreignObject><text x="853" y="447" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: IBF</text></switch></g><path d="M 458 535 L 773.14 588.33 Q 783 590 792.84 588.24 L 1008.3 549.69" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1013.47 548.77 L 1007.2 553.44 L 1008.3 549.69 L 1005.97 546.55 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 590px; margin-left: 743px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if: IBF failed to decode <br /></div><div>send: IBF*</div><div>send: IBF-LAST</div></div></div></div></foreignObject><text x="743" y="594" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if: IBF failed to decode...</text></switch></g><path d="M 383.14 555.44 L 331.03 594.05 Q 323 600 331 606 L 355 624 Q 363 630 367.48 621.06 L 395.67 564.88" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 398.03 560.19 L 398.02 568.02 L 395.67 564.88 L 391.76 564.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 610px; margin-left: 336px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>if IBF decoded <br /></div><div>with side = 1</div><div>send: Offer<br /></div></div></div></div></foreignObject><text x="336" y="613" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">if IBF decoded...</text></switch></g><path d="M 1083.98 553.64 L 1153.3 536.41 Q 1163 534 1160.18 524.41 L 1155.82 509.59 Q 1153 500 1144.01 504.38 L 1089.7 530.85" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1084.98 533.15 L 1089.74 526.94 L 1089.7 530.85 L 1092.81 533.23 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 523px; margin-left: 1184px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Offer</div><div>send: Demand<br /></div></div></div></div></foreignObject><text x="1184" y="526" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Offer...</text></switch></g><path d="M 438.88 514.95 L 494.81 475.74 Q 503 470 507.47 478.94 L 518.53 501.06 Q 523 510 513.14 511.66 L 457.82 520.95" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 452.64 521.81 L 458.97 517.2 L 457.82 520.95 L 460.13 524.11 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 491px; margin-left: 524px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Demand</div>send: Element</div></div></div></foreignObject><text x="524" y="494" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Demandsend: Element</text></switch></g><path d="M 1026.97 558.63 L 980.94 593.92 Q 973 600 980.07 607.07 L 995.93 622.93 Q 1003 630 1007.58 621.11 L 1035.17 567.48" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1037.57 562.81 L 1037.48 570.64 L 1035.17 567.48 L 1031.25 567.44 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 611px; margin-left: 981px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Element</div></div></div></foreignObject><text x="981" y="614" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Element</text></switch></g><path d="M 1057.92 561.82 L 1088.42 621.11 Q 1093 630 1100.81 623.75 L 1135.19 596.25 Q 1143 590 1133.96 585.73 L 1078.51 559.5" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1073.76 557.26 L 1081.58 557.09 L 1078.51 559.5 L 1078.59 563.42 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 610px; margin-left: 1123px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Inquiry<br /></div><div>send: Offer<br /></div></div></div></div></foreignObject><text x="1123" y="614" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Inquiry...</text></switch></g><path d="M 321.73 184.78 L 402.66 504.05" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 403.95 509.14 L 398.83 503.21 L 402.66 504.05 L 405.62 501.49 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 311px; margin-left: 354px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: IBF-LAST</div></div></div></div></foreignObject><text x="354" y="315" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: IBF-LAST</text></switch></g><path d="M 1013.58 539.03 L 752.94 511.07 Q 743 510 733.03 510.75 L 463.87 530.98" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 458.64 531.38 L 465.35 527.36 L 463.87 530.98 L 465.88 534.34 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 509px; margin-left: 749px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: IBF-LAST</div></div></div></div></foreignObject><text x="749" y="512" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: IBF-LAST</text></switch></g><path d="M 117.85 253.03 L 80.22 216.92 Q 73 210 67 218 L 49 242 Q 43 250 52.69 252.47 L 91.67 262.43" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 96.76 263.73 L 89.11 265.39 L 91.67 262.43 L 90.84 258.61 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 230px; margin-left: 45px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Full element*</div></div></div></foreignObject><text x="45" y="234" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full element*</text></switch></g><path d="M 1072.75 726.64 L 1143 726.52 Q 1153 726.5 1150.52 716.81 L 1145.48 697.19 Q 1143 687.5 1133.12 689.03 L 1079.04 697.39" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1073.85 698.19 L 1080.24 693.66 L 1079.04 697.39 L 1081.31 700.58 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 711px; margin-left: 1145px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Element</div></div></div></foreignObject><text x="1145" y="714" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Element</text></switch></g><path d="M 457.43 713.85 L 523.03 719.19 Q 533 720 533 710 L 533 700 Q 533 690 523.13 691.61 L 462.14 701.54" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 456.95 702.39 L 463.3 697.81 L 462.14 701.54 L 464.43 704.71 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 705px; margin-left: 533px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Element</div></div></div></foreignObject><text x="533" y="708" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Element</text></switch></g><ellipse cx="770.5" cy="895" rx="50" ry="25" fill="url(#mx-gradient-ffffff-1-ffffff-1-s-0)" stroke="#000000" pointer-events="all"/><ellipse cx="770.5" cy="895" rx="47" ry="22" fill="none" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 92px; height: 1px; padding-top: 895px; margin-left: 725px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><pre class="moz-quote-pre">Finished</pre></div></div></div></foreignObject><text x="771" y="899" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Finished</text></switch></g><ellipse cx="315.5" cy="20" rx="50" ry="20" fill="url(#mx-gradient-ffffff-1-ffffff-1-s-0)" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 20px; margin-left: 267px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Expecting Connection</div></div></div></foreignObject><text x="316" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Expecting Connec...</text></switch></g><path d="M 1378 40 L 1378 133.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1378 138.88 L 1374.5 131.88 L 1378 133.63 L 1381.5 131.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 77px; margin-left: 1381px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">send: Operation request</div></div></div></foreignObject><text x="1381" y="80" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">send: Operation request</text></switch></g><ellipse cx="1378" cy="20" rx="50" ry="20" fill="url(#mx-gradient-ffffff-1-ffffff-1-s-0)" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 20px; margin-left: 1329px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>Initiating Connection<br /></div></div></div></div></foreignObject><text x="1378" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Initiating Conne...</text></switch></g><path d="M 1015.03 725.02 L 952.98 729.31 Q 943 730 945.43 720.3 L 950.57 699.7 Q 953 690 962.93 691.18 L 1016.93 697.61" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 1022.14 698.23 L 1014.78 700.87 L 1016.93 697.61 L 1015.6 693.92 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 710px; margin-left: 951px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv:Demand<br /></div><div>send: Element</div></div></div></div></foreignObject><text x="951" y="713" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv:Demand...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg> +\ No newline at end of file diff --git a/statemachine/full_state_machine.xml b/statemachine/full_state_machine.xml @@ -1 +1 @@ -<mxfile host="app.diagrams.net" modified="2021-05-20T13:48:24.900Z" agent="5.0 (X11)" etag="a3Ebk57OIP6ERtez1A7k" version="14.6.12" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">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</diagram></mxfile> -\ No newline at end of file +<mxfile host="app.diagrams.net" modified="2021-06-09T09:00:04.439Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36" etag="S3dK_qrw8OXXDkhOVYPX" version="14.7.6" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">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</diagram></mxfile> +\ No newline at end of file diff --git a/statemachine/state_machine_full b/statemachine/state_machine_full @@ -1 +1 @@ -<mxfile host="app.diagrams.net" modified="2021-06-09T06:52:44.377Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36" etag="pelenmTsAhDcsqPl0I7k" version="14.7.6" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">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</diagram></mxfile> -\ No newline at end of file +<mxfile host="app.diagrams.net" modified="2021-06-09T09:03:07.281Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36" etag="KR6ZhX0G6TfHJ9lJQmcM" version="14.7.6" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">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</diagram></mxfile> +\ No newline at end of file diff --git a/statemachine/state_machine_full.png b/statemachine/state_machine_full.png Binary files differ. diff --git a/statemachine/state_machine_full.svg b/statemachine/state_machine_full.svg @@ -1,3 +1,3 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="752px" height="531px" viewBox="-0.5 -0.5 752 531" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2021-06-09T06:55:05.725Z&quot; agent=&quot;5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36&quot; etag=&quot;Ho4LXeUk9jqtwfKfm4ic&quot; version=&quot;14.7.6&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;C5RBs43oDa-KdzZeNtuy&quot; name=&quot;Page-1&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;" style="background-color: rgb(255, 255, 255);"><defs><linearGradient x1="0%" y1="0%" x2="0%" y2="100%" id="mx-gradient-ffffff-1-ffffff-1-s-0"><stop offset="0%" style="stop-color:#ffffff"/><stop offset="100%" style="stop-color:#ffffff"/></linearGradient></defs><g><path d="M 155.5 40 L 155.5 128.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 155.5 133.88 L 152 126.88 L 155.5 128.63 L 159 126.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 88px; margin-left: 156px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Operation request<br /></div><div>send: SE(C) </div></div></div></div></foreignObject><text x="156" y="91" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Operation request...</text></switch></g><path d="M 203 160 L 373 160 L 373 345 L 543 345 L 543 343.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 543 348.88 L 539.5 341.88 L 543 343.63 L 546.5 341.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 158px; margin-left: 333px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Full element</div></div></div></foreignObject><text x="333" y="161" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full element</text></switch></g><ellipse cx="155.5" cy="160" rx="47.5" ry="25" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 93px; height: 1px; padding-top: 160px; margin-left: 109px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Expecting IBF</div></div></div></foreignObject><text x="156" y="164" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Expecting IBF</text></switch></g><path d="M 158 375 L 158 505 L 336.63 505" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 341.88 505 L 334.88 508.5 L 336.63 505 L 334.88 501.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 506px; margin-left: 194px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Full done</div></div></div></div></foreignObject><text x="194" y="509" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full done</text></switch></g><ellipse cx="158" cy="350" rx="47.5" ry="25" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 93px; height: 1px; padding-top: 350px; margin-left: 112px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Full Sending</div></div></div></foreignObject><text x="158" y="354" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Full Sending</text></switch></g><path d="M 155.8 185 L 157.65 318.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 157.72 323.88 L 154.13 316.93 L 157.65 318.63 L 161.12 316.83 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 258px; margin-left: 179px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Request full<br /></div><div>send: Full element*</div><div>send: Full done</div></div></div></div></foreignObject><text x="179" y="261" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Request full...</text></switch></g><ellipse cx="583" cy="160" rx="35" ry="20" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 160px; margin-left: 549px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Expect SE</div></div></div></foreignObject><text x="583" y="164" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Expect SE</text></switch></g><path d="M 583 369.88 L 583 505 L 449.37 505" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 444.12 505 L 451.12 501.5 L 449.37 505 L 451.12 508.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 506px; margin-left: 584px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div><div>recv: Full done</div>send:  Full element*</div><div>send: Full done</div></div></div></div></foreignObject><text x="584" y="509" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full donesend:  Full element*...</text></switch></g><ellipse cx="588" cy="350" rx="45" ry="20" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 350px; margin-left: 544px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Full Receiving </div></div></div></foreignObject><text x="588" y="354" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Full Receiving </text></switch></g><path d="M 583.47 180 L 587.3 323.64" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 587.44 328.88 L 583.76 321.98 L 587.3 323.64 L 590.76 321.79 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 269px; margin-left: 611px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: SE(C)<br /></div><div>send: Request full<br /></div></div></div></div></foreignObject><text x="611" y="272" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: SE(C)...</text></switch></g><path d="M 556.75 173.23 L 211.19 347.14" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 206.5 349.5 L 211.18 343.22 L 211.19 347.14 L 214.32 349.48 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 233px; margin-left: 438px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>isend: Full element*</div><div><div>send: Full done</div></div></div></div></div></foreignObject><text x="438" y="236" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">isend: Full element*...</text></switch></g><path d="M 628.42 341.21 L 693.23 327.12 Q 703 325 703 335 L 703 365 Q 703 375 693.23 372.88 L 634.65 360.14" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 629.52 359.03 L 637.1 357.09 L 634.65 360.14 L 635.61 363.93 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 350px; margin-left: 705px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Full element*</div></div></div></foreignObject><text x="705" y="354" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full element*</text></switch></g><path d="M 116.25 338.07 L 62.62 322.75 Q 53 320 53 330 L 53 350 Q 53 360 62.95 359.05 L 104.92 355.06" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 110.15 354.56 L 103.51 358.71 L 104.92 355.06 L 102.85 351.74 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 339px; margin-left: 45px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Full element*</div></div></div></foreignObject><text x="45" y="342" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full element*</text></switch></g><ellipse cx="393" cy="505" rx="50" ry="25" fill="url(#mx-gradient-ffffff-1-ffffff-1-s-0)" stroke="#000000" pointer-events="all"/><ellipse cx="393" cy="505" rx="47" ry="22" fill="none" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 92px; height: 1px; padding-top: 505px; margin-left: 347px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><pre class="moz-quote-pre">Finished</pre></div></div></div></foreignObject><text x="393" y="509" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Finished</text></switch></g><ellipse cx="155.5" cy="20" rx="50" ry="20" fill="url(#mx-gradient-ffffff-1-ffffff-1-s-0)" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 20px; margin-left: 107px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Expecting Connection</div></div></div></foreignObject><text x="156" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Expecting Connec...</text></switch></g><path d="M 583 40 L 583 133.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 583 138.88 L 579.5 131.88 L 583 133.63 L 586.5 131.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 77px; margin-left: 586px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">send: Operation request</div></div></div></foreignObject><text x="586" y="80" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">send: Operation request</text></switch></g><ellipse cx="583" cy="20" rx="50" ry="20" fill="url(#mx-gradient-ffffff-1-ffffff-1-s-0)" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 20px; margin-left: 534px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>Initiating Connection<br /></div></div></div></div></foreignObject><text x="583" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Initiating Conne...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg> -\ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="752px" height="531px" viewBox="-0.5 -0.5 752 531" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2021-06-09T09:03:20.632Z&quot; agent=&quot;5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36&quot; etag=&quot;FuY_nssVVWUIB2rbHQ9Y&quot; version=&quot;14.7.6&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;C5RBs43oDa-KdzZeNtuy&quot; name=&quot;Page-1&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;" style="background-color: rgb(255, 255, 255);"><defs><linearGradient x1="0%" y1="0%" x2="0%" y2="100%" id="mx-gradient-ffffff-1-ffffff-1-s-0"><stop offset="0%" style="stop-color:#ffffff"/><stop offset="100%" style="stop-color:#ffffff"/></linearGradient></defs><g><path d="M 155.5 40 L 155.5 128.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 155.5 133.88 L 152 126.88 L 155.5 128.63 L 159 126.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 88px; margin-left: 156px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Operation request<br /></div><div>send: SE(C) </div></div></div></div></foreignObject><text x="156" y="91" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Operation request...</text></switch></g><path d="M 203 160 L 373 160 L 373 345 L 543 345 L 543 343.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 543 348.88 L 539.5 341.88 L 543 343.63 L 546.5 341.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 158px; margin-left: 333px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Send full</div></div></div></foreignObject><text x="333" y="161" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Send full</text></switch></g><ellipse cx="155.5" cy="160" rx="47.5" ry="25" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 93px; height: 1px; padding-top: 160px; margin-left: 109px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Expecting IBF</div></div></div></foreignObject><text x="156" y="164" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Expecting IBF</text></switch></g><path d="M 158 375 L 158 505 L 336.63 505" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 341.88 505 L 334.88 508.5 L 336.63 505 L 334.88 501.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 506px; margin-left: 194px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Full done</div></div></div></div></foreignObject><text x="194" y="509" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full done</text></switch></g><ellipse cx="158" cy="350" rx="47.5" ry="25" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 93px; height: 1px; padding-top: 350px; margin-left: 112px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Full Sending</div></div></div></foreignObject><text x="158" y="354" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Full Sending</text></switch></g><path d="M 155.8 185 L 157.65 318.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 157.72 323.88 L 154.13 316.93 L 157.65 318.63 L 161.12 316.83 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 258px; margin-left: 179px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: Request full<br /></div><div>send: Full element*</div><div>send: Full done</div></div></div></div></foreignObject><text x="179" y="261" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Request full...</text></switch></g><ellipse cx="583" cy="160" rx="35" ry="20" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 68px; height: 1px; padding-top: 160px; margin-left: 549px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Expect SE</div></div></div></foreignObject><text x="583" y="164" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Expect SE</text></switch></g><path d="M 583 369.88 L 583 505 L 449.37 505" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 444.12 505 L 451.12 501.5 L 449.37 505 L 451.12 508.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 506px; margin-left: 584px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div><div>recv: Full done</div>send:  Full element*</div><div>send: Full done</div></div></div></div></foreignObject><text x="584" y="509" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full donesend:  Full element*...</text></switch></g><ellipse cx="588" cy="350" rx="45" ry="20" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 88px; height: 1px; padding-top: 350px; margin-left: 544px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Full Receiving </div></div></div></foreignObject><text x="588" y="354" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Full Receiving </text></switch></g><path d="M 583.47 180 L 587.3 323.64" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 587.44 328.88 L 583.76 321.98 L 587.3 323.64 L 590.76 321.79 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 269px; margin-left: 611px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>recv: SE(C)<br /></div><div>send: Request full<br /></div></div></div></div></foreignObject><text x="611" y="272" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: SE(C)...</text></switch></g><path d="M 556.75 173.23 L 211.19 347.14" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 206.5 349.5 L 211.18 343.22 L 211.19 347.14 L 214.32 349.48 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 233px; margin-left: 438px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>send: Send full</div><div>send: Full element*</div><div><div>send: Full done</div></div></div></div></div></foreignObject><text x="438" y="236" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">send: Send full...</text></switch></g><path d="M 628.42 341.21 L 693.23 327.12 Q 703 325 703 335 L 703 365 Q 703 375 693.23 372.88 L 634.65 360.14" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 629.52 359.03 L 637.1 357.09 L 634.65 360.14 L 635.61 363.93 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 350px; margin-left: 705px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Full element*</div></div></div></foreignObject><text x="705" y="354" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full element*</text></switch></g><path d="M 116.25 338.07 L 62.62 322.75 Q 53 320 53 330 L 53 350 Q 53 360 62.95 359.05 L 104.92 355.06" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 110.15 354.56 L 103.51 358.71 L 104.92 355.06 L 102.85 351.74 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 339px; margin-left: 45px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">recv: Full element*</div></div></div></foreignObject><text x="45" y="342" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">recv: Full element*</text></switch></g><ellipse cx="393" cy="505" rx="50" ry="25" fill="url(#mx-gradient-ffffff-1-ffffff-1-s-0)" stroke="#000000" pointer-events="all"/><ellipse cx="393" cy="505" rx="47" ry="22" fill="none" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 92px; height: 1px; padding-top: 505px; margin-left: 347px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><pre class="moz-quote-pre">Finished</pre></div></div></div></foreignObject><text x="393" y="509" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Finished</text></switch></g><ellipse cx="155.5" cy="20" rx="50" ry="20" fill="url(#mx-gradient-ffffff-1-ffffff-1-s-0)" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 20px; margin-left: 107px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Expecting Connection</div></div></div></foreignObject><text x="156" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Expecting Connec...</text></switch></g><path d="M 583 40 L 583 133.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 583 138.88 L 579.5 131.88 L 583 133.63 L 586.5 131.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 77px; margin-left: 586px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">send: Operation request</div></div></div></foreignObject><text x="586" y="80" fill="#000000" font-family="Helvetica" font-size="11px" text-anchor="middle">send: Operation request</text></switch></g><ellipse cx="583" cy="20" rx="50" ry="20" fill="url(#mx-gradient-ffffff-1-ffffff-1-s-0)" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 20px; margin-left: 534px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><div>Initiating Connection<br /></div></div></div></div></foreignObject><text x="583" y="24" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Initiating Conne...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg> +\ No newline at end of file