diff --git a/origin/tunnel.go b/origin/tunnel.go index fcd206ab..5086ae84 100644 --- a/origin/tunnel.go +++ b/origin/tunnel.go @@ -172,16 +172,17 @@ func (c *TunnelConfig) RegistrationOptions(connectionID uint8, OriginLocalIP str } } -func (c *TunnelConfig) ConnectionOptions(originLocalAddr string) *tunnelpogs.ConnectionOptions { +func (c *TunnelConfig) ConnectionOptions(originLocalAddr string, numPreviousAttempts uint8) *tunnelpogs.ConnectionOptions { // attempt to parse out origin IP, but don't fail since it's informational field host, _, _ := net.SplitHostPort(originLocalAddr) originIP := net.ParseIP(host) return &tunnelpogs.ConnectionOptions{ - Client: c.NamedTunnel.Client, - OriginLocalIP: originIP, - ReplaceExisting: c.ReplaceExisting, - CompressionQuality: uint8(c.CompressionQuality), + Client: c.NamedTunnel.Client, + OriginLocalIP: originIP, + ReplaceExisting: c.ReplaceExisting, + CompressionQuality: uint8(c.CompressionQuality), + NumPreviousAttempts: numPreviousAttempts, } } @@ -305,7 +306,7 @@ func ServeTunnel( }() if config.NamedTunnel != nil { - return RegisterConnection(ctx, handler.muxer, config, connectionIndex, originLocalAddr) + return RegisterConnection(ctx, handler.muxer, config, connectionIndex, originLocalAddr, uint8(backoff.retries)) } if config.UseReconnectToken && connectedFuse.Value() { @@ -416,6 +417,7 @@ func RegisterConnection( config *TunnelConfig, connectionIndex uint8, originLocalAddr string, + numPreviousAttempts uint8, ) error { const registerConnection = "registerConnection" @@ -432,7 +434,7 @@ func RegisterConnection( config.NamedTunnel.Auth, config.NamedTunnel.ID, connectionIndex, - config.ConnectionOptions(originLocalAddr), + config.ConnectionOptions(originLocalAddr, numPreviousAttempts), ) if err != nil { if err.Error() == DuplicateConnectionError { diff --git a/tunnelrpc/pogs/connectionrpc.go b/tunnelrpc/pogs/connectionrpc.go index 79102b0a..59bb454c 100644 --- a/tunnelrpc/pogs/connectionrpc.go +++ b/tunnelrpc/pogs/connectionrpc.go @@ -26,10 +26,11 @@ type ClientInfo struct { } type ConnectionOptions struct { - Client ClientInfo - OriginLocalIP net.IP `capnp:"originLocalIp"` - ReplaceExisting bool - CompressionQuality uint8 + Client ClientInfo + OriginLocalIP net.IP `capnp:"originLocalIp"` + ReplaceExisting bool + CompressionQuality uint8 + NumPreviousAttempts uint8 } type TunnelAuth struct { diff --git a/tunnelrpc/tunnelrpc.capnp b/tunnelrpc/tunnelrpc.capnp index 1342df23..20fe4950 100644 --- a/tunnelrpc/tunnelrpc.capnp +++ b/tunnelrpc/tunnelrpc.capnp @@ -98,6 +98,8 @@ struct ConnectionOptions { replaceExisting @2 :Bool; # cross stream compression setting, 0 - off, 3 - high compressionQuality @3 :UInt8; + # number of previous attempts to send RegisterConnection + numPreviousAttempts @4 :UInt8; } struct ConnectionResponse { diff --git a/tunnelrpc/tunnelrpc.capnp.go b/tunnelrpc/tunnelrpc.capnp.go index b3b644dd..14ea1f3d 100644 --- a/tunnelrpc/tunnelrpc.capnp.go +++ b/tunnelrpc/tunnelrpc.capnp.go @@ -1109,6 +1109,14 @@ func (s ConnectionOptions) SetCompressionQuality(v uint8) { s.Struct.SetUint8(1, v) } +func (s ConnectionOptions) NumPreviousAttempts() uint8 { + return s.Struct.Uint8(2) +} + +func (s ConnectionOptions) SetNumPreviousAttempts(v uint8) { + s.Struct.SetUint8(2, v) +} + // ConnectionOptions_List is a list of ConnectionOptions. type ConnectionOptions_List struct{ capnp.List } @@ -3363,181 +3371,182 @@ func (p TunnelServer_reconnectTunnel_Results_Promise) Result() TunnelRegistratio return TunnelRegistration_Promise{Pipeline: p.Pipeline.GetPipeline(0)} } -const schema_db8274f9144abc7e = "x\xda\xccYkl\x1c\xd5\xf5?g\xee\xaeg\xfdb" + - "=\x99M\x9cX\xf0\xf7\xbfQ\"\x8a!\x80\xe3R\x85" + - "\x14j;\xd8)6yx\xbcq\xc5#A\x8cwo" + - "\xecqwg63\xb3\xc6N\x13\x92\x98\xa4\x10Dy" + - "\x84\x84G\x0a-\x04\xa9UiiI\xa1j\xa9\xa8J" + - "\xfa\x82\x8agP\xa8\x02\xa4jKH[\xa2P\xda@" + - "\x85\xa8\x80\xa9\xce\xcc\xce\xc3kc;\xd0\x0f\xfd\xb6:" + - "s\xee\xbd\xe7}~\xe7\xec\xf9\xcb\xc56\xa19.V" + - "\x03([\xe3\x15\x0eozi\xe3\xfd\x0b\x7f5\x06J" + - "\x03\xa2s\xdd\x13\xdd\xa9\xf7\xed\xb1\xd7 \xceD\x80\x16" + - "-\xbe\x11\xe5\xcdq\x11@\x1e\x8d\xff\x15\xd0\xb9L:" + - "\xef\xaa\xd4\x8b\xcf_\x0fRC\x949F\xcc\xeb*\x9a" + - "P\xceW\x10\xb3VA\xcc\x17\xe5_\xd8\xf7\xf9=\xcf" + - "l\x07\xa9A\x08\x99\x01[\xfa\xc4\x8d(k\"qr" + - "q5\xa0\xf3\xce\xee\xb9\xdf{\xe0\xf9\xa7w\x80t&" + - "B\xe9\xed\xcd\xe2\xab\x08(\xdf.\xfe\x10\xd0i]\xfe" + - "\xdc\xe3\x0d-w\xee.{W \xc6\xe6D\x13\xca\xed" + - "\x09\xba\xed\xe2\xc4\xb5\x80\xce\xfc\xe1\x85\xd7\xfc\xf27\x8f" + - "\xde\x05\xca\"D\xe7H\xff\xd9/\xb3\xfb\x1ez\x0d\xfa" + - "PD\x01\xa0\xe5\x81\xc4>\xbax\xbf\xcb\xfb\xc29O" + - "\xfc\xec\xb6Go\xf8\x06(g\"\x02\xb8\x8a\xcc\xae\xfc" + - "71\x9cU\xd9\x0a\xe8\xec>\xfc\xf3U\xf9\xdb\xf7\xee" + - "\xf3Ds\xbf+\x95\x82\x001g{\xd7{\xf9\xbe\x07" + - "\xd3\x0f\x96\x84&+\xb5tV\x9eD\xc0\x96+*\x1b" + - "\x11\xd0\xb9\xe0\xd5c\xabW\xfeh\xfdw\"g\x8bU" + - "\x1b\xe9\xec\xc3\xffwY\xe5\xc8\xb1\xe5\x8f\x80\xb4\xc8\xff" + - "\xb2\xa1\xaa\x97\xbe\xc4\xd6\xb1\x8f\xd4\xbb\x7f\xf1X\xb9?" + - "\\U\xf3U\xfd(o\xab\"U7W\x91\x89o:" + - "\xb0\xf7\xec\xc4\xb7\xde\xf9\xf1dvQ\xab\xfbQ.V" + - "\x13\xf3\x86j\xd2uv\x17\x1ey\xb29\xf6\x93\xa8\x95" + - "\x0fV\x1f']\x8fU\x93\x95\xcfxkY\xad\xfe\xf6" + - "\xd8\x93e\xb7\xb9\x8c;j\xbaQ\xbe\xa7\x86n\xdbS" + - "C\xcc\xddW\xdd\xb1+~\xec\x8e\xa7H\xd0\x88{\xe3" + - "\x09\xd7'\xb5&\xca\x9d\xb5\xf4\xb3\xbd\xb6\x9e\x01:\x0d" + - "\x8f|\xe1\x07\xcb\xb2\xaf<3\x89\xa4\xf2\x81\xba\x93\xf2" + - "su\xf4\xebwu$\xe8\xd1E\xfb\xbf\xfa\xe6\xd7\x0f" + - "\x1e*\x09\x8at\xcdB\xc9u\xca\x85\x129%\xf0i" + - "\x99\x91\\\xce+\xa4!\x94\xf3\x92\x1b\x87.\xb7pL" + - "\x9d\xb7\xf5\xf7_<\x12qC^z\x1d!\xe6\xac\xfa" + - "\xf2UC\x95\x9b\x8f\x1e\x8d>\xa4J\xaeE\x8a\xee\xd1" + - "\xbf\x7f\xfb\xf8\xad'\xf2\xd9\xbf\xb8\xa1\xe4\xdbl\x8f\xb4" + - "T\x00\x94\x1f\x96\xc8\x03\xf5\x8d\xb5\x9d\xf3\x0f\xf7\x1c\xf7" + - "<\xe9]\xb1s\xd62bx`\x16]q\xc15\xed" + - "|\xed\x92\xcb\x8f\x83\xd4\xc0\xc6e\xc1\x81YKQ>" + - "8\x8b\x0e<7\xeb\x06\x94\x8f\xc9\xf5\x00\xce-\xd7u" + - "\xac\xbep\xfe\x81\x93Q\x91^\x96)\xaa\xe47e\xba" + - "o\xfd\x92\x13_Zx\xcboO\x96\x19\xd2e\xacL" + - "5\xa1\xb6l]" + - "\xcds\xb2Y\xc9\x1e[\x8c\x82\xad\x19\xba\x85ua\x1d" + - "\x05\xc4\xba\xa9\xbd\xee)\x90\xa4\xd8&\xfb$\x02i\xcf" + - "\"i?\xcbP\xf9\\D\xdaf\x0a\xe5\xf3\x19*\x17" + - "\x09\xe8\xa8\x99\x8cQ\xd4\xed5\xc0\xd4\x812\xa7\xa49" + - "$3&\x0f\xe5\xf5\x9f\x8dO\x12wd\xef\x0c\x89\xde" + - "\xcb\xbd\x9c:\xd7\xe4\x96X\xcc\xd9$M\x8d\xe3x\xe2" + - ",\x06P\x160T\xce\x17\xb0\x16?r\xa0Y67=\xf2\x82V\xf2t\xdeR" + - "b\x81\xe9j\xf7\x02(u\x0c\x95\xd3\x05t\x06L5" + - "\xc3{\xb8\x89\x9a\x91]\xa5\xeaF\x9a\xf1\x0c\xc6A\xc0" + - "x\xe4\xd1\xd3N\xf5\xd1^n\x15s\xb6\x05\xc1\xa9\xa9" + - "\xcf\x9b\xbcd\x84\xd2\xf1\x9eFO\xe6T \xf3\xe6\xf9" + - "a\xed\x09\xdc\xbd\xad?L\xdd 8wR`\xdc\xc8" + - "P\xd9\x1dI\xf2\xdb)\x8coc\xa8\xdc+\xa0\x14\x8b" + - "\xa50\x06 \xddCa\xbc\x9b\xa1r\xbf0\xbeB\xf1" + - "a\xae\xdb\x1d\xda\x00\x88\xdc\x0a\xa9$b\x876\xc0\x81" + - "Y\x9f6\xd0\x13\xd3\xd8\xc3\xe8\xb7\x8c\x1c\xb7y\x07\xcf" + - "\xe4TS\xb5\xb5a\xee}/\x05\xa3\xef\xd4\xa9.\xec" + - "u=B\x87\x0d}\x82\x9b\xc2\xa0.\xb9\x0a\xad\xa9\xea" + - "U\xc8\xbe\xba`k\xa2\xa1[e%x)\x80\xb2\x96" + - "\xa12\x18\xf1\x0e7\x01\x94,C\xa5 \x96\x9c\x93" + - "\x1f\x0b\xdb\x8a\xc4\xb0\xd4W\xf6\x86\xbem\xf5*0\xd6" + - "\x85\xb8\xbbd;\xaf\xce\xac0\xa01\xa3\xe6\xba\x0a\x81" + - "\x07L^\xc8\xa9\x19\xde\x89\xa5\x9a\x0a\x88 \xba\x0e" + - "\xcb\x17LnY\xa8\x19\xbaRTs\x1a\xb3G't" + - "\x9a)\xb5\xa5|\x14\xb5\x9cUVz\x9a\xc2\\\x0f\xb4" + - "]D\xa5\xe7\x1c\x86\xca\x12\x01\x93\xc5\xa2\x96\x0d\x04\xcc" + - "\x19\x19\xd7\x09\x90\\\xa5\xe6\xf9\x84\xf6P1mn\x8c" + - "\xcb\xac\x1e5\xe9\xa6\xc6\xffR\xdd\x9e\x1a\x8c\x90\xea\xe0" + - "6\xb7Pd\xca\xe66\x86\xca\x8a\x88\xc8]\x8b#z" + - "\xf8\"\xaf\xec\x0f\xf5\x10\xbf\xc2G}\xa9\x1ay\x9e*" + - "\xa5o\xcc\x922\xed ^\x16\xf2L%_4;V" + - "\x17\x1a]\x0dI\xc6%\xbe\x8c\xf2(v\x03\xa4G\x90" + - "az;\x86b\xca\xdbp\x19@z\x13\xd1o\xc4P" + - "Ry\x076\x00\xa4\xb7\x12\xfdf\x0c@\x93\xbc\x13\x1f" + - "\x02H\xdfL\xe4\xbb\x89=\xc6\xdc\xe2#\xefq\xaf\xdf" + - "M\xf4\xfb\x89\x1e\x8f\xa50\x0e \xdf\x87M\x00\xe9\xbb" + - "\x89\xfe\x18\xd1+\x84\x14V\x00\xc8\xfbq\x08 \xfd\x08" + - "\xd1\x9f \xba\x18O\x11n\x94\x1fG\x13 \xfdS\xa2" + - "\xff\x9a\xe8\x89\xb9)L\xd0\x80\xe1\xd2\x9f$\xfa\xb3D" + - "\xaf\x9c\x97\xc2J\x1a7p\x0c \xfd4\xd1\x0f\x11\xbd" + - "\x0aSX\x05 \x1f\xc4\xbd\x00\xe9CD\xff\x13\xd1\xab" + - "+RX\x0d \xff\xc1\x95\xe70\xd1\xdf zM," + - "\x855\x00\xf2\x9fq\x1f@\xfa\x0d\xa2\xff\x83\xe8\xb5b" + - "\x0ak\x01\xe4\xb7\\\xbdN\x10=!\x94!*?\xa2" + - "\xca`\x133\xac\xc0e\xbc\x94\xc5\xe8\x85{\x8f\x91$" + - "h\x84\xc9p\xb2\x06\xc4$\xa0S0\x8c\xdc\xaa\xf1\x91" + - "\x9a\xb4\xd5\x01\xcb\x87hu\xe1\xf8\x05H\xc4\xa0\xcfB" + - "\xd2\xd0\xbb\xb2A!(\xaf+\xbe$\x9a\xd5^\xb4\x8d" + - "b\x01\x1a\xb3\xaa\xcd\xb3AU1\x8b\xfar\xd3\xc8\xaf" + - "An\xe65]\xcdMSo*A\xc0J(\x95\x04" + - "\xffn\xbd\x98\xef1\xf9\xb0\x86F\xd1j\xb7m\x9e\x17" + - "\x0b\xb6\x15H\xf4\xf1\x803\x88h\xa1<\xa2\x1b\x0bK" + - "\xd7\xa8\x033\xa9S\x8bC\xdc\x94\xd4#\x05\xa9qX" + - "\xcd\x15?Iy\x1a\xdf\xba{[\xbd\xd6\x1f\xc5\x1b\xd4" + - "\x1d\x12\x0c\x95\x94\x80\xad\xa6\xd7n\xea\xfc9m\xfaR" + - "2\x1e\x80%\xfd\xa9\xc6\xbd\x1f#\xab\x0fzG(\xdd" + - "?c\xf1\x07\xb8\xed\xfd\xa2\xb9\x82@\xb1\x18m\xab\xa7" + - "v\xba\x97[\xc9\x99\xa8\x1e\xce\xb3e\xca\x8b3\xea\xe2" + - "\x93\xf4p\x1f\xe3E:r\xd3d\x1d\xb9{\x92\x8e\xdc" + - "\x1b\xed\xc8B\xa9#S\xa3(0T6\x09\x98\xa4\xb1" + - "\x01\xeb\xc2}\xd48\xa1\xc7\x8fJ\x14\x0a]z\x96\x03" + - "\x8e\xf8\xd1\x1ci\x1f\xc1\x9egz443\xb5}\x94" + - "9\xad\xc1\x83\xe5\xc9L\x07\x8eV\xefQ\x8a\xb3\xb9," + - "\x0e\x10,\x92\xd0_VH\xfb7\x82 }W\xc4p" + - "\xd9\x82\xfenE\xba\xcf\x04A\xda#\xa2\x10,\xdb\xd0" + - "_\xaaI;o\x02A\xda!\"\x0bve\xe8\x8f\xfb" + - "\xcd\xa3U\x08\x82\xb4Y\xc4X\xb0\x1fD\x7fY m" + - "\x18\x02A\xd2D\x8c\x07k8\xf4\xb7F\xd2\xba1\x10" + - "\xa4>\xd1\xf1\x8d\x04\xad\x9e\x1em\xe8\xf81\x0a\x8dn" + - "\x94\xb6\xa1\xe3\xc3@\xf4A\x05@\x1b:>\xe6d\x1f" + - "\x07:].\x7f\x86\x84$M\x91m\x04\xbf\xbc\xfc\xc7" + - "R\x01\x806Tb\x18\xd9\x95\x00|R\xa8\xd3\xcb\x1b" + - "?M)\x99\xc4\xb9\xde;\xc1\x0e!r/\xa1\xb7\x1a" + - "\x86\xca\\aZ\xc0\x16\xfb8-\xfc\xa0M\xd2a\xba" + - "\xff\xff\x83\xfb\x0f\x12\xe0y\x96\xa1r8\x92\x8e/\x13" + - "\xf1E\x86\xca\x91\x08\xe0y\x85r\xf40C\xe5\xddp" + - "\xf1\xf2\xcf\x9b\x00\x94w\x19\xf6F\x00\x84\xf4!1~" + - "@m\xd6\x85\x0f\xe8\xc1\x878\xee\x02H'\xa8\xfd\xa6" + - "\\\xf8\x10\xf3\xe0\x83\x84\xfd\x00\xe9:\xa2\x9f\x1e\x85\x0f" + - "\xf3\xf0J\x80\xf4\\\xa2/@\x01E\x1eY\xda\x14\xcd" + - "\x10`\xe5\x8c\x81\x15\x9a>iO\xf27Ah/W" + - "\xb5\\\xd1\xe4\x10\xb6\xc4R\x91\xe8\x88tioE\xd4" + - "\xbe\x9e\xc2/M\xc1\x93E\x0bE\x10P<\xb5\xc9k" + - "F\x1d\xa3\xd34\x0d4\xcb\xc0\xe7\xe2\x10|\x06\xd8\x93" + - "0\xf4\xa5\x0c\x955\xe4\x8a6\xcf\x15J\x7f\x08\x97\x1b" + - "3j\xd1\xe2\x13t\x00\xc6\xcd`Z\xb6\x06\x8db." + - "\xdb\xcbA\xb4\xcd\xd12\x13L\x0bB\xd3<\xe9W\x9c" + - "\x84[q\xfc=,\xfa\xebV\xa9y/\x08\xd2\"\xaa" + - "8\xfej\x11\xfd\xa5\xba\xf4\x99\x87@\x90\xce\x08\x0b\x00" + - "\xfa6`\x86>>\xe5\xbd\x0fn\x8c\xb6a\x0f\xe2\x7f" + - "c\x86\xf4\xda\xcf)d\xfa\xb8U\x14\x95qq&}" + - "3\xf8\xe3\xa6,\xd3+?\xed8\xed7\x92\xff\x04\x00" + - "\x00\xff\xff\xed\xc3%H" +const schema_db8274f9144abc7e = "x\xda\xccY{l\x1c\xd5\xd5?g\xee\xaeg\xed\xd8" + + "\xac\x87\xd9\xc4\x89\x05\x9f\xbf/\x0a\xe2\xc3`\xc0q\xa9" + + "\xd2\x94\xd6v\xb0Sl\xf2\xf0x\x93\x96G\x82\x18\xef" + + "\xde\xd8\xe3\xee\xce,3\xb3\xc6N\x13\x92\x98\xa4\x10\xc4" + + "+!\xe1\x91\x926\x04\xd1\xaa\x14ZR@m*\xaa" + + "B_\x80x\xa3P%\x10\xd4\x96\x90>\xa2PJ\xa0" + + "BT\x94\xa9\xce\xcc\xce\xc3kc;\xd0?\xfa\xdf\xea" + + "\xcc\xb9\xf7\x9es~\xe7\x9e\xf3\xbbg\xcf\xff\x9a\xd8&" + + "4\xc7\xc5\x19\x00\xca\xc6x\x85\xc3\x1b_Y\xbb\xe7\x8c" + + "_\x8d\x82R\x8f\xe8\\\xfbxw\xeaC{\xf4u\x88" + + "3\x11\xa0E\x8b\xafEy}\\\x04\x90G\xe2\x7f\x06" + + "t.\x91\xce\xbb\"\xf5\xd2\x0b\xd7\x81T\x1fU\x8e\x91" + + "\xf2\xea\x8aF\x94\xf3\x15\xa4\xacU\x90\xf2\x85\xf9\x17\xf7" + + "~~\xe7\xb3\x9bA\xaa\x17Be\xc0\x96\x95\xe2Z\x94" + + "5\x914\xb9\xb8\x1c\xd0yo\xc7\xec\x1f\xdc\xfb\xc2\xd3" + + "[@:\x13\xa1t\xf6z\xf15\x04\x94\xb7\x89?\x02" + + "tZ\x17?\xbf\xbf\xbe\xe5\x8e\x1de\xe7\x0a\xa4\xd8\x9c" + + "hD\xb9=A\xbb})q\x0d\xa03w\xe8\x8c\xab" + + "~\xf9\x9bG\xee\x04\xa5\x09\xd19\xdcw\xf6\xabl\xf7" + + "\x03\xaf\xc3J\x14Q\x00h\xb97\xb1\x976\xde\xe7\xea" + + "\xbex\xce\xe3?\xbb\xed\x91\xeb\xbf\x05\xca\x99\x88\x00\xae" + + "#3+\xffI\x0agU\xb6\x02:;\x0e\xfe|Y" + + "~\xdb\xae\xbd\x9ei\xeew\xa5R\x10 \xe6l\xee\xfa" + + " \xbf\xf2\xbe\xf4}%\xa3)J-\x9d\x95'\x10\xb0" + + "\xe5\xb2\xca\x06\x04t.x\xed\xe8\xf2\xa5?^\xf3\xbd" + + "\xc8\xdab\xd5ZZ\xfb\xd0\xff\\R9|t\xf1\xc3" + + " 5\xf9_\xae\xae\xea\xa5/\xb1\xd5\xecc\xf5\xae_" + + "P2\x14\xdd\\\x94\\T\xd6K\x84J\x00j" + + "Y\x94\\\xcd\xdd\xd2 \xca\xfb\xdc\xed\x1er\xb5\x85\xa3" + + "\xea\x9c\x8d\xbf\xfb\xf2\xe1\x08\x0e\xfb\xa47\x11b\xce\xb2" + + "\xaf^1X\xb9\xfe\xc8\x91\xe8A\xf7KnD\xf6\xbb" + + "K\xff\xf6\xddc\xb7\x1e\xcfg\xff\xe4\xe6\x92\x1f\xb3C" + + "\xd2B\x01P~W\xa2,\xafk\xa8\xe9\x9c{\xb0\xe7" + + "\x98\x07\xa5\xb7\xc5\xf3\xa7.\"\x85\xa3\xa7\xd2\x16\x17\\" + + "\xd5\xceW-\xb8\xf4\x18H\xf5l\xcc5\x88\xcb\x0bQ" + + "\x9e)\xd3\x02I\xbe\x1e\xe5\xb3Ru\x00\xce-\xd7v" + + ",\xff\xc2\xdc'ODM\x9a\x93\xa2\xb4\x92\x9bR\xb4" + + "\xdf\x9a\x05\xc7\xbfr\xc6-\xbf=Q\x16HWqi" + + "\xaa\x11\xe5\xd5)r\xfd2R~g\xf1\xb7\x0f\xd4'" + + "\xeb\xdf/\x0bS\x85\x9bA\xa9A\x94\xb7\x91n\xcb\xcd" + + "\xa9\xa7(\x99\xbe\xf9\xfa\x95\xc3\xaf\\\xf7\xde?\xca\x11" + + "u\xb7\xde4\xab\x17\xe5\x9d\xb3h\xebm\xb3\x08\xff;" + + "W\xfce\xc3\xf1\x9d\xb3>\x18\xe7Ws\xdd \xca\x9d" + + "u\xa4\xd9^w\xbd|/\xfdr^\x12\xefk\xee\xd8" + + "\xf0\xec\x87\x91\x8c\xdfZ\xd7M\x19\x7f\x87x\xcf\x91\x8d" + + "\xbf\xbf\xf2\xa3\xa8\xc3[\xea\xde$\x87\xef\xae#\x87\xd7" + + "\xbds\xf7\xc5\xb7\xaez\xf0\xe3\x08|\xfb\xebFi\xa9" + + "]\xd4u\x9e3\x0b\xb1\xccy\xfe\xcf\xcc\xb9\x19\xb5\xa0" + + "\x17\x16\xb6\x17\xed\x01\xae\xdbZF\xb5y/o\xb5\x0a" + + "\x86n\xf1\x1eD\xa5\x96\xc5\x00b\x08 \xa9\x83\x00\xca" + + "U\x0c\x95\x9c\x80\x12b\x8a\x00\x964\x12\x0e0Tl" + + "\x01%AHQ\xc9\x90\xae\x9e\x0b\xa0\xe4\x18*\xc3\x02" + + "\"K!\x03\x90\x8a\xdb\x01\x94a\x86\xcaf\x01\x9d\x02" + + "7\xf3\xaa\xceuH\xda\x9d\xa6\x89\xd5 `5\xa0c" + + "r\xdb\x1cQ\xfbr\x90\xe4\x11\xb18x\x8d\x8d5 " + + "`\x0d\xa03`\x14Mk\xa5n\xa3\x96\xeb\xe5kL" + + "n\xe1\x00V\x80\x80\x15\x80\x81{l\xbc{\x17\xe54" + + "\xae\xdb\xc9.}\x8dQ\xe6T\xf7DNu\x97\x9c\xda" + + "\x1cqj\xd3\"\x00e\x1dC\xe5\x06\x01%V\xf2j" + + "K#\xf5\x05\x86\xcaM\x02:\x19\xf7\x90\xae,\x00\x04" + + "\xf6\xae\xe1\xaa]4\xb9E\xb2S\x00{\x18\xban\x9d" + + "\x02\xb8a\x88\x9b\x96f\xe8\xbe\x9bI\xd5\xcc\x0c\x04\xa1" + + "\x98\x04\xaa\xcea\xcd\xb25\xbd\x7f\x85+o\xed1r" + + "Zf\x84\xbc\xaav\xed<}!\x00\xa24\xf3r\x00" + + "\x14$i\x11@\xab\xd6\xaf\x1b&w\xb2\x9a\x951t" + + "\x9d\x03\xcb\xd8\x1b\xfa\xd4\x9c\xaagxpP\xc5\xf8\x83" + + "\xbc\x03\xd2\xdc\x1c\xe2\xe6\xb9j$A\xe6\xf5\xa8\xa6\xca" + + "\xf2\x96R\x1d\xc4\xb1\xf3r\x00\xa5\x83\xa1\xd2\x13\x89\xe3" + + "R\x8a\xe3\x12\x86\xca\xa5\x918\xae\xa48\xf60TV" + + "\x09\xe8\x18\xa6\xd6\xaf\xe9\x17q`f\x14c\xcb\xd6\xd5" + + "<\xa7\x98\x95\xe2\xb1\xc1(\xd8\x9a\xa1[X\x1b\xd6Q" + + "@\xac\x9d\x1cu\xcf\x81$\xe56\xc5'\x11X{\x16" + + "Y\xfb\xff\x0c\x95\xcfE\xacm\xa6T>\x9f\xa1r\xa1" + + "\x80\x8e\x9a\xc9\x18E\xdd^\x01L\xed/\x03%\xcd!" + + "\x991yh\xaf\x7fl|\x82\xbc\xa3xg\xc8\xf4^" + + "\xee\xdd\xa9sMn\x89\xc5\x9cM\xd6T;\x8eg\xce" + + "|\x00e\x1eC\xe5|\x01k\xf0c\xc7\xb3\xa7i{" + + "hO\x037M\xc3\xc4\xda\xb0\xe6\x94\xbc\xcf\x94\x0e@" + + "C\xef\xe0\xb6\xaa\xe5\x90b\x14\xb4\xb9\xb2\x18M\x05r" + + "Q7y\xbff\xd9\xdc\xf4\xc4\xf3Z\x09\xe9\xbc\xa5\xc4" + + "\x82\xd0\xd5\xec\x02Pj\x19*\xa7\x09\xe8\xf4\x9bj\x86" + + "\xf7p\x135#\xbbL\xd5\x8d4\xe3\x19\x8c\x83\x80\xf1" + + "\xc8\xa1\xa7\x9c\xec\xa1\xbd\xdc*\xe6l\x0b\x82U\x93\xaf" + + "7y)\x08\xa5\xe5=\x0d\x9e\xcd\xa9\xc0\xe6\xf5s\xc3" + + "\xda\x13\xc0\xbd\xa9/\xbc\xbaArn\xa5\xc4\xb8\x81\xa1" + + "\xb2#r\xc9\xb7Q\x1a\xdf\xc6P\xb9G@)\x16K" + + "a\x0c@\xba\x9b\xd2x\x07Ce\x8f0\xb6B\xf1!" + + "\xae\xdb\x1dZ?\x88\xdc\x0a\xa5db\x87\xd6\xcf\x81Y" + + "\x9f5\xd1\x13S\xc4\xc3\xe8\xb3\x8c\x1c\xb7y\x07\xcf\xe4" + + "TS\xb5\xb5!\xee}/%\xa3\x0f\xead\x1b\xf6\xba" + + "\x88\xd0bC\x1f\x07S\x98\xd4%\xa8\xd0\x9a\xac^\x85" + + "\xea\xcb\x0b\xb6&\x1a\xbaE\x971\x82\xce\xc2\x89\xd01" + + "Ct\xd0\x07g4\x0a\x0e\x96\xc0\xd9\x15\xe2 \xc5\x04" + + "\x0f\x9c\xdd{\x01\x94=\x0c\x95\x07\x05l\xf5\xca2\xd6" + + "\x86l\xbc\x14P\xaf\xf8,1\xa0!\xa3\xe6\xba\x0a\x01" + + ",&/\xe4\xd4\x0c\xef\xc4R\xa1\x05D\x10\x10]\x14" + + "\xf3\x05\x93[\x16j\x86\xae\x14\xd5\x9c\xc6\xec\x91\xa0\xfd" + + "\xe8\xc5|\x8f\xc9\x8744\x8aV\xbbm\xf3\xbcX\xb0" + + "\xadq\xcdi\xd2\x00\xd1\x15\x16\xb5\x9cUV\xad\x1a\xc3" + + "\xf2\x10\x04\xa8\x89\xaa\xd59\x0c\x95\x05\x02&\x8bE-" + + "\x1b\x98\x9f32.n\x90\\\xa6\xe6\xf9\xb8\x8eR1" + + "\xe5u\x1as\x19{\xd4\xa4{\x9b\xfe\x9bJ\xfd\xe4\xfc" + + "\x85\\\x07\xb7\x1f\x86&S\x01hc\xa8,\x89\x98\xdc" + + "5?\xe2\x87o\xf2\xd2\xbe\xd0\x0f\xf1\xeb|\xc4\xb7\xaa" + + "\x81\xe7\xa9\xb8\xfa\xc1,9\xd3\x0e\xe2%\xa1\xced\xf6" + + "E/\xd4\xf2B\x83\xeb!\xd9\xb8\xc0\xb7Q\x1e\xc1n" + + "\x80\xf402Lo\xc6\xd0Ly\x13.\x02H\xaf#" + + "\xf9\x0d\x18Z*o\xc1z\x80\xf4F\x92\xdf\x84\x01\xcf" + + "\x92\xb7\xe2\x03\x00\xe9\x9bH|\x17\xa9\xc7\x98{%\xe4" + + "\x9d\xee\xf6;H\xbe\x87\xe4\xf1X\x0a\xe3\x00\xf2nl" + + "\x04H\xdfE\xf2GI^!\xa4\xb0\x02@\xde\x87\x83" + + "\x00\xe9\x87I\xfe8\xc9\xc5x\x8a\xa8\xa6\xbc\x1fM\x80" + + "\xf4OI\xfek\x92'f\xa70\x01 ?\xe9\xca\x9f" + + " \xf9s$\xaf\x9c\x93\xc2J\x00\xf9\x19\x1c\x05H?" + + "M\xf2\x03$\xaf\xc2\x14V\x01\xc8/\xe3.\x80\xf4\x01" + + "\x92\xff\x81\xe43*R8\x03@~\xc3\xb5\xe7 \xc9" + + "\xdf\"yu,\x85\xd5\x00\xf2\x1fq/@\xfa-\x92" + + "\xff\x9d\xe45b\x0ak\x00\xe4\xb7]\xbf\x8e\x93\x80t-\xc9O" + + "\x8b\xd2\x879x9@z6\xc9\xe7\xa1\x80\"\x8f\xcc" + + "y\x8afH\xb0rF\xff\x12M\x9f\xb0'\xf9\xc3#" + + "\xb4\x17\xabZ\xaehr\x08[b\xa9HtD\xba\xb4" + + "7Uj_C\xe9\x97\xa6\xe4\xc9\xa2\x85\"\x08(\x9e" + + "\xdccmZ\x1d\xa3\xd34\x0d4\xcb\xc8\xe7\xfc\x90|" + + "\x06\xdc\x938\xf4\xc5\x0c\x95\x15\x04E\x9b\x07\x85\xd2\x17" + + "\xd2\xe5\x86\x8cZ\xb4\xf88\x1f\x80q3x`[\x03" + + "F1\x97\xed\xe5 \xda\xe6HY\x08\xa6$\xa1i\x9e" + + "\xf4+N\xc2\xad8\xfe\xe8\x16\xfd\x09\xad\xd4\xbc\x0b\x04" + + "\xa9\x89*\x8e?\x8dD\x7f\x10/\xfd\xdf\x03 H\xa7" + + "\x87\x05\x00\xfd\x180C\x1f{\xe5\xbd\x0fn\x8e\xb6a" + + "\x0f\xe2\x7f\xe2\xd9\xe9\xb5\x9f\x93\xb8\xe9c\xa6WT\xc6" + + "\xc5\xe9\xf4\xcd\xe0\xcf\x9e\xb2\x9b^\xf9Y_\xe0~#" + + "\xf9w\x00\x00\x00\xff\xffH\xa22\xa3" func init() { schemas.Register(schema_db8274f9144abc7e,