diff --git a/404.html b/404.html index 66c6dcb91..0dd90769e 100644 --- a/404.html +++ b/404.html @@ -10,7 +10,7 @@ - + diff --git a/assets/js/144994e6.12bed236.js b/assets/js/144994e6.fd76df99.js similarity index 99% rename from assets/js/144994e6.12bed236.js rename to assets/js/144994e6.fd76df99.js index 36e0e5e59..c49b61efd 100644 --- a/assets/js/144994e6.12bed236.js +++ b/assets/js/144994e6.fd76df99.js @@ -1 +1 @@ -"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1171],{8162:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(4848),o=t(8453);const r={},i="RTPRelay",a={id:"development/components/rtprelay",title:"RTPRelay",description:"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.",source:"@site/docs/development/components/rtprelay.md",sourceDirName:"development/components",slug:"/development/components/rtprelay",permalink:"/docs/2.0.0/development/components/rtprelay",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/rtprelay.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Requester",permalink:"/docs/2.0.0/development/components/requester"},next:{title:"APIServer",permalink:"/docs/2.0.0/development/components/apiserver"}},c={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the RTPRelay with Docker",id:"launching-the-rtprelay-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"rtprelay",children:"RTPRelay"}),"\n",(0,s.jsx)(n.p,{children:"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly."}),"\n",(0,s.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,s.jsx)(n.p,{children:"Unlike other components, the RTPRelay service does not have a configuration file. However, the following environment is to configure the service:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"BIND_ADDR"})," - The IP address and port to bind the gRPC server. Defaults to ",(0,s.jsx)(n.code,{children:"0.0.0.0:51903"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_HOST"})," - The IP address or hostname of the RTPEngine service. Required."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_PORT"})," - The port of the RTPEngine service. Defaults to ",(0,s.jsx)(n.code,{children:"22222"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_TIMEOUT"})," - The timeout in milliseconds for the RTPEngine service. Defaults to ",(0,s.jsx)(n.code,{children:"5000"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,s.jsx)(n.p,{children:'Services communicate with RTPRelay service using gRPC. The RTPRelay, in turn, communicates with RTPEngine using the "ng protocol." The contract for communication with RTPRelay service consists of the following protobuf:'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map metadata = 3;\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Link to the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,s.jsx)(n.h2,{id:"launching-the-rtprelay-with-docker",children:"Launching the RTPRelay with Docker"}),"\n",(0,s.jsxs)(n.p,{children:["The RTPRelay is available as a Docker image from ",(0,s.jsx)(n.a,{href:"https://hub.docker.com/r/fonoster/routr-rtprelay",children:"Docker Hub"}),". To launch the RTPRelay with Docker, you can use the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'docker run -it -e RTPENGINE_HOST="rtpengine" -p 51903:51903 fonoster/routr-rtprelay\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The previous example will pull the latest version of the RTPRelay from Docker Hub and launch the service. The service will listen on the default port, ",(0,s.jsx)(n.code,{children:"51903"}),", for gRPC requests. Remember, your Docker container must expose the service's ports, too."]}),"\n",(0,s.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,s.jsxs)(n.p,{children:["One easy way to interact with the RTPRelay for testing and development is to use ",(0,s.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a SIP Message to the RTPRelay."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51901 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n"})})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(6540);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkroutr_docs=self.webpackChunkroutr_docs||[]).push([[1171],{8162:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var s=t(4848),o=t(8453);const r={},i="RTPRelay",a={id:"development/components/rtprelay",title:"RTPRelay",description:"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly.",source:"@site/docs/development/components/rtprelay.md",sourceDirName:"development/components",slug:"/development/components/rtprelay",permalink:"/docs/2.0.0/development/components/rtprelay",draft:!1,unlisted:!1,editUrl:"https://github.com/fonoster/routr-website/edit/main/docs/development/components/rtprelay.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Requester",permalink:"/docs/2.0.0/development/components/requester"},next:{title:"APIServer",permalink:"/docs/2.0.0/development/components/apiserver"}},c={},l=[{value:"Configuration Spec",id:"configuration-spec",level:2},{value:"Communication and Protobuf Spec",id:"communication-and-protobuf-spec",level:2},{value:"Launching the RTPRelay with Docker",id:"launching-the-rtprelay-with-docker",level:2},{value:"Quick Test with gRPCurl",id:"quick-test-with-grpcurl",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"rtprelay",children:"RTPRelay"}),"\n",(0,s.jsx)(n.p,{children:"The RTPRelay is an optional middleware service that can control RTPEngine instances. The RTPRelay component enables interoperability between WebRTC-based clients, such as SIP.js, and legacy SIP clients. Another use case for the RTPRelay is to help SIP clients who cannot send and receive media directly."}),"\n",(0,s.jsx)(n.h2,{id:"configuration-spec",children:"Configuration Spec"}),"\n",(0,s.jsx)(n.p,{children:"Unlike other components, the RTPRelay service does not have a configuration file. However, the following environment is to configure the service:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"BIND_ADDR"})," - The IP address and port to bind the gRPC server. Defaults to ",(0,s.jsx)(n.code,{children:"0.0.0.0:51903"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_HOST"})," - The IP address or hostname of the RTPEngine service. Required."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_PORT"})," - The port of the RTPEngine service. Defaults to ",(0,s.jsx)(n.code,{children:"22222"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"RTPENGINE_TIMEOUT"})," - The timeout in milliseconds for the RTPEngine service. Defaults to ",(0,s.jsx)(n.code,{children:"5000"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"communication-and-protobuf-spec",children:"Communication and Protobuf Spec"}),"\n",(0,s.jsx)(n.p,{children:'Services communicate with RTPRelay service using gRPC. The RTPRelay, in turn, communicates with RTPEngine using the "ng protocol." The contract for communication with RTPRelay service consists of the following protobuf:'}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-protobuf",children:'syntax = "proto3";\n\npackage fonoster.routr.processor.v2beta1;\n\nimport "common.proto";\nimport "sipmessage.proto";\n\n// Processor service\nservice Processor {\n // Process Message Request\n rpc ProcessMessage (MessageRequest) returns (MessageResponse) {}\n}\n\nenum Method {\n UNKNOWN = 0;\n // Communicates user location (hostname, IP)\n REGISTER = 1;\n // Establishes a session\n INVITE = 2;\n // Transports Instant Messages\n MESSAGE = 3;\n // Publishes an event to the Server\n PUBLISH = 4;\n // Notifies the subscriber of a new event\n NOTIFY = 5;\n // Subscribes for Notification from the notifier\n SUBSCRIBE = 6;\n // Confirms an INVITE request\n ACK = 7;\n // Terminates a session\n BYE = 8;\n // Cancels establishing of a session\n CANCEL = 9;\n // Communicates information about the capabilities of calling and receiving SIP phones\n OPTIONS = 10;\n // Provisional Acknowledgement\n PRACK = 11;\n // Sends mid-session information\n INFO = 12;\n // Asks the recipient to issue a call transfer\n REFER = 13;\n // Modifies the state of a session\n UPDATE = 14;\n}\n\nmessage NetInterface {\n string host = 1;\n int32 port = 2;\n fonoster.routr.common.v2beta1.Transport transport = 3;\n}\n\nmessage MessageRequest {\n // Same as the Call-Id header \n string ref = 1;\n string edge_port_ref = 2;\n Method method = 3;\n NetInterface sender = 4;\n repeated NetInterface listening_points = 5;\n repeated string external_addrs = 6;\n repeated string localnets = 7;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 8;\n map metadata = 9;\n}\n\nmessage MessageResponse {\n NetInterface sender = 1;\n fonoster.routr.sipmessage.v2beta1.SIPMessage message = 2;\n map metadata = 3;\n}\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Link to the ",(0,s.jsx)(n.a,{href:"https://github.com/fonoster/routr/blob/main/mods/common/src/protos/processor.proto",children:"protobuf definition."})]}),"\n",(0,s.jsx)(n.h2,{id:"launching-the-rtprelay-with-docker",children:"Launching the RTPRelay with Docker"}),"\n",(0,s.jsxs)(n.p,{children:["The RTPRelay is available as a Docker image from ",(0,s.jsx)(n.a,{href:"https://hub.docker.com/r/fonoster/routr-rtprelay",children:"Docker Hub"}),". To launch the RTPRelay with Docker, you can use the following command:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'docker run -it -e RTPENGINE_HOST="rtpengine" -p 51903:51903 fonoster/routr-rtprelay\n'})}),"\n",(0,s.jsxs)(n.p,{children:["The previous example will pull the latest version of the RTPRelay from Docker Hub and launch the service. The service will listen on the default port, ",(0,s.jsx)(n.code,{children:"51903"}),", for gRPC requests. Remember, your Docker container must expose the service's ports, too."]}),"\n",(0,s.jsx)(n.h2,{id:"quick-test-with-grpcurl",children:"Quick Test with gRPCurl"}),"\n",(0,s.jsxs)(n.p,{children:["One easy way to interact with the RTPRelay for testing and development is to use ",(0,s.jsx)(n.a,{href:"https://github.com/fullstorydev/grpcurl",children:"gRPCurl"}),". The following example shows how to send a SIP Message to the RTPRelay."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"grpcurl -plaintext \\\n -import-path /path/to/protos \\\n -proto processor.proto -d '{...}' \\\n localhost:51903 \\\n fonoster.routr.processor.v2beta1.Processor/ProcessMessage\n"})})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(6540);const o={},r=s.createContext(o);function i(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.890c7b2a.js b/assets/js/runtime~main.72dbc684.js similarity index 99% rename from assets/js/runtime~main.890c7b2a.js rename to assets/js/runtime~main.72dbc684.js index 557c8d43a..139e91ae7 100644 --- a/assets/js/runtime~main.890c7b2a.js +++ b/assets/js/runtime~main.72dbc684.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,d,f,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var d=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(d.exports,d,d.exports,r),d.loaded=!0,d.exports}r.m=b,r.c=t,e=[],r.O=(a,d,f,c)=>{if(!d){var b=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](d[o])))?d.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[d,f,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,d({}),d([]),d(d)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=d(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var d in a)r.o(a,d)&&!r.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:a[d]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,d)=>(r.f[d](e,a),a)),[])),r.u=e=>"assets/js/"+({1:"118e913f",49:"e10372bb",208:"1b166456",286:"d7a9d534",364:"54969ead",529:"7c32d245",537:"321dfeeb",583:"5514a4b8",620:"8ac6f1f4",767:"7efb1a82",803:"b5de05fe",821:"646468fb",823:"4d0c799d",831:"3a673d53",911:"5ef0e9d6",1079:"a7c6e145",1080:"759bfbe1",1171:"144994e6",1214:"876e022a",1224:"943e77c3",1304:"35bee977",1459:"4d54d076",1703:"210b7c69",1780:"39d73575",1870:"918bfdcb",1953:"b1e2c3e5",2138:"1a4e3797",2333:"3f9d54d1",2358:"95069fb2",2401:"26da1a01",2405:"7df8ae3f",2433:"5a1924d4",2506:"0f2bd920",2514:"ee7973d9",2607:"d3c35fce",2634:"c4f5d8e4",2692:"129db88c",2964:"2a36568f",3102:"9fcefd11",3191:"02617853",3244:"6a8a88b7",3296:"8613bfde",3383:"1ad9bfe0",3539:"9beb87c2",3578:"76273f75",3624:"43d3d555",3688:"a0c5838c",3690:"0abf3980",3738:"06896101",3741:"8a9effda",3797:"bc843d59",3857:"a30498ab",4011:"ea5491a0",4050:"956a4ea6",4082:"b396445b",4126:"19dd4331",4236:"ed175a37",4366:"6e2907e5",4480:"3c0cfdd0",4682:"99f83bea",4714:"093b4e4f",4719:"8d7e75fb",4862:"6c35bbce",5009:"656951a7",5056:"1cd31f12",5362:"8f5f22a9",5365:"bc2f9ced",5613:"3e7ceef0",5659:"b8ab588d",5804:"bb373259",5872:"a552b93b",6038:"5e82a060",6099:"f5184ac4",6341:"6c14cd7d",6346:"bc1a89ad",6541:"09b719bb",6549:"db70960d",6575:"f4357d2a",6615:"4dcd5895",6692:"4e3cbe94",6695:"9799683e",6782:"deaab6a5",6792:"1ea220c7",6903:"ff3f7f2b",6926:"40f2a0b4",6944:"3325c53c",7063:"d72ac48e",7098:"a7bd4aaa",7225:"23efd64d",7337:"9a5a69d5",7372:"a9d63626",7387:"f3f39cc5",7408:"9a4dfeaa",7638:"ed519cbf",7782:"1ffdd7de",7940:"92a92b88",8167:"9840208a",8190:"b3bbf2ca",8253:"4e27cd47",8329:"64332b0f",8353:"40f2f3c6",8401:"17896441",8512:"1a1a9e3d",8535:"411db075",8581:"935f2afb",8732:"b4dd6982",8755:"f1b4aa58",8911:"71153375",8937:"7cf72cd4",9012:"5a510007",9042:"72607e62",9048:"a94703ab",9188:"a4cb0559",9465:"c2ef5137",9504:"21169ea0",9537:"c60c73ac",9583:"81e5f1d0",9647:"5e95c892",9692:"da51cc8f",9845:"017ddd06",9900:"ec64d50d",9922:"a40a3312",9953:"33664cb1",9955:"9d10a623"}[e]||e)+"."+{1:"22aac4d7",49:"f875b5b9",208:"afa392b3",286:"acc28f6a",364:"01cf159a",416:"2c3d437b",529:"80c5bf10",537:"607289a8",583:"b85640cf",620:"56eaa81a",767:"15e4652c",803:"2a9dab58",821:"28bd5243",823:"82777be3",831:"2766e28e",911:"72a3fe22",1079:"b8df2a42",1080:"035fb5f8",1171:"12bed236",1214:"fec538fd",1224:"c18b42bc",1304:"4e13b84b",1459:"07298993",1703:"f12cb937",1780:"2275c69d",1870:"982771c7",1953:"f009a04f",2138:"9432810d",2237:"09ea1ac9",2333:"c4d5fa12",2358:"b3b4552d",2401:"3be03227",2405:"46854fda",2433:"161693fb",2506:"1ab834b7",2514:"d3592e4d",2607:"81e9ce52",2634:"4659817a",2692:"13220621",2964:"d948f060",3102:"f0fb126c",3191:"a06ae3cb",3244:"4d11689b",3296:"82349e8a",3383:"ba73e09d",3539:"5ebf1e1f",3578:"60924f2a",3624:"fc23fdad",3688:"5b15e2b4",3690:"d6c002e8",3738:"5deb77fe",3741:"5b2b876e",3797:"b0cc575a",3857:"812d55ec",4011:"a12d1751",4050:"65e6eb8e",4082:"4d16d64d",4126:"92fe643f",4236:"09425780",4366:"766a8f96",4480:"c1beae7e",4682:"e53f7fb4",4714:"b05d61ed",4719:"639e4c36",4862:"00ee5040",5009:"c9f52622",5056:"a5a94d63",5362:"b0c4d9ca",5365:"dba43639",5613:"c6e6babd",5659:"06e68070",5804:"65ebe2ba",5872:"6326ae55",6038:"c1d9a442",6099:"15ae4dba",6341:"f1e17186",6346:"81431dea",6541:"105201e4",6549:"892a5e80",6575:"a6c56766",6615:"fb90af12",6692:"0efb67be",6695:"8030dda4",6782:"e271f229",6792:"919e9360",6903:"b883c263",6926:"bcebf01b",6944:"2eb5404e",7063:"b02011c0",7098:"eccafe3d",7225:"69bca8aa",7337:"1e1e317b",7372:"ef9d935a",7387:"ca80ae11",7408:"a4107647",7638:"c20eaab7",7782:"43072233",7940:"2c0f2381",8167:"22624fd6",8190:"60bb6537",8253:"40cb91a8",8329:"849013cf",8353:"6108f911",8401:"04422b2e",8512:"25a9d97e",8535:"9b5d818d",8581:"9b7d34d8",8732:"a5471632",8755:"d829509f",8911:"1ac7f02d",8913:"0805a9ae",8937:"cce3242e",9012:"f35cb9c6",9042:"8c39e033",9048:"75b37e51",9188:"b622069b",9462:"7d4144d6",9465:"98ec0fa4",9504:"41ddd5b2",9537:"f7a57bd6",9583:"d7a2877e",9647:"0fe135c9",9692:"b5045421",9845:"bd7758e0",9900:"390e4709",9922:"2b4c3cf4",9953:"e1df95ca",9955:"4e6d4ada"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},c="routr-docs:",r.l=(e,a,d,b)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==d)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(d))),a)return a(d)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"8401",71153375:"8911","118e913f":"1",e10372bb:"49","1b166456":"208",d7a9d534:"286","54969ead":"364","7c32d245":"529","321dfeeb":"537","5514a4b8":"583","8ac6f1f4":"620","7efb1a82":"767",b5de05fe:"803","646468fb":"821","4d0c799d":"823","3a673d53":"831","5ef0e9d6":"911",a7c6e145:"1079","759bfbe1":"1080","144994e6":"1171","876e022a":"1214","943e77c3":"1224","35bee977":"1304","4d54d076":"1459","210b7c69":"1703","39d73575":"1780","918bfdcb":"1870",b1e2c3e5:"1953","1a4e3797":"2138","3f9d54d1":"2333","95069fb2":"2358","26da1a01":"2401","7df8ae3f":"2405","5a1924d4":"2433","0f2bd920":"2506",ee7973d9:"2514",d3c35fce:"2607",c4f5d8e4:"2634","129db88c":"2692","2a36568f":"2964","9fcefd11":"3102","02617853":"3191","6a8a88b7":"3244","8613bfde":"3296","1ad9bfe0":"3383","9beb87c2":"3539","76273f75":"3578","43d3d555":"3624",a0c5838c:"3688","0abf3980":"3690","06896101":"3738","8a9effda":"3741",bc843d59:"3797",a30498ab:"3857",ea5491a0:"4011","956a4ea6":"4050",b396445b:"4082","19dd4331":"4126",ed175a37:"4236","6e2907e5":"4366","3c0cfdd0":"4480","99f83bea":"4682","093b4e4f":"4714","8d7e75fb":"4719","6c35bbce":"4862","656951a7":"5009","1cd31f12":"5056","8f5f22a9":"5362",bc2f9ced:"5365","3e7ceef0":"5613",b8ab588d:"5659",bb373259:"5804",a552b93b:"5872","5e82a060":"6038",f5184ac4:"6099","6c14cd7d":"6341",bc1a89ad:"6346","09b719bb":"6541",db70960d:"6549",f4357d2a:"6575","4dcd5895":"6615","4e3cbe94":"6692","9799683e":"6695",deaab6a5:"6782","1ea220c7":"6792",ff3f7f2b:"6903","40f2a0b4":"6926","3325c53c":"6944",d72ac48e:"7063",a7bd4aaa:"7098","23efd64d":"7225","9a5a69d5":"7337",a9d63626:"7372",f3f39cc5:"7387","9a4dfeaa":"7408",ed519cbf:"7638","1ffdd7de":"7782","92a92b88":"7940","9840208a":"8167",b3bbf2ca:"8190","4e27cd47":"8253","64332b0f":"8329","40f2f3c6":"8353","1a1a9e3d":"8512","411db075":"8535","935f2afb":"8581",b4dd6982:"8732",f1b4aa58:"8755","7cf72cd4":"8937","5a510007":"9012","72607e62":"9042",a94703ab:"9048",a4cb0559:"9188",c2ef5137:"9465","21169ea0":"9504",c60c73ac:"9537","81e5f1d0":"9583","5e95c892":"9647",da51cc8f:"9692","017ddd06":"9845",ec64d50d:"9900",a40a3312:"9922","33664cb1":"9953","9d10a623":"9955"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,d)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)d.push(f[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var c=new Promise(((d,c)=>f=e[a]=[d,c]));d.push(f[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,(d=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var c=d&&("load"===d.type?"missing":d.type),b=d&&d.target&&d.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,d)=>{var f,c,b=d[0],t=d[1],o=d[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(d);n{"use strict";var e,a,d,f,c,b={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var d=t[e]={id:e,loaded:!1,exports:{}};return b[e].call(d.exports,d,d.exports,r),d.loaded=!0,d.exports}r.m=b,r.c=t,e=[],r.O=(a,d,f,c)=>{if(!d){var b=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](d[o])))?d.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[d,f,c]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},d=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};a=a||[null,d({}),d([]),d(d)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=d(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,r.d(c,b),c},r.d=(e,a)=>{for(var d in a)r.o(a,d)&&!r.o(e,d)&&Object.defineProperty(e,d,{enumerable:!0,get:a[d]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((a,d)=>(r.f[d](e,a),a)),[])),r.u=e=>"assets/js/"+({1:"118e913f",49:"e10372bb",208:"1b166456",286:"d7a9d534",364:"54969ead",529:"7c32d245",537:"321dfeeb",583:"5514a4b8",620:"8ac6f1f4",767:"7efb1a82",803:"b5de05fe",821:"646468fb",823:"4d0c799d",831:"3a673d53",911:"5ef0e9d6",1079:"a7c6e145",1080:"759bfbe1",1171:"144994e6",1214:"876e022a",1224:"943e77c3",1304:"35bee977",1459:"4d54d076",1703:"210b7c69",1780:"39d73575",1870:"918bfdcb",1953:"b1e2c3e5",2138:"1a4e3797",2333:"3f9d54d1",2358:"95069fb2",2401:"26da1a01",2405:"7df8ae3f",2433:"5a1924d4",2506:"0f2bd920",2514:"ee7973d9",2607:"d3c35fce",2634:"c4f5d8e4",2692:"129db88c",2964:"2a36568f",3102:"9fcefd11",3191:"02617853",3244:"6a8a88b7",3296:"8613bfde",3383:"1ad9bfe0",3539:"9beb87c2",3578:"76273f75",3624:"43d3d555",3688:"a0c5838c",3690:"0abf3980",3738:"06896101",3741:"8a9effda",3797:"bc843d59",3857:"a30498ab",4011:"ea5491a0",4050:"956a4ea6",4082:"b396445b",4126:"19dd4331",4236:"ed175a37",4366:"6e2907e5",4480:"3c0cfdd0",4682:"99f83bea",4714:"093b4e4f",4719:"8d7e75fb",4862:"6c35bbce",5009:"656951a7",5056:"1cd31f12",5362:"8f5f22a9",5365:"bc2f9ced",5613:"3e7ceef0",5659:"b8ab588d",5804:"bb373259",5872:"a552b93b",6038:"5e82a060",6099:"f5184ac4",6341:"6c14cd7d",6346:"bc1a89ad",6541:"09b719bb",6549:"db70960d",6575:"f4357d2a",6615:"4dcd5895",6692:"4e3cbe94",6695:"9799683e",6782:"deaab6a5",6792:"1ea220c7",6903:"ff3f7f2b",6926:"40f2a0b4",6944:"3325c53c",7063:"d72ac48e",7098:"a7bd4aaa",7225:"23efd64d",7337:"9a5a69d5",7372:"a9d63626",7387:"f3f39cc5",7408:"9a4dfeaa",7638:"ed519cbf",7782:"1ffdd7de",7940:"92a92b88",8167:"9840208a",8190:"b3bbf2ca",8253:"4e27cd47",8329:"64332b0f",8353:"40f2f3c6",8401:"17896441",8512:"1a1a9e3d",8535:"411db075",8581:"935f2afb",8732:"b4dd6982",8755:"f1b4aa58",8911:"71153375",8937:"7cf72cd4",9012:"5a510007",9042:"72607e62",9048:"a94703ab",9188:"a4cb0559",9465:"c2ef5137",9504:"21169ea0",9537:"c60c73ac",9583:"81e5f1d0",9647:"5e95c892",9692:"da51cc8f",9845:"017ddd06",9900:"ec64d50d",9922:"a40a3312",9953:"33664cb1",9955:"9d10a623"}[e]||e)+"."+{1:"22aac4d7",49:"f875b5b9",208:"afa392b3",286:"acc28f6a",364:"01cf159a",416:"2c3d437b",529:"80c5bf10",537:"607289a8",583:"b85640cf",620:"56eaa81a",767:"15e4652c",803:"2a9dab58",821:"28bd5243",823:"82777be3",831:"2766e28e",911:"72a3fe22",1079:"b8df2a42",1080:"035fb5f8",1171:"fd76df99",1214:"fec538fd",1224:"c18b42bc",1304:"4e13b84b",1459:"07298993",1703:"f12cb937",1780:"2275c69d",1870:"982771c7",1953:"f009a04f",2138:"9432810d",2237:"09ea1ac9",2333:"c4d5fa12",2358:"b3b4552d",2401:"3be03227",2405:"46854fda",2433:"161693fb",2506:"1ab834b7",2514:"d3592e4d",2607:"81e9ce52",2634:"4659817a",2692:"13220621",2964:"d948f060",3102:"f0fb126c",3191:"a06ae3cb",3244:"4d11689b",3296:"82349e8a",3383:"ba73e09d",3539:"5ebf1e1f",3578:"60924f2a",3624:"fc23fdad",3688:"5b15e2b4",3690:"d6c002e8",3738:"5deb77fe",3741:"5b2b876e",3797:"b0cc575a",3857:"812d55ec",4011:"a12d1751",4050:"65e6eb8e",4082:"4d16d64d",4126:"92fe643f",4236:"09425780",4366:"766a8f96",4480:"c1beae7e",4682:"e53f7fb4",4714:"b05d61ed",4719:"639e4c36",4862:"00ee5040",5009:"c9f52622",5056:"a5a94d63",5362:"b0c4d9ca",5365:"dba43639",5613:"c6e6babd",5659:"06e68070",5804:"65ebe2ba",5872:"6326ae55",6038:"c1d9a442",6099:"15ae4dba",6341:"f1e17186",6346:"81431dea",6541:"105201e4",6549:"892a5e80",6575:"a6c56766",6615:"fb90af12",6692:"0efb67be",6695:"8030dda4",6782:"e271f229",6792:"919e9360",6903:"b883c263",6926:"bcebf01b",6944:"2eb5404e",7063:"b02011c0",7098:"eccafe3d",7225:"69bca8aa",7337:"1e1e317b",7372:"ef9d935a",7387:"ca80ae11",7408:"a4107647",7638:"c20eaab7",7782:"43072233",7940:"2c0f2381",8167:"22624fd6",8190:"60bb6537",8253:"40cb91a8",8329:"849013cf",8353:"6108f911",8401:"04422b2e",8512:"25a9d97e",8535:"9b5d818d",8581:"9b7d34d8",8732:"a5471632",8755:"d829509f",8911:"1ac7f02d",8913:"0805a9ae",8937:"cce3242e",9012:"f35cb9c6",9042:"8c39e033",9048:"75b37e51",9188:"b622069b",9462:"7d4144d6",9465:"98ec0fa4",9504:"41ddd5b2",9537:"f7a57bd6",9583:"d7a2877e",9647:"0fe135c9",9692:"b5045421",9845:"bd7758e0",9900:"390e4709",9922:"2b4c3cf4",9953:"e1df95ca",9955:"4e6d4ada"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},c="routr-docs:",r.l=(e,a,d,b)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==d)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(d))),a)return a(d)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/",r.gca=function(e){return e={17896441:"8401",71153375:"8911","118e913f":"1",e10372bb:"49","1b166456":"208",d7a9d534:"286","54969ead":"364","7c32d245":"529","321dfeeb":"537","5514a4b8":"583","8ac6f1f4":"620","7efb1a82":"767",b5de05fe:"803","646468fb":"821","4d0c799d":"823","3a673d53":"831","5ef0e9d6":"911",a7c6e145:"1079","759bfbe1":"1080","144994e6":"1171","876e022a":"1214","943e77c3":"1224","35bee977":"1304","4d54d076":"1459","210b7c69":"1703","39d73575":"1780","918bfdcb":"1870",b1e2c3e5:"1953","1a4e3797":"2138","3f9d54d1":"2333","95069fb2":"2358","26da1a01":"2401","7df8ae3f":"2405","5a1924d4":"2433","0f2bd920":"2506",ee7973d9:"2514",d3c35fce:"2607",c4f5d8e4:"2634","129db88c":"2692","2a36568f":"2964","9fcefd11":"3102","02617853":"3191","6a8a88b7":"3244","8613bfde":"3296","1ad9bfe0":"3383","9beb87c2":"3539","76273f75":"3578","43d3d555":"3624",a0c5838c:"3688","0abf3980":"3690","06896101":"3738","8a9effda":"3741",bc843d59:"3797",a30498ab:"3857",ea5491a0:"4011","956a4ea6":"4050",b396445b:"4082","19dd4331":"4126",ed175a37:"4236","6e2907e5":"4366","3c0cfdd0":"4480","99f83bea":"4682","093b4e4f":"4714","8d7e75fb":"4719","6c35bbce":"4862","656951a7":"5009","1cd31f12":"5056","8f5f22a9":"5362",bc2f9ced:"5365","3e7ceef0":"5613",b8ab588d:"5659",bb373259:"5804",a552b93b:"5872","5e82a060":"6038",f5184ac4:"6099","6c14cd7d":"6341",bc1a89ad:"6346","09b719bb":"6541",db70960d:"6549",f4357d2a:"6575","4dcd5895":"6615","4e3cbe94":"6692","9799683e":"6695",deaab6a5:"6782","1ea220c7":"6792",ff3f7f2b:"6903","40f2a0b4":"6926","3325c53c":"6944",d72ac48e:"7063",a7bd4aaa:"7098","23efd64d":"7225","9a5a69d5":"7337",a9d63626:"7372",f3f39cc5:"7387","9a4dfeaa":"7408",ed519cbf:"7638","1ffdd7de":"7782","92a92b88":"7940","9840208a":"8167",b3bbf2ca:"8190","4e27cd47":"8253","64332b0f":"8329","40f2f3c6":"8353","1a1a9e3d":"8512","411db075":"8535","935f2afb":"8581",b4dd6982:"8732",f1b4aa58:"8755","7cf72cd4":"8937","5a510007":"9012","72607e62":"9042",a94703ab:"9048",a4cb0559:"9188",c2ef5137:"9465","21169ea0":"9504",c60c73ac:"9537","81e5f1d0":"9583","5e95c892":"9647",da51cc8f:"9692","017ddd06":"9845",ec64d50d:"9900",a40a3312:"9922","33664cb1":"9953","9d10a623":"9955"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,d)=>{var f=r.o(e,a)?e[a]:void 0;if(0!==f)if(f)d.push(f[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var c=new Promise(((d,c)=>f=e[a]=[d,c]));d.push(f[2]=c);var b=r.p+r.u(a),t=new Error;r.l(b,(d=>{if(r.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var c=d&&("load"===d.type?"missing":d.type),b=d&&d.target&&d.target.src;t.message="Loading chunk "+a+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,f[1](t)}}),"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,d)=>{var f,c,b=d[0],t=d[1],o=d[2],n=0;if(b.some((a=>0!==e[a]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(a&&a(d);n