From cdf67b49df9be024a5e4eb9c439d4399fea12911 Mon Sep 17 00:00:00 2001 From: ngrok release bot Date: Mon, 13 Mar 2023 23:06:28 +0000 Subject: [PATCH] Update generated files --- .tox/.package.lock | 0 .tox/dist/ngrok-api-0.0.0.zip | Bin 0 -> 50531 bytes .tox/log/.lock | 0 .tox/log/GLOB-0.log | 64 + README.md | 4 + doc/source/application_sessions.rst | 9 + doc/source/application_users.rst | 9 + doc/source/index.rst | 2 + docs/_modules/index.html | 2 + docs/_modules/ngrok/client.html | 48 +- docs/_modules/ngrok/datatypes.html | 1548 ++++++++++++----- docs/_modules/ngrok/error.html | 8 +- docs/_modules/ngrok/services.html | 585 ++++--- docs/_sources/application_sessions.rst.txt | 9 + docs/_sources/application_users.rst.txt | 9 + docs/_sources/index.rst.txt | 2 + docs/_static/pygments_dark.css | 55 +- docs/abuse_reports.html | 2 + docs/agent_ingresses.html | 2 + docs/api_keys.html | 17 +- docs/application_sessions.html | 292 ++++ docs/application_users.html | 292 ++++ docs/certificate_authorities.html | 2 + docs/client.html | 26 +- docs/credentials.html | 9 +- docs/datatypes.html | 752 +++++++- docs/edge_route_backend_module.html | 2 + docs/edge_route_circuit_breaker_module.html | 2 + docs/edge_route_compression_module.html | 2 + docs/edge_route_ip_restriction_module.html | 2 + docs/edge_route_o_auth_module.html | 2 + docs/edge_route_oidc_module.html | 2 + docs/edge_route_request_headers_module.html | 2 + docs/edge_route_response_headers_module.html | 2 + docs/edge_route_saml_module.html | 2 + ...dge_route_webhook_verification_module.html | 2 + ..._route_websocket_tcp_converter_module.html | 2 + docs/edges_https.html | 2 + docs/edges_https_routes.html | 2 + docs/edges_tcp.html | 2 + docs/edges_tls.html | 2 + docs/endpoints.html | 2 + docs/errors.html | 2 + docs/event_destinations.html | 4 +- docs/event_sources.html | 2 + docs/event_subscriptions.html | 2 + docs/failover_backends.html | 8 +- docs/genindex.html | 234 ++- docs/http_response_backends.html | 2 + docs/https_edge_mutual_tls_module.html | 2 + docs/https_edge_tls_termination_module.html | 2 + docs/index.html | 4 + docs/ip_policies.html | 2 + docs/ip_policy_rules.html | 2 + docs/ip_restrictions.html | 2 + docs/objects.inv | Bin 6132 -> 6689 bytes docs/py-modindex.html | 2 + docs/reserved_addrs.html | 2 + docs/reserved_domains.html | 5 +- docs/search.html | 2 + docs/searchindex.js | 2 +- docs/ssh_certificate_authorities.html | 2 + docs/ssh_credentials.html | 9 +- docs/ssh_host_certificates.html | 2 + docs/ssh_user_certificates.html | 7 +- docs/tcp_edge_backend_module.html | 2 + docs/tcp_edge_ip_restriction_module.html | 2 + docs/tls_certificates.html | 6 +- docs/tls_edge_backend_module.html | 2 + docs/tls_edge_ip_restriction_module.html | 2 + docs/tls_edge_mutual_tls_module.html | 2 + docs/tls_edge_tls_termination_module.html | 2 + docs/tunnel_group_backends.html | 2 + docs/tunnel_sessions.html | 2 + docs/tunnels.html | 2 + docs/weighted_backends.html | 2 + ngrok/client.py | 12 +- ngrok/datatypes.py | 626 ++++++- ngrok/services.py | 157 +- setup.py | 2 +- tests/test_ngrok.py | 2 +- tox.ini | 2 +- 82 files changed, 4069 insertions(+), 839 deletions(-) create mode 100755 .tox/.package.lock create mode 100644 .tox/dist/ngrok-api-0.0.0.zip create mode 100755 .tox/log/.lock create mode 100644 .tox/log/GLOB-0.log create mode 100644 doc/source/application_sessions.rst create mode 100644 doc/source/application_users.rst create mode 100644 docs/_sources/application_sessions.rst.txt create mode 100644 docs/_sources/application_users.rst.txt create mode 100644 docs/application_sessions.html create mode 100644 docs/application_users.html diff --git a/.tox/.package.lock b/.tox/.package.lock new file mode 100755 index 0000000..e69de29 diff --git a/.tox/dist/ngrok-api-0.0.0.zip b/.tox/dist/ngrok-api-0.0.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..08aecaa51cb39da12911ccedaf04c0a764d1ff47 GIT binary patch literal 50531 zcmb5V1F$7cv?YA5ZQJPUzI|=mc3<1JZS=Km+qP}nwx+-L{(s)g#P=p*PDNIosL0IP zm9h4Uy>so7lLP@p1^n~tZ?RJOk3aw43GwgM+Qi<*f>zJgjFy4!??Es3-}XlTm)?#> z4vr50k7NGhiT{@|B>(c9{}}W8ua$I0CML9I*2Xsfa{|c!cr62XM-VX(0KgI)0Koj0 z3FIV2X~ktkWD}Lvt=B~my|$|{N9fUYBM$8MEC?g5g;snj9>|N?H z)<52-;!(+ly-GpF4yFz>*iA-cPmJg~Gd{wW;#3q{WVS*RE9{`l8r~S#A{x5vRbDVk-d7Ykfm15H?iO`kQd#0 zR1R?6WM}qu#6z=qM8vFQOV=bRN%PwuBsbALA-Vj?wU4|VKHES0s!mi>ox@mLDozk4 z%gpzWeXpvdtE{k4AlndE20wyOlU{m7`QV9$d;OutddX3MB`Q~FozckQt9K%Mi3(3P2=Il;7`Y6bLF*j232M;r zh=imUG8Is27#wFBhOdPYypxyz#i`V1>(HrIf*1w?ozdZ@6cWK zJ2pBq+8NXZfcp{G0A^hyz%-P&N*ZRvE1=mU#XXkt8e-aS z+`f6`5WS3Y!5;}6a%OyQHfhVJ9;3n-g1yjKs7#P$PAfHAH@OZ$`zxrmvS5q9QtB+zof<$@S9BlX z1%4UO*tzgNXsP|-aR(V^#?+QyVh~^5JE7R3r;hMvq^zjwy@g49wkw`-De>yP2$eXp z@DQRAU2^WiMR;Hwvod^PX#4tU_WR&;I-eS|vlaiUDvg7o8~(p|pRJp%y^Xn%fg_!x zjg@7D4Ata>_$+M|4W0O8)FG7wEzKm21g%Pqa_Er)0Jv~(A%4z3{^KJDd#yJh9XDaoqgvc(PMi5={Y;5aC;&x`5ytWWdBM zs0T*m?2@PuP?Rlxq@k8jUgyn@J*L0lVgjJM{w`oKmw+y)HUA9c;(-l3$onmshpwnX za>a$=6o6NTo|2XW)wzzyB~F$nv89i~Rh!0#lS>Q)E`huI>ur4o5eP#F{W|}MwDgYR z(RxRe&pXF0%$=YH4U~^?1`L@H+eVn8LXL^DeioWeP;xJx0;4{~PjSf2e4m-U9c3ag*!3{ZO%IO0E5jkE2ftP4Lp>qzNGTyb23 zxoo_kv%P(-=zh4IIyAZx%y)UZztpI8H@t>7;Mn;z#Fv=<^#*}9)TjbaRQhIW+1hxO zrD{`%T}P~lh0SSh7ZnDAPCqX=5y=CTI728=0<&(KbB==-xm)Y-B0VQel&^q^E*Sx zeLh;3B4^72riumr3b{8OvGX#Nq(9fX*_ash=w*)!^jGwN?ySq$+Y#Ml>{u!~_BFLc+j4Iv4|y*d z9-X&v%VG}lGi!xMZ4@x6=u_29mSt3L1$wXDZLRmQe$TUDdyz{(Ig7FYfumy67y>f z+R!wZzt|$-<~|qg+UP(}NgS9%et5s=Jz@M8DE|rhE-C~%{t2qc|F(alLkA;ACtErL zW0MFOY1x?R3CZ!8Ln?8p7}nXRJFsObh7H854UQTI|NU6eGENyo1T&V6@LuZkx$ zv9LXHA8*(cGL`WswX1LznnwubC)#Bm;wB2zY0dA&sceXF7tt&&SmlM@B4f#@>x8FK zd=Z)TL(D_=9{vcu7=7V~O1gUAt+UaxUC1&&S{Zn@$xO?)j6EggN$N@ zNn8X_1W-b+k^?>Sh|y5zgfg3vV*YTutLPPi0ktQ#@qI zi;haFdUFXs*KX-$6Gf<2UH-C~dq;S%khe7h*?+Q*HrBv- z97z4{N~M=aAfUEpW?gW5cHumCofn_gVuT+b(&ggzSakUTItBN=3=Ps5jpQ?dy&I-WjNYLx=~fegu<)zefJ4Xs;t^U{kLd5+x% z8^`F`Iu$(zM`&3G(cQcEyJL84iE<{2&&{vilKZu%#+}4a?C>tX10_S`M<%=0@N#JDQ;p=DNPEp5%EA_~(g4|Xv65pM?E4-3`SRxnXX{)5;k zxsh2>0ZpZ=IISWW`l>V+_`f++Wza`-`)xsZ@9u+by;M%mNabb{xx*_{@C$n}+NP~jM@ZYKGM zA`UEvGpzzS)StXOd=8o}xUtXPg2gPR^}%DCXQiM-INjz*O&1vGR^p=;#F5x#qHKj$ zh6rQ17#U%iWWU{!8BV=lo+y*xi^}uL_o*YO?O%<6P zOuwO1eTQCh8f@fsG#yDv$H>)z;7a~`!n1ZJlr0q&ANs~;i^~l6l8UM5MpJ;ZKW!|OiY8$E zdz4&suuf2v{b^J^T#Lfu>4+j8yH-Ob9x|n%k&tE|ISCm9=Ox*^{ZhmN`98B!FImvT zDVxQ=x2CcY_3|_sTkhrZIq}6IXJxP#zDVAjWG{b^e#L1ClYV9CvmYSi_hS~+BzMB` z=wlH%LOP@`EIZ@w5D`B^+78aB;iaW@6oTs7|2l|J%SsN#vA3I1L&C(YuQcB!LSWOy ztmx_#;w)H(2o6m#gY>G-3#ENa$%rA#g~1P}Z#Cpb2SK__7tXGcd2;fq=nqDp6-w$c zbXzj~*@CZ?oBt+2MA&?-CzH)!R@jV`;?()3;oby(f23bhOE2AsMjcq4I5X!Oh>C5@ zNvzzWWU7$-*`1j;6$%O*E*u0>5iJ(Q|9_Q@-5?!?Zj1 z4?E>vF$A}1Zij^U3I?{VWzXzHuigW5{5oV7%2(DKbY%6}iw2_!DzqY!LglaoIII?_ z0p)pH*|zotS||Rw!m;PT!s3&QueU5)B18-nhu@7~v>0fNo)!S8e-=+fd!A9tkn5s} z6eosO8OUX;NQTqY#+L24M4oOyfm$WW^&P*Vdxnl=XOWD$7oI(JW%a}-vU0NTP=;L$ zfY#_AY=Xf-#O*r>#J(#~Rcjx;vg#Te6Em_!EJPNM9j8v_`K%0=dn;8%R2I0=r2Sr{ z_!`HN)K}cDwqB(|!W9eD)YvJbJ1}oE2Wfmm_QscSq0>)IFVuo|t=1Zb;*YJ32OM=B zCxLjNHgLd%Fu@*Ng!RU>k`jWjfNRO;ua1Aw7uYzFTGp=xvH{AYW`5+{SBw7vvc{ed z9^H6ekAjbBnuNO4R8uFw&rj)5=J%!-h{ur!zupePbjF6_oac8)@*40F*L#Ybb<4d5 z=e|&5f^Qc`oVl`4fI$kw4}_nVI!c8*R^t{DX6XIPHn*3q_f_XwE#nNn4ky_bVrhTq zV0LmIDS4oiPdx*%EdeTsnsT~%dl$<$l{VZ#1{B7}+o9w_g95CXq)OCT)wOY*<05Ku z6@|rW4&Wp%vz%FmOi)3M>L>1Z`%h=K6AMzxzLjQGiM*d{DEo55hj=u#(6A< z>A(OrgCRE;ou=EOCLV#p$VpnxYgfd9Em~OBRbzP13~cv(JTA^PUr~m-#cMqQPpxwj z(-;F4d~h?c)aIEzUY2TJVKUtO$A`Rx;5AB`O>AhN()JV?bNA-x)}kPWC0h=AxfuQ^ z;Rfo8%K$im5PTuO2ryV(vR&jpmFw#eozCJ{@MO=|ZOP0dkn@OY-oH*x`s2vlLjg*gnN4wE#zSzX8#4+|vJN|EO`v{tEni)@f>q%-GPdn1$iRF$Z*=CGS zqoxTN*?s?&7hPZ#F`QuL%|as8o_(E{{zytz62?`-AA*gJ(JeCet(tivKbJSmXCTK) zoC%Vje97x^A4Z-Rt{JF=&3e7fk3bvI@V;RCR!{%@bTX{X+=YHb&A*zz&WviWV_kmi zq~&&GIM~CGd5{v^Pr-E|J)`TI;spnTa{twPXo@L&-dp@tu@^bV9T&764aD>IZiv2_V+xQ$h%CFm^ zb#IZ(Y*ASNoetx=b6YJ9^3kIhuDm{rvVs&aft3Nrfgiv@nPa{o-gY^fy4_SSA-sB` z=wZXuQ7~Jm6jEbMPW9Af`~3Raxj6HlCYpZ=_i~Jhy3ZS{_-h4ozaUx-)B+iZ)z);8 z=p*_1%MqKfa)ls|r5Gaa>11~b!_;1ur)=>%5#3ET`3;7xx#}z+R+Z!wz0s!ANwRL) zLSNK!5#d98`bUmdUqZ4hL#yLott;(j@-1{~<@t*m-6ym)wQOZr&0*WG5DwhyJJ zNNH}c&^?++)&lFqUyq5>pBuDCeYveCUUDsgk6X3B(~>t|Y80_+hFKozzS-s9#xEg6 zvF6ZrrzLAtM~y|y>a@6AMnkjvtbZF;a_&2v z<)LdKcm7=znCZ&E?CW#M^~T_@SYcMT0ekZ&%(*V3?F_kc0W-ASu&2bdIhsM-8w;NkVv|?gg!cBWSCXJ7s>>-8M%>j@ZF39y#yET1l>w`?F z^V#qt=@(KdCOuCbIcqv$Dtqn!d!MfVhz=@O zl%wRnWO!+ws1Za_P*eX5;bYZTn*&2Aoy{mk$P&^F=pIz*Dd8n?qq?AqVVWx>XNORo zKAbK-#LAW%*QWOe#5+fF4Ev39%fRwB((umttxPNK^1xNkcB>XRn#eS1>nC`|Yr<)? zb|6oWN7gBvPCrZ>9<&f9d9)e(e|C+mWzJJoG~{!jW}`re;P zBN4Ju0{GvkRDucG6z%5Fc#yS!^C}*3o1^1!T>wscz z!&Ls=aR+qoRnkiQU{}zQmU&i=4;M`NqKE{O(NoBiQbf{r)R4W>)l+?{d2zDZ-FVC- z#CPq_>@1%GjXAc#vvs4dC~dRc$)qbAMR3-VLyI$CZ)=v*Sx-#qfmd$_HB9?cwb3=y z`CC)XE0YEZ7Wt?cjR5_3r`fj=8gmWGr@U!6r#S3MjIdMpjJUG92REc@(^_x+w*sc* zSz%*~PGd5?mFtCbsMQR6PiE#5Ws6Ss4rr{g8t(c5)=}Kl`6WvES)Bq@3ZCZma;wgn zGuzs)oD9sOvQuVLW*zLHTb5CZ3b^{wP?)8XkYK5@_gqZ7E~09W(K;qivn~Kj<1EIZ zQSFZ|ZWHRo=fRJ|%98GIf&kO}5{x3S)&&fHvQ#T00rk?nBA=7>+@vVF_(B;SO99EM zsdfibg;yao4XWQ7$uP4{&5=@_4AU;LRtxU2G9!NkgZR7tTrcHK0!xPuUP zv+j^Af6ckma*u|}jLJn_ek*GS?RQl1@ly5p98#j=Y33DJce7;K(OleXcs0nRnjEg( zWy(LN_R5)PI~5lA{HY^8$CfFB)|Q{BKwEV(0I_Ukn|LNC6MiViHIIC-WZQ802rW@R zd{4hAFFq2Tc4_5=KiM$1Ze=eeoBF&MQd35?I#luXpt3BiPDwYvZbb1XJ4w{oWzs@G z!9ocGMo!GjG=0+8vM{^ZNmogK;@+LPd@?EQS=y*0?$w_-D&#FD`SQ+b49g72}HlCs;r&Bl9u0|#a`p~M#qgCi6Y$2$x|V?%;9CU!m$=dam& z%S-8WC=22%*bGmenNf%|teG$^#&iQlo6xb#8;9QY<>xACC9&XFgX$QbOxstV&%%wf z2cihgO&&wL@_kXf*4alv^kxp9kv)}X1oaJU0AYltAi&Vh0@0Vo8V)3Ou+k4u*TRg- zhu#bh!X#o13-R|B5YXRSq&d+Wn5cid_X8W+iR=0r`sD&85mA__&9m=FrO?qQmof6M z*Nzyd7&(oNd5J5PWI>y74RR3&J7kZdLY76F>91NI`AzZ6)bdA;&N6*`AIa?wLs&M$ zhv_3o4M{ct*29AEp?m5h7{ZBBKv+b91Ei{adJ%LD`pjTqQMRzVdE_nE2bq@l8NY99 zFQ0$=#8HIoY~zCYum|1T-Ea3i+w8ov-hAS`e8G8s698u)%kOGmz(8uYJP`zQZE#c0 zf_mAQ3$Rfp(fGLg*U$#}4zm3iz7A;ld_DAc`@4_HI5Y%Z$TyIYi4K-6X%fqs2;i~rXMFDg?UW|p?RnytKvb?i54iuvCab5~$3yMQgX4UMjZ{HW-1B1}>XI)+arsG8mS|S?s>24&8PF~ID379@^ zl!3|fTR9x{3437muZkS>FZg~5pIp6H-X`0=I>Uemmx|8j)`c|h(uzX0<5OwtL6qv$ zbs7t^RCH<*5Viu*$vz=tvyiI(JxM7AmOPA+Ynyn(=9@drNm%_-t&GvZU(ID>^OKqA z#^h&%`Z-O%u3x$86Nl%==JngF65j|ebM5FPAoitL=DErDu+-jfkE%p+VjZXAb#r`1kf!ekNJUrec9-r00 zJ+=-Z^Bt;zwYWZcY*s+XQZOQYjH6YX)FiVag9bffr&6KXdAMisaozyy6-ZT6MGz0c}E1VdYiE`B;Ct7QC0MS zE(73;VL)6WRJ`eFSJ#Sn(>bw*J{|{em{l%#c4T9h5_N=Lxru#Zv7>ebJq4EutX++DyQMvAG2x_bQ8sXj^Oj{d%K0I2a#G3)ukc*@k) zS)#0M*BW(upbNU`Eman*6bNNT*P>K&OB!7zB6UN@r6Dv2==Yp+_gL?+X$QSWZ2&^V z^`8CD<4Q=n8!WdidHnGrvj!x-VXY{wUt@OEQ*t3~AKMPESf#Ua+XLasQnbTuD=6`m zM~5JzjMkW9UDE4r-Q4Fb(PnH1Q`Jup8(PWQyY9oSXl+qWc#cgIqm4xaf;2xv|85O_ z^g-GtVy{9a=!hLA%SebpuS&V|+k`MK|DaG4{qK&X`2*u2rWyxyv*Vv5Git>=Ns zP-wcwiODI5o8%eMX=27;qW$`_otAyYp}^jb1EX2~?h%`XDPClvlJ@8LT%DrFI3p~c z4e4r|8mK^2EPiUQS%%i|mhklL^Yy_1kFw*k;*z>ejqKNeKu*HB?Xb4Va%ND_DA`Togz5@@QU1k#p4FFOS3PiWJQCk%ty#C##~j zmF zP)|fPbj?u;KzF!fW}Vlp=d!Jb4#y*J?|h2dfQd7qO>qqzo?`=oQCH6tma?>;=@=OO zFrFpnE$b&(w_I|qva_EQ{7t+x&)E@~?{c-{ce##q{KxS!JPn*i7i^U5!c%KyCbC3mzSD8BPYFE#CAjiEA z84c*26;_T?8}I=;^LujL9niJ}+Rmxqj3-1cCcn0}b-ByetZ|Hmp=8yL=v6FJDjyi7 zv~biqdui%XAMHHRK@0R(ESRcfhKOM-pz&P?2{DG27+$~eVYX>%(g(8x9+<}6pmtLr2WcDT#Ud<;COp$?L);D8y3{mL>(liHruV|4QZl4Mtyn^>ytcY7AMfF1=WJ%p zyGtGDhedehKMUC+&(Uc-cREhGbZ@~#dB%B~(fk^v?etF8zg<=l%+$D5-5rnWYh3Us zQy!)n(X{x`33GTT${FdJ;lY8h&tbx=Y~J0U%QyzWx())F2}j5Ol+tOO@PHmt?u{R< zZ5InUfg>KFBtoNErWqM2n{kmXuQzDA#EX1HHkEsS%} z33x!k=>6TDW0k*8FPB(ZQTG8PuCvNP>ax)9bFEYIfYQlpCcEce8UZhtWT=Kc)BV2V z6tf**i{WRF5*AjY!|pQIvLz63^M2*72VyzwBvAdCMD#K|tE~9gp>Yb#OvFaPKqG!+ zX#b*+`w63nnCM^&$?rWl#(t+!n$3T+p=jhu%s}&TxJL!`$B^xq&*yjUvr;by#I=9V zbyP}^03`JlFYplG!uwxc0+Oc!%qQfl6?`8|kD?i-4usF~;VIG!Le^JTb1>_{=YLW9 zdj9Gqk-=qq8-GP@cO(FS^k0PS|19bC@!h-mPF2KGyewp>Cjjr)T_d*icBRElFotK-L2p$M!=I{moc+A3E^ zYNoMJq!L>cn3$*(EJsw38!Vn{5=1sidK}vt6s!i0vBes!V2^z$`9 z#hISmM$K6Njv7*qCSvq`Y%Fi%mr6#OKv|tZC3bxx@n*oB7_)^-;nf!Ehk5|Zrv|J0 z5gA#|AEnHU>`P+u>w;I|C1RKHRm&v1GUnII`CbGQM^RB|1V(bPWr z=pF_^+jJ-p;*brfW|*K9Ho70K0n4%Zm=v~(io$UKrd((-aR)+2T8n@?KU2Zw$Y1k_ z>N%#;RlFUGnXJETkWgJ`r5F;59N;=aD;rPY)5z*bBrM8^D$!iV(P7@z)(XhT%AST9L2v$etb>WwYz`xEfw6yG6OP#Kqin;ml=rox>X@R}2xqm& z&wUw*h=vLdGFPDYIP69bAWB?7Njg}VA>pi;t8VI-xP~h=?I)X5Re4$Qf1`$F%dg_8 zj!Lt9w|uLpalm%i(bX-uGjrV*2NLy5%BP|~%&1zb@#Vf!CDVl(?Hv9*0tj?7N2i3D z4)`{SL<_SSkaIzcWk=#`>aD=ni0Llrf%gjrDFdOjgLuoj!Lc}mz|5kJT_fI2NrQRC zEae>=1(^)nqwHORDh3Z86`=UPI?JB$7D!g0pl^_Y1^c$mj4=OOtVT=xTI`RqUacwcsD2McI)codi(N8Bw?AH zZ|rSo%B9c=c|AsD&0>u2uK;4CJ%J}Ef^oOG)OGcxL7jFVrO)!*< zKT?(RQhOf_8mse6$xXMPA5ySn$+bc3Ho$0whwh{(<0@!mA9Ncb&>O~E; zFyU7oDG;!fj?y0=2qYHE6BG`$puIP;G!FNMN7Z)AC-dBxE`(8j82XG9k!&VivtU~Z zxfDy0nMU1*71KT%hm%7D^q9-e(?y?(B)e)jW_EvL@P32;mzw+!I|369+Wk}e7WKFN zTm9RAvZIrunWe*DUX-LBn^vYQr5Tx!R2`Y19igX^x1A_okiVg)9G#e!oY>vllMt6y z6sx5CAt6NN+=`3_4~1lwqXnVUQyZY=4O2n$&fY>#reRfpplnO*_?=f75x zaKSCIO=dq_XYm!d7@;+{7e@|qNzs2JxYpr;{D!2&g|N)+Wd)wx392G5F;v#mPPqS> zr)Jte^_H|ShawGyt0fNxh*iDktF@WcOMrzjl3atq}f=iQ)t{F(k@o**r?`&o^N8zE^Nc;|JrR5@V@y_w!!2eBD zNlGfZ!JeRmz|Ymn+Yrqt))o@LY36+5-cz?wTK0{?MG%n|NLA{ehp0jqZlwhkQ{2{; z{za>dn|@UM=U~~A5sDakqP*EGe7S@BUXpWYG53&IfC6mg>JEyIF$&^RrQ}r#5&>qT zah5qMMTfo;PXvrWWR7$-c`4{<#~a!9EKwji&LK`z&i%t1>oThw{_(MvK~Pfy3eE3g z^ycJV?tP)05d;@pQp7s^NGyZvm;gVquljCedSHDr-l;y__`Chkrs>zAEkxjU`s=cC zLFeqO3S-3iIw0`z>)wm!H`HC;PT-UgHeIOQlY#jdOB5TGg#rvn?lLNUXhfvDv})$M zMBoL%erJTyI=pgD#O~e)FDuz1v=U`yPdHE#>5#uDhijJ%5BEQ zh3FfVx(NChXC4i!=)8JYn9;lSqEG>aa;2Ge(BYxfAt}44owHByh~gkjiL(2}?rMf1 zLn-DSC9a59DHtt^Z`(qj7;3JsUL|E;FkM9>P<4r1N7_75&$fY6U2kB0!LE1`q8>?{ z;v;Lu-mQg@;OtvXIlYauc#CtGp9-s}ch4#PHr1bt>OU}|$ zKL-{7;87O%|FV`2M)uBT21fr7$)%Tt&Av$8$@53}&;~*R6e;IBM+>J5n$~ba#!JSi zF~ctp3X@R1x4Z?5=lVo$g9_7RW7RA!?W?5TU#b( z==bZINA#-l8H^OL`3vHolu}(S!^GC8pc{n{7*m;lH>nG_oaZRfgXSK`5C|69%Wb*! zcsZy&S@Z~As<9BX=_K4`#uR-!7uKHffNv$C}HhA5h+ z)^WGsVm1airQG#_QLn~(JW%+VX7@J#`VQvg4W{hi)&mep@OFB6nGA(+MIlw;k4y5k zvk%kA_UpB)kI*f%|L~YJ%IAj;o!i+?S(ot*ZkqS4K!?X*(e}x> zY9tuAxAbSPd2KB3&kz-cBK-@q-FBF#0|=n@{*V|RpFA*qdGvZixba5Niu*f_QE0iS z{x`O9m?yhkkeRJbh8K*W-Zb`@XaY7DAW>H~^|ny`@9mka{Wf{@qEWE+=)MIz#o4Xz z!ox0GBvBGDI+}@ug9uOXYE_vFn!`3Wnwwl$zF@$az5@W3@0wIn#g|Gea?$7D0U2Y< zv_wsiqU(NsC2ScM97Pt0#T)YRmW&D6$XAL@&})!xMV5NQT82SS^7z;L{j$#|f*PIL zR)qdQ3v2vxa`Ni~UFV22U1s8U_l}FirL?fesFH2~eD%lum^cRHfn=E-wFT<+HL;D? z`2d34(EVmZ4`q<(ua93pxK--2OA!XoRbMH59ncBS&QdCDUL(*h3h3=T6FgDfod`8^ zqho%b!ATpwSBKNy_RJT3?sx=Vpu2u$;{pxk^7n)R0I7i2QB$1cSp1szqe)?~-Wn2! z5b%;~V5kS(lCRF`eLNr-2Xmms@omrRX9=PY7oY=+Q_Pvi&eZEgKbiipZc!o|Acer* zFGS^n4qsD;_7lAWjNkTa6yHN8mocD$xY3y*`^wV;dVr*dQQ|d(hI?Oq- zQRNgtdMyee1(=4@Eg!(q713#c4N(QGH>weVSBM-IjuhK0=kWc2K5%KF3o!W%U+XZm zPI6JlNRkXBC3L+IV`XPQPmTHp<-@G(M5_?l-1Bhvhp;?P{%|F#^JxprOHLGsc$IQB zSa0QoVqdx#zze+tZx93(Lf7uv)V+rYnab&y)NOV~9eLTmOa8Bz>y=|ow&D2`SG@zS zarjK}w-p$tdyJFyJx3DiZ;&IYcT4H-2H&E88Y^KP4b5e9<+uVzXiAzv#3HT#iSO~hB8nFVujr4j1Do_^e^wk7aC+wtFU~|-rapA*vq|Fg%v4D+brhv=V z2hIkem!H;yx=ZF0VP7 z?^KsNaI3@-NtRn>ZJ&Gq37S-CMH0nRVDg9HP{j;HJ8RoTEPT>vmIkQiVzt^sx<`^> zIT{~MLkDWFls|Ea9jF~Cah_w{jcV&I%2VYxVmR~QYaSU=kYvm!2>57TiWg4qX^dsY z7V-n{ns(j_wmNd-C~*mH{*pNM8*=O!5_&-A?lb&Ms1S2?wO%WXhXj0gi_OKtXrfO< z5X1rrnvn6CU`!jSRVh(}SSyVCJOP?iC8{XYJjyI)xnV88>Vn=(L{f=wjW#zfB=BYl zKqb9^J}Q=DI|l|j2fiAVN=?($=Thv1ZK2C^b-3t8*~KHjtl6nMyDD}bJF0S_^{Zs* z=ZPK8XwKY@oHy#&0>sQSLrWe7gbF9VI+jY%@4jHWaD^FSwDSb@qfBWd6O~8@r&0+5 zi2I6)55U~fE|3{TFg(O~rtoanKpM0LQv@6H462=YTY+MbWk{Y3oUheD7I23s+1rBu zP}Wtx3=d0QjKP}7t^5XNu!OE`QbSfaK2GlNB7Vvk0vwm-8xQ1%h|~rW+65(N>PpO-36x8)C^X}2bnJM`N z-QPLwzkkzSQphS$oVzgHZMweJ6K*UT8HV;AwAkxE<{S>#TRIAu?Aoim#GnpDeC`x_ zZOvWm8UIZpAym8UUti+Is4T6e9%FEWl5r?5+-JTUFW`H^=P!I-S z9Pxmp5JMwtiimBWyOIx$XXe9-@d;Eh^N|;6Q@l7GQ*W!?CSb8nA}Tp*F(Scni6l!* z!p6&@_oA02w4OT?sVwSISm6E*SPGE%(#V_`#N*YoU;lpckeACaYj+}v=>|8HDVHiX zPL*ib1!cn05c;5=ibAGiIO&br`B}3`<;C^-LDT9N-1RY>I)*4Xs_Gw<}tNV8*EUIw?|Gs?`9| zdP=%bWPnkq@x#Dt{zMUNz|yf5eM9KXfuNq@px0+ezG>~O0L2Ik&3K#2A{d1&H)1z^ zZvBWR|Hcp2TwYA4{!bZMUwzYnnOp)qOa`YZ{1C*a(5+odi|K@>l2D%EVvyC7gPD=+ z@M58g#D}QF0C98pSMXbROyssneJAH3nP))g$E!E8_`1xgB~+e8_khv6&p1YPzaEm&LvjT2adRx zb(_&F$F4KJv`qtM%%3?S75JhWB_W)MukxlLkA&FC_A7~Uq};}prqk*&YbGF#a~tkO z_4|o+mP+&`ohKK9>warQRlYlYC(imgIC9B44=Q2_<$aVq5jPvvZVH2#5!K&$v{ zIgCbz_px>FW_?*D4spbI2AmF#nQUuWW0aanfoRCCyZrSi*}9t-5i1#@Ta z&SKcXmi_u;!5&t=>C*Mz4H>!C@;o7!!78##{2&EYkUw^2j(AXP3c2;gv?i%01gXV| zEXyRcc+CTb`IG8%)}>?G_n4`K##F7y7<2{RUVToeZxMY`)Y7Anyx)iC-HgqYgqgYZUhVwF`fg*}<2en^ns6ex?+rqSVCL@YWa|82RzxxW0}UOcaaY8SvBO zIsr6DhUXmxrX32V2GQXy;im-2oh02lA*|BQ%OlomcPb)UXAjX#AJp_?Vq|ta1O$+p zHAd!LPl@{_nN(`OL#6eqFi(gg8Q5EJ4DqL9=6_%r@kPx!S*v=k>NUM%4=^e|fyV8N z!_}d0d6dUBR>CKFEta`_0wd;ofW@!4>0fuf%ggW6N;U@FnXl`ep^jJt6Kl~%q z{@3WAZO3fmvIXwdzCm}aiQ|Q;wk=69jAud{x$L@zEiMiLy~X9>T~Ei2oL42rFH3Qs z--P`2zZ6>DU@~UnTgIs=&UI2tZ-EwE^~$#Lqzox=$Lzcljg$@yoZ>d$iScMkzZ|j5 zH6#YvsA&}4ajCfBlRi@EejI{-p+G}Km5d*zBBVZm zC-wFFfs&AzJ~AB@<3;*p3=Ykqeg|7(lz&&*i6_my8=~cIddePc2d^Wp4^ml5E>zPUsO|KHZJda`n5HJIM?oK|6VTbWqp5IbJ#%LWJ z3XRVE!9z7u1a)O^^6$<-6+ox2^*e*qsDPeLkBDGLF_UvHMcYpH&-t|MK762|Kvt@G zi&nph%C`^eElP4@Ge_z%1XELxk*S^L58EC|c4(39?oF$Jo*7M2zi2QO=jObRu$8ql zveruUCb*t6EUEPz&OK3Uh0pna@2a z6OK2#UV#-Sgr~=BuzO8?IcB^YMdxVM9<$QAh<=(w8gWgZJj0reXa0;-%H+dwPWek&NQ; zTSx5DN`=pRg9wa+;*D7~1k1{(HfiQOx9!5HUTuZCtf})|C7-glPv2-iO^rVx$s+Um zWKT*!M~c2^~Z{A3p*cpnBi-t`Z4H{qesMl-2Z4TLP4mqY>fD=tz0NqHyRIJP7rCuj>uq zQvUnZj;jq$4rl_T1Pre^UI83Ib6pMAB?7Gn0bJCI@8Ht$Nt~n3R&`lRqs3A_Yi(xY z;HSUO$NahWwx2$cdk4DPD@3@7CV$6fu4(%r?^nbIv#?rG6Yf1pQo5-yl8qUgG!~iv zp@%sT61Vs1Mul4$kF491`m&+rMi=r>@yt+)2yH&ZzzhBiSV1sEF!RB!jHf@GS3RsV zYBNy!(amIzO*&L!-obp14mwbw+VS%YGqAtJq@!|yc0N?%@XjLN8IPSoql8+&K|ph> zL}WVBzNIrt|7FAy&be+CldCMc!}?qW;0zo(C#aXQY zW}S@16<|jb=BFF;3R`8;Nu^lJvuI@8!_!*gBmSZP!N)uH3d2NgmdCbj+qSLy*tTuk zwr$(CZQC~bd6UV^B%SU*P+w}NvTLt>E#ydA)&U7drLB5|a$AL{NS%88LUOpFtngyW z7DI}hf+4T%$I%K(5t?Tpa4UcxDtm2%{L{Q2644{3i!S59xRdwwBw_Hk?(f;j?)vNZ z1-D0pPDoJ=pvmK1L=E}W5TX_JwqA_@#XD;#jx3b>1w9S+c;U z2>r0>>(|fiQ+F9`X2BtqvoSmLddO!S+EMUj>2(!Gmp-V79@br_d^VXmfQ+Lhq)ej#b#seMy2xh~G1_Y!JU#`;T$X zz49c!7OxMM_QjCU6*P=f8TDHcWX;coFc@EXbsIE)#>;bS6Z&!^&_QjO)TYYJyKn}# zyF-gT1EoD9**j|nK)5xV8@X`=Qaf12yt}kwKWc`{drJU}B}tJ!BM99R^89>?1-r}MY)tG}8Cz8-W`b5IfvQ&6D+$4@_*LnvlgIO47jpxk z&8uSm2|2IJbpOa9P`9IA?d7FmemiG z7N%5W+i|mW(6G6-VHm~3V;NTQ=Gma$QeEv;gs$Rs;%bBMKy0saY1;YU=;~O(jy33% z?LxHZK)f;dZ)Jt1p++boJ96ig^*+aw;3A46r@j_lg&w;!5BI>t>QZ=1hr5Y0U;*sr zuD(HC|3dh3ug4}|vI97fFY@EyygAGyP^*m8;>F)@fqi0K=W|}RilAQ7y_-Mdy!B&1 zbc{z-*>IW8-nb$!un&q{<`W5z_D2!!(LOPo0eRE1J~* zD2GnDO)JGH{4O0=nB>EaYq$-RA|j50EnoQ$;KAK|9@XE}Ut>OQfH_}=F2sTqaqTyk z7`=&4SY{!EV=Ol)+v7~D!c?%^YVm!!R$jM)tOAJ^18n29LY zgKco>SA+>R|F&B|cYB6rH-m+B8Wa)>6#aadQReJ0HqM`Vdz(uMQnI33r&oG&A$;ew0Z%vh)xs?ffz zAU1BzTo_2RG%7j6$f%VPWL;8@bDeg(Xw1qb{iqV~5PA2+YOPrz)0W%egC5Z)CkJtl*4|ePG$5P%5(0FoWHOMO1K~ z`m7&YH1dIL`e)DKiHnJhI0s+)-@r!8{5bGpZ+nEw$cv}hs_zmqn);dCozA=gMIv4Na zA{cerbE(>i@d%xoc?=zm9vbP#eUJ(*E$hfWNe6en39Ra!Kt>p2wXJkEUNnR67A~ElD>_XYXVxk;p$AI z-gD&L`|#&5rfd;dC~A+NLXzXv86)*->yDNd^ti8TN4RZ8ci8wBtEfFxBDgO>f51gB zHCMO81Tp_HTVv*Pwt4{}^V(+fGITe4n0kY&mFn$%hus>A(sHfx23TC9qhbr0j!1H{ zXNhpf^y3RoW-9{N_;j6Xtal*#b-hB&EOD2|(zmg04L!&E=7P+jMWy`X?|5u+xs`7I z6{PIt$pcXTT0B)G3Eh{%<(37|EB)E+midOG<0>1^!(_Q5xcO@8Xal=fTi&l5u>uZw zvyNPXAMSmZHR}te{&Po1aAY76wkQ? z1URkcwYwYZ_RwPAcfnrG2kwOsH)>8N z()u9jI)paQWd6WJff~L%$9^dQ+?nH}DWs;<57F67x(i@>19)?H5Rb&mOCU(+?hZFY z_6LP0A9mlm!X%eB|0io6n_wjuFKz>v>ils7xRc*!cMrI7{^T04Ml@{5U4T8Pjdp|2 zO8}gF@4pkk!*+6qyX%!=GUDwTOHy1tb?rHn=umV%d%-d3mrsgF4?Z^EgobViw@_)z zfm&$+@1Vj*>4Cxw@ywEvko%?G&p+ps} zbRt9tz)^gaG(sibSHIwe6nQs63d$SDP=X8VeCVgkk(fg5r3DtIk)Y_HqJEaL!0Evc zU3H5i@kBu~G>^#oDK+09;`Z!eo(LSZrJp?Er*~02dPvQ+s@-?8P*OvNurm+EKb3^_ zqCeKaIm5mslZ`bOpk0eXZaAt`1P++x+U3wC{sP|L0YhKkS&KQ7Z+ymYA1_pnOd?%6 zHc636OvhIZC`(NK42BA^P5`w9AE<{sLhxip z_=&N=46MKe7KHJR>SZ05zG0--r`ob!Yd{gpBovN(<0)`Ci^61*wp{vSt2s^5?rNG17t*I)N)UqdhXQxM1|#q?Lh%X|e~ZOwn$q85+YB zX$V&43z91IMI!D{N~#Rk&!@VcU>+%CSrRNcApD(T{L~Qsnq+K*$L?uaq7gn!OD?VV z4GmW-rByK%Y6?BaNqKWF=w?>BJ2h!#Sw%Z_E+D=uwScTIaXH!aPN!RU!AlntJal6WcCt`7nL+S3h0g^rlF0hD}FTOzG5$z%O z0y#j0qp>WYDXZuC&+zg1SL^2JVOFYrRLoQw+CPyc=#WAm;%^R6=CHE)FGV6<65APZ zQ>4HkS2Z?Xq)w zx+Ye&EZPn!N^5qdPYOP};7V7vxgLZvskp@8Ew)Q1-%mcp!*J!EMbXO2Ht!^+_}IZA z&4jHO;}|YIaCtD!AX|^8DGA8TuR;&UOZ;2GlUVu-XZF9L7t@g$fxIC%Y+C}wyROvJ z{WYy#x=U*m{fe<`W?=4ZBZF)YWd2@iYn4FWk(Y1YhH~*d_UetMSbd1TscG;r`)PyR zqW2rhXx?{SmFPn)3R5oKD!3vmtQkZPk=BJ!fb+U9XcsUKkO!KSjCC&*K&8y(7P>Q~ z;~=uWRcL7@+RCbio9XHo`5?<0jI|sZi1%hM-kwl)aE~Zd>)zT+U%-V;B?AeG6%UFL z>jNk1;I3M&*0WHg-VgbZ8S#_msqw2dQF%m%4BUte%XFWXYrQzq#4o`>N$p_iy0) zXaJ&0M32wK4zBYJEzM>}xd#(e1gN$&wn^|#lDiGJwc9225J+LG323xqdo2&M-9VD? zW7V0Mu`p4%S8J>M7SLGeVgq^36)C+(yP}{+pzsUCS%eXc%NMB@nnan?F=3pR3dW$i zUQ^(buZDJ}B7OI$H%qs3MSm(e0-orYQfl=F`a5+PHk2vf4D(VRqrx818LC{eS6@pU zx_P(;?e=`qzRKUI41|M7lPh-J>e)#O(sbFwsi+0GhR=}J1^;jbt>X>B4}sUz`+6Wr zwj%?RWjqFhtd~@9L^EUoX|l>_Kh$=LnpN~ltz zXhURCQ+$@1T7$nrMi%34o~f{P6BVO3BEl%KkRmr(?(if=tIc?sDS6!30mj~B5TZ_0@?Tz0G(=ZMN?_qI*dgyZ*z-$5 zE3qRt5ouoPO>0jn2heUr2w?7B{-XgdG2^#HTZZOR=KD&oVfcrq*pbpzI<7KsFo7*I zdpKcf@sujLGe%7OINz;BZeUWg1sg&kXY!qmyV?vDKCE7623djMzp`w;Uw6k!d|ABY zky1Tc{AMUmyK_5Qgf?X`FcPK|lg|v(e$8i14EiPx2%aqZr8M8R@VO(gvg;VDdAVxd z9yB4W^VvTZz@4fscV2zMFU(!A(3P;KNQo+2X^}{NmNLSU&gmX`BycIfZZLxf8MJE> zH_r3TJUJ~O!1HxDSnNm`8Rzs8+7FX*VL?=uIpQ&_@;VYH1j&Orx3$M%oRCNQl-`?}C9m6Bf%LIJ+K4u;Y zD5sPx9h~cR_3A;qmcu@&ivnu@cz? z38P5S(L`&HMXF0RguZ^8x2A3U^8R?({hD|}`cpE|VeVRHUlLCRIEZ~rHc3%S$(SWY zORuFmvPvCL=`3ZnZaN128jlj_BpsoZiCtbap$T_-C*F=Tp$^bJ`rF?Nj{mSUYwk&w zRG7G#6Ej>6#J|kZb`mm!8VjqYiWs*gy*-EgGI?TkIDZXuemGyjyp+#6W@I35ktj{( zze4qzVV9k%grJj9PlAUZIhZ5eBj_)_D@mtBM^vh%Gcm zEHv?$y*QyD7(!Jn6nFenA{qvaVbsK=Tp}w)dJMZnhxta9`C&spb-tv*cN)oT!=>q( zi;Ht^@pXaOiX%LEy@$ixjHY2%jHH)&y#<(gTpk~CQsB1bcJ zGwpB|I1bOytOYcDV1?`5$hRmzpfC>-eu_9H24wPBYB$l7cL@WU2=Z zhUkzmfN2#M7mYHPBH!k9X>PKj55!DoIpkgCT-R8(78sGWnz$R$V9~sota-FJ=8gg$-9CjTo0q!B)I$@EN+IaAl<^ z%nW2>>AV#dDrNSih(72jYjM9pitWfRIF~wCa8i8&k7ZouR99T?IE`>3C6@uN>(5&i zeqWGem*RCw5OMG?J>BdSW|Q(hLXI@+37{4$zJn$#7iv&HCjwBP%&?DNv-(4PtzNLO zjjIJ#eowDyzLOT|{0UV75I@mUQqMqWSPy}|PfAl3NC2L=krq2EUAO?F9qYp$0ssqvgp4&RL zid)>*$3qj}^oIF2oJk-8Z16z3@j^XW%KZJx*ZfEerc=uzgUMY_WrmrCyOEh=`!GXO zB(v)jcPHrZc@J^t+?v4gf#f*+J>Pk0qDDdu;XxuJ>E#HognxP@P9kOAE;qQ(YI{~rHNtd8;SDV;*5gvCO02dkn7@=$V1)@8+Bn$4U@MnIoi)wYO^<7* zg{apIbb;&Ytz%c~lQaebQ8LI@7YcW3=NpqG#MC+ejVwYB?AWGYAaK39rUmjZlo8vu z)Ofc{hY4t^nH@vm4YCx^=Lfl#Vw0jL`ThwQ^PpjUV@7cq8o_T06wLxXYxwh#0d}Tj z)bg{fFL}fhC#G+$Lv4jmw_%HSB?-hN9ElLT$krS*!Q4=if^g)&^R9$)(uPvTiQf2s zreUW!M;CgbqILp*V+?eYD~y2%S$zH7AB0^Q`m6oVZW_OhoQ(&nA!_N0LFJ-mHiH(Y zFHI5YOd`hLaT%o6$ZwJ6jJ&rFwnj*UqResFkm>xmqp-jIvkRUNzl zejbQ=hqu)kfS5}u{hQ%G_U{WCy#87Ll9)Qp6?>?f4@U|Rc2{2>sLAzZqd7xjA^%DwAt#VbnNr8?FJY>r`+UeXOldy3K_%$8mapAAVKU)b0ATjkP2bg~Q}IfrILp8U?9Xtu+ZO5y zHt)l)O=?iZ;GyTL|E>TBHX=N1#$>mWK3WV|W?a`xbNJ2K=4Bz8cR0HE!LdSeT!GI= zjp|#-6h=l8Yuu-pQLVeyDcHbz3?gn2K@M7qcQfVioD7rY=8MCTiBL)?u;B9|P)I1$ zR`b-6E@bM9+p`2kjw-B(McU;bQhEE^^Rfw@k|QDWjdx^E6~7(+W0VvWzasMay(^8w z*(4`cJJpKFzh@`wJ~*@qA}4Urkl5O~O7#@u2vm$UO0@0u4v=&}DUmG0sVKp(+*GKH zozbHS2j=A%iyf1X`|~K^6486wO0HGt%dbK&lSAeQ5=8yfgXw!}UM@eXyCD9Ao*L=k zA#%Z}jp+=uql17o+|g2Ia~F#!4wfn=Qc5*UC$`c*q&v{THnV4LzUKi*xK-F{lW`){ zh1Jk`9yCGl72<%H7OL4O;&38L$^9L|!vsl!&k<2F@*baLp*`C5cYwW291cSE!$6w2 z?kF`Jp`?>J@aYACm?{v361Txm-i6XWKl89m^0`GLlHrs+Y*#a9=+|2AgigSP#L^!p zjKxYc{4^xc0H5X|{w8nQk?f*9b$ub4NKu?@OUG{&$kN2B3dd&Et5zn~5 zdBof1;cpaA#8OJ=-%n6Z00yObsBvk%-n8rrBip45J|g9Adp{hYj<^=V$ZHZ{9a30Q zqo*w7T383m7s(qcf;R?VXK#+gb<5`r8pA}+O@kw!p@j z19b*LQx8U}-Zbcn_BsF6Jl4`<3ub??X*gO;1bJtDi@Cd@4I}ksc5F(u?%|d#HZ}b? zfI?$aAS`&{EDYKzceS{e8ega>wVDPG?q*{NVPFYs6{{kC3}_Wd^uv11eVOW5^D1!` z65Ph(Pt&8D>hJ92p2i0^+KHVSoS9ANt;!~*#LdMBUXMyCRrNf-KT+{U9eYM$L-}pG z01?W9X=+5k4n-)Qs-lFKc3f`4u>8AYxvYb0CIl)%Cr3$sL-w0~aYlP+x=?okD~^A< zn9w#&46{QJZ_6r99T^O`oDv)tGY}#;ix2yUyyfkwWpm=tWN2+4Q1_noLn!RESKF-5 zTVbakt*`!n85+A+%SzylqHsv9Obl?lf93?>0yjTou+AzHl z>pitS^n84PIb<@5IGF-nkb|0NFOq6ewx}USNc%zY3@P9U7zf;R(&d4L%j@r#)oU65 z&qW=QoQhSpj2<0mcOu9J15QWO^ufF2ll!;*P`FIP%7pwO^Z{UgWPz8}?JyMnEpz@~ zw=oH-WBK6Xq9pP);>o;7v?Cw-6GErnOh%f{_W5Zo-f~cH&67^f8HD^!kgc8hNG2Cz z)5NBKSZrX8oKTIG1QExpLs(H&?S^Jd zyD7XeBlgty&uyit#7%lo1QiT9vjg*ke zX{foiF#i(hdaUmUo}@z8Ehm&UffwT5{>u-@U(JZsD=1=hC<;gq|CVw*1m)2+avP4E8-eUs{r&5P z2KM+n(LvbJq00ez{W|G-nRpp<1Dxp^^eXrCNE?P+UCX5Qp zO1tkW#L?i1x8xFjFLv;5Ysd?i%<{Q zc5}inhzhM`QLze+ib{Xlf@Tc6pwj7ck7-V>ASbyUq2v9*jh8x*K^rWURl=Ysg@$N4 z!HokQ*@xnWj*r1VYfaCV6>@7NJLCVw+?+i$mJu^e;)bv6v%d0H`w0ncNJ_x8!s|)c zFwS6p3UENJYr_j!d|=ub_7|y~1$^9-5uB z=H=M$WD;!M4*$uhi3zY~(^89J3}etza~PSm?x7ySj@sx1Q$AwWvLoU!X=;I0<^}oB1K-p_3Y%(r_1}t@dU`dZyw!^4%{ybrz2EQDnjh^IZ+SlS6SL^MTdMcy{T)xuK=2@~f!3QSfhNz}b@p7s>Vd_riDI|&^jD9hKP zxWpz`EsF%F)WnHPhaLAddQfa5Zzj78CQwLTL4PK%3Lf)5gQ8N>(2E zCl#NrxSWn?EwGtkXTZf#>wdSpWp6RBAjMJIAI;N1GK_ZUPRz4jXCd`HU}PRC`?*^K z=+Z^s;xC)t86o(g$G_Hq^HO&))v}iPC-$eU7)~Gydr$o)iS_B34*BPRsfV7Vm2rqY z7KTr#MEUm$F23`)QL`yUD%kaPg#1OiMddZhG=l=O(YHuc!LZ5c_uaf+o!yn6J>JF` zuIsuAmHT0_0k(%@7UwHi60a;>9|!@PmC~?KC2}dnF5J~5Bpp1FCLkTeS+IYZ)a&&+ zdb$q$G{_wqC^{B(+`)*bnwLgf+8%*_!Cfuq!Su8{{?7^ zis3C#eIELt>wGy62$ZlcHl%=OH|mTXbEhF+v$c5ZbxVYaGE+wm0t^`(Kiqn=t`Nbw z@up%7D97}NGAhPssT`HRCqic1SXbl-RJQdVQ1Psz)gLU%IHoeeJ*P^IgFL%>G{c-7 zA&9#m{HI(dbGA2>21wiY2;xf-C zCW%q)DZ(^>n8n|qE8(FOhQE*Zd$n?xd?OhCxCP*^X5-s$QILHtLMkK{MJPT-$%n~i zLg}ZV`-KuVFfONtLYjYtilKtM_CPmo2e}i{lc&0=qF}(Zp#0JtL0laeCSqEUZOpf3 zl7~YGA<+ct&@2QIvJ9lJ)u(S<8CRwF3c>*ULaJxjhlBZm*Bep-RC!2LOZ*BVdWaAa zVRYskdNW*O!t<;eR|9!kizfHjZxUo_Aw}A2BGFUI*EAnb0ZIHUs0gDNss!XN=y(m> zrOoj(m_%<_T{Jsf^lXPSHRuFhi7@qF0v)6_5}p91e?%_`JDHG2!{WKp$_wvU=m_PW zE=FG5v2;e>2mOj4OeYukGa%(GY4;Yw%&Jsq;((9>D4r9BNdcqOHI%sy+DAwM?Esey z9xNE*i7-P{yZmg(qAk%B2sma$=ONP@6fc+8EDo@sM?O*#bvY}jyr66UqFl(29GV0! zG!Q|eq}26S$BavF?nM6lR**UYd>x8?0+FSwXah(*-M$#xM*@omQ%)o zuc4+)%wioEX$RxYwNsCba)CgS8j)t$Q%Ht*D^99nZLVI<-gY;E6J^|F#VVt+=lRSl zIV>agm3%o0vhaPy+C#MTC}mlTC1Zns~N;ix?BaQ`Gf!e(trPxdrc%Ryw`^U z03e_O0Kor0rvLt5AwZ9&mK{zTs_$AI!E)GoNcXL9;gc@9M4Vm?JAqFZQ{ z2`hJYe6|W(AKw{{V`#R4slcU$rF2H0F(^t@LF^b+3R&&Gy^uA|Yq3#F)uUd7Ab{`Hlc8O$$=Auy2% zsZDARQ{lEYgYML|2F@;{(F>@S6LF(h+H;Cd<5Nvbi^tn5ZG257c}=cb$7YU~>pOTy zbv)ISBmvIn`@Q{DiPvqw!xb~vN1JAqrn%So^5GR2MY8}k%*AVF&qt=t!DEh=3s2Db z)05Mtsc+sxqcZ(aRMXuZA7-n{Xk=gwJgziT z!Uk=dHNDD2jlHxUrfJA7W+~gWa4*oq4kvAYl!}m+*+lt*ya3Rz`{E!5Vpa?``_1S4 zy{cxQxmd1~IL-O%XnKh5qPo?PC`g?xzQM^aR95A#Xiij1mH7j{umeST8!wN zpGs;qlH7(p02|AegbfYec{&hE^kVq*x%$d@J9ELlX_u-tI^pj^Y+E?7`5e!eF9abf zH2J>*Bw+rtmd^kTh8HL1k{TSdQ(^G z0$A;uL@q+00XdZv@X9Fe2U}ptEo=;q5KFi@rxoQ^6DTDU6PjmA{|nJg8xU$`0yW8m8!O>lk z;IDK0ZDR`n_Vta9NBSTnw>@#KVwblNJ4gczycyb4T%;d-yIDv%1llB7lcNdBZCsS} zWErU>SJkTX$)2<)r?0DZq(uMe2U@yzmtqdA#!1K9OG_v2KTm&fm%2THkkCm{$uQ(f z;$eTxGqgql+A*lNo@J}ALx zm^r0jnh!bl6?bC9%5EaaZ7_oBf0Ar2T= z0K?eZJiR@i-+%<;DRi60F=YA?*=?Mb(g4;Fh)np@*?DA&n?TAON!nN<)RInmD~ zw@Y#?rdcz)zqfb%biDvVqCk%cS(vC(nbI*Y(fI!im8G$yF9w&qxFt?x+v$*~VF(Tb z*w21*7z0+LRiN#qcVgqOjzJ@=@wQ{_XH-~NSapcCLqw$5!Gg!_%23sKfkC~1x^&$e z%}STE+b{rQhf3_;#MfgGaGCKY4C{{m6$Tbx)=I{s#x@VcL#9|4Up55f%KiuSz8b)d%Y-bnJ>B3t?Ci|e<=zp0lJ{s9#) zrOOb*+8BTwhsnP&0~~SBGPWw5otHX(--fVG0=68n?TH!iX+7SX;Mk?#PE=kQ1-()K z#cLl_#FENHH#!Fa!on`BgnhYQV!X%<+@9Mp8+=;gdle-B4*|IAVV3KzCuH zcwM9}>EPQr39|a3t-s(ObYlQeoLm$enRd&hFg`S1?beLqxeN`dN&|AeA3M~^p#IW< z%*KkVXR|Rpw)Dr+cHdJ3@l@S<<_GwnMlpPN*1_ZVs9po}1(b3sO~0cH0qEu9afc+8 zU*Sm7AivTFJVFdQTz8(8o|ncnq@8hWx$@UW|>tKxnO((v4KbhTFfRnQdX&hMl4J#QZ(?B3^_}DFq+`OKleI z{b>iW2&;gmBd1j<}2w0`RR?)bfr79kUFnC<=hLh@_v ze$qRg8%5LM%KHK4pUbnh>G>Y;OXp+yRR=42vpe$aEHl=}Rc>Z{BWJhHeP(-Z(K|R- z&zgdV0P?*3jYTWX!CjJXXRE`--F6}`mzsl>{=LYZ+Wy+MyAU8x^$nbi)nOnRJ}A1m z&L4+i?I3;vwLrA_8?jnI{4-Co0j1B+q~kea`Yaai*fbz#l}4Q^nZ>qfV%;9i8d0fy(cj?a%P12lC; zA|~r?O%KSVGXHhn8H6Lcd8-d@&cLJ>WR=3sz%>r#CUr`ZlehXZO`$%~1L(Y*OK8fRN ziIr_)t%@OcDsS%aCE=~9Z}2X*oBDMwa0Kv(*35VI(SE{M>*FmU>@T;0;>}}7F}-Pd zE=jqy`~J+@m9F=DDeo6W#5dI=?fTP&=?5J8k)7P{aX$~U3oLwyV|wgp4Ku1XuA2Z# zBOBkNibcbu5c4;vFLv}>?M|76*|&u6p7`fYeiG(7@8n&wSHFVEb`n6Rfv=y^j`UX* zeDYB_x)=sg*Q;)DgPMLhw8B@d)Z>M{Kj3Ze5BTrvcjcT*GR;?RC}wa2kwvqlE`@Nn zn{rHFaWtD)bx1?3AodUa&(NZmZVh?%U8(!%j#piS^|wl`&O4nzI+DeICl9c4=qkSC zz6aQ$j}Xn*F0)!fc+L902^{*qkOaUG^s^ekJPWn+usLviwp4VK4m0rpE@I|!%dQSh zGIi`X(WK5dEVQoW=1VrdpW|M&)9v0#*PaZ9(^`bMgHtR}wJ| zW_{_@FMIz_IKp(fA)c3|7VvQCxPpHez$ojG0+LW7)c4JiYYA^2A>v*5xE|7fyI*T| zzn^xy&N)ri%V0IZWtfKRbKT=O&UkY|2&*(tw`edW{^)Z{$D>;PWJCIZQ%nGRBq0gl zj}Q-h8QR|O&%fVGd*n&P-$##6UGQpZ_`64W1mF8vO;hw|X88QSYw900HX1nRr=lr9 zi$Wx53DyX**B=&_b%@@a@dC*DgeHiHuDSDtT@5`%Yc}HQ9xUC?JrjXR2XLS!p*C>f z9c6G1kk5)p@q?_sku*Woa42N&#f7Br5y7Yg)nt&JiyN=kcvRPLM7!_`_Z0pAT^#Ul zdJx9UJ0!uGwc!W;ET7NeH($p0W5s7w```Cn9-p4?dhh}1+jPL-93WjhKX|KR`~rL5 zxo{gZR4rt*SZdQ67FpbR9oTW4cQzPX%xQqr3{HRo6L(5fgGI{-6s_7;aknU1F(Gad zxx{mQQ8|+u?6IWAUkmj#8GtMU_I@^1-isJg@xPCP*4r87RU)_pnB(fB3ErI&z;LN* z4tABEl&L-ih8A*$PXZg&0Sji1D8q}fv3%RvZ;Rn&J|&`}iys*isfpqnnEQieA*S+q|zJ&+vLP{L$nbtO70Un(Zh_S)j^uM3ve<& z)z(sH6f6NM`E!u)BmaHzo>T@AXSl6FTdZ_Nvtyk2L8H8cwSwFpZGX!BolpS8n2@dz z^@OVA)dqDZ$6@pHMSueLOia?c7$PMaXB{rgYl@iKRea0cy}G)BxQs}cP5xcW;d7CB%}u5$B0 zmRT9_feI=$ce$W6dX@Xhop}Z}veWBK-#$G+A@JWq!M@(tgKKCz0ES6O^!X=~j8KsT%}`_GYNTaiyQMK#j3m|A@%YL0%^{wD>;&?*BA4a>&Hl=q30? zXjdXBiJ$=7qThoOK<+4fS(;s#qK5fM1X)UhqP&OHZ{}TEfYZy{sz-IOo8;e?b(5<7 z0rQJl{glC%(I?>r(~;_Lev_ zzxinM#Xv+Xj7v0QCux`@qOM0v7x#b*XV7Gs=6~cn@^C;Oj5Ck}C(F(+s_U~I!m4S) zG$=1BHZt>mz_Kn{fjY)pALIlQNd%^$g4{yHC)En3w#AWKK$#r$&<-JI7!O%AJ^cYX zj>77Pha63Upll+|)G=3nFuhlq9y=~0u|+1dfK=E8n)A5ZXweh#APZA_6Ui%tx<>M)k$97H z(+Wmj2%16Q{E@B~P*4CPL9OdQ7pgf<5FKZcy%oTTWrm9t&HV1yl5l5rr}^3AFpk`4 z7wtCR>ungiQ^UY5IyKS&Ap68rSo7-WuWh*nv_+d!g*->v*{{*;+NaTa0o;Qr@5Z)X zevE;H_N^LN@VRB7e2h(sDm}gazIwfQd!DY8jOd-C+X5NFyhVM37~NYB-b|o>#NK2#WwK zJpXrS1~zJnVFHKJDyYewmD$e<>J3UCjkm0= zMaJCh-5wJz?$iCN8?8?ZFcc@aeI!0jrw&R#c#Nv*Y& zjoPAe5et3Md>^1iOC>nEQ?lcO;hKpnwC4qQ3p=E8KQ09462%x{7iBJt&j8vl8>Mt} z!ql4L%A3CRU6`@*_o(=745aDe5TMbz2{ZnaT*c+{LL+Y#WS3;Erzkp-L|S2y{jror zkN&*GI5(8vu9+pGVBWOApd0hE5#5-UX~c$}YrbUpom#}{>?fIj;+<$bBY8%X5W`*5 zM)aUGtnB@@xWpkP^E?fH*}hdTaJk3&5AVAisRt(R@!X=y_GYi83ujwRr#LA<$yu*y z!TY#Jt9T-@=i*YvUQa8b##W<}n=cap5f+qY&-dwU);~PAb~|i~LI23R$8qEMo|?2l z$p~=ND|P31q7oIw1WX))(`p0Rdd^P6?25)r+QrHDHE2$)#y*@fo1ytu0v5)}N^I}f zRQVK|rK;jNe`;vsLhuc5?@U ztjxawrqC(Va&|ws(V&L9ArGVB^RDo+0>Sz(eJswKH-bbl`{z@|3Pm5#xCy;aS>uNy z@-G!patHz5x9TXn-ND+J2L6RWih+zW^4A1`%U+Yy_gL6qFk9ZZ($tyG^iJEHSlXX? z#E0UIa#<_q04!Fo%}sPvk|~qHyPuZM*=#E=kPjRJSExtDB8m)dI~O*8iT#J}Wg`GP zX$Xr)Qy;^Fks$*g|4|Uih#2{Y7xlYr6&A}e_j5~%r zEbGERJb`RpYl6B0=4Gaa-Olo%5%IYlJ51kfxv*`ILa}Uu!Y-_-Up>FMBv0i#yqBw1 zou{R&fQ%Z)oY%u!ZGjgD1cdcs`5qpAPT%i8#@kSx*0nYWSNN>#tS~iPSWi_BCv<{NU2~ z>;hOblYk1Q}>X9FL`WRjRI?};FZnPu7L9!3~p6f;~ z3B4KJ9-wkt*M-7blD5Q>lhexwF%t?U7gQF`Y7{qmpPuvwF#Yiv@zC^&0l1>=zkgg3aXgy#-@hvM zu=w|jxTq{1F=;OUlZ%8-sQ@&I+~51gM7FVUOd_uo&|i0{=r7pAi3ME6vBULIB$+|%t zc@r}iXzwx0ktZ5ANn;O?tONz*_q#D5v`UayHhh3ligt^6rh8`ZFyFP=#rFMx{eJjF zkq`$pzv-~D$DIf1?z-p0a14yQy zdC+5U<&Y4NxqQJVHQJ7ceXOj9E~%dq+6KYeD{yK|_2G)ulMH*`2B;@^N_CVQvGiLwJ0TsvvX2Vb49lN>K$RXpo=5$BMJtnc3fN_Tp!&fv@u#u> z0iQqovhA81<6<(=6&DFOUjE?kNBxSYO3bJFC1LVo1<=Eqx(99nxqki*4HC-OvobSx z9TYSrk7R|(l3vx%H?Y*J1rPaG_vQuePDCx?prH#5~P}0Uf8xgrkfs` ztR7i(0ykeZ_VVM9lSTxE4s9%3rqqBZOQsz3uG(ir{J;kIeH#BRmDy1>lT?~Nx{3Hh z6KE*zVLFL2je^d6P0_%LK zu!!Mdl>po#$4wH^Kxd4A$~3#h0?}KN+_Z1P`1l8a-@Z5rm29<;zvxD^-y}T|(mW5; zS8D%XZfP4$A&)lUUqq~W2Z|>|oPw&hUfA0x6`-b(HxLqpK>x>!gb>tFzt}ddP$o+FBNNzhm%>Pl*dmNDt*7xqhPn@2Xz)*;_)dzqqn`g3kYXDA~RW;)y@>F zriPx?rsV%>>@A?`Shlro+}+*XgS)#0cZY?$y9RgH;O-6y9unN$-7O3E@RM`?d$-(u zzHwkwk6w(`PtTfNU31c1^%hcl{!(cxb@a5TlH#6Kk~rS00+p9eJ|5WyhdveC9K%SH zX3l~qXQ|+k3n(4MVsFqAbob{_T*VLHj)6G0bD)@v-5dztNbQ(Sf7WAN;?Jpx^cSvl zls7x?M-?^E;nJn2H)Nc)b_Pv>rli+OZ3HCkv@r;C%73Y$T*BnYq>vyKLCW@;5ry0@ zt(F?Ww4V~$oJb<^!55eLz&CJcz3HrH;Xvsbu-ZO)pX`KhqFI9sVTSN2zaLy>CzXrA zZb4V^vynNF`YWrw%}f>jHe%8>kK5y@ui+%Sz8^$v@-x~h zXYYl&STH5@X5u5A_~t z_pU7L0}d==KcIoabu>K;pi>b=8+Gx}q>EvojY*Bl3eYGP{a6r$HN~y_z-4QOvYprq zw~Y!!h!|Ls!I^{uvG>b)T$D#+g_0YMXugS+j;BQV5)9q#kf983RI$2D6jBGAqw}A< zLaxt*COs3LDB@9tPobd0;R7-3!evE=J; zTsOtPJ)c553?Yme5Xp}|PXcF3Ve8$f4&+D+xc!dh`ErstWy+fPT3}`1reDP|X?mb# zGm;kh)M?YSewYqw)WF+02gva8ZPv!*!|`?Um8=rp=5c|JG-2%sOYakp;u#ewJu@hc zs8&XDERmV2%Sp%!Jo9`Y!vlPO{PF&R$2`4-l%ePKj!rLD6K2T0;C;;o`kW$8UqMoW zFOlFftbhk>rf(QmR){NFKjX_?SB9d)VIosspb!)0sCblkl}`pfpvuSc_W&s}S4~O# zf+4wJ8h=LeX-!FdQ6^bWd&x;2maA!NQp>P=WH-jcF#ZL8w9FNL*!gBIHL9e|aX`VG z({shHSF>cxPp@Lw0~OBYZO$;__gX2E)5K#P`@?yJ1}~$5q|d}$?NO8hDk(X}G>ZxH zQpU63roLHF)qPAU`~dWA<_e;VeFQr#H5H``%O&?j8O)Tn&fj6Jmpzg!!^IbSplPpG zr|Gd+<=R?|2-tg=EW8z1Krk#KAV`DFEf?mI1;W$3wpPXSkIy%bMAf19q+jo452_+y}h0{$PZs9QY7gKOUQPT!s4R|aGTE>oT$UFFdY*^ zk%5WR_sv70Zot`s%YYSpiSLxiWA4rgz~VWfnU^vcLvig)M(PN~7Purp^8i(v>3R0` zn)g?&N2(;hrIWE2h0-^szgXv*@XEdl3mzId00;JmOFgjit4c6I81N<}in4RO7#SB9 zk*OyL8D6f!8nzs$R2cCgl;JSvZJ6X@o+!v9IuspHyesHMQDjUcylzrQ~plqg-<7YXqPWt%QRz^?^Otw*13>j~%%0H;_cP4Cc-W|5~*oy>%hZYF7o_rKky|00&5N6b;CM^{;1gsiZT}(-NGd&?i>)CO^Z67Xf;_IPp4MurpX;JvG{RN{s^mrD2Bsd@!cjl} zVKK*x_9H%D=f2e(?3QzL4XFmw7fI2rG6itbsrYr6pe*~3Fgu<$V5&rzh=C(6<>=+k z)ipsiid@h>eOA+B297Xp0A`#+(lZHYUDKryVpeySN7y-7dBKSVqY>4bX|i4F7(#jf z7gw<4_$H2wE9s_eLeWH_PakZ!aj$R~ES3&X_N3hxFvLW+e;EX*KQ&Bj#-rr0o3*K} z*DssB(OsMSw`Ndj{XCDeKF?SEh_S!-<2I?IJ*&_g;#;Pmp_2BGm?x%J9QqGlk<0@$ z=o(-2EE#Jh@(2Obcmkph7nrrIbb*^~p+7C4aoWUj@X)3MSr1E$JNV&+HD zd5QfOS{N;xnrZl3jvp)0?b<(fCV$mj>_3}F-9~j`G<&su!}3nOoJK21mie-WgpJYM z!bevP0hB0vA3t@f%=Dx+rAdtg8B48MwTO)qdkx5-l zB0iD2cV%#L)r75+$&iinAjj3MK{z?*jyh6e?Ns!+f{4lS61jucBjO-xeBjn6UqT0+ z=q@ETDH<2pVj-qz2m3J76Fv2d?{!mbX}G_pj#qY0`jwzePK{}~p&sl`F+w@pv`ea| zAGK^St~)O3pGFZisci92D%47#WQNkU!uE22(I|ac%=5ae$251QmkZEW@CvLd7RrSi zqEWu75K5GQ4H{2juaw2joUb4?8$Lp3(iYWy8gXV}^vEp$* ztzBdhFmP`>qITPCiaRQ2+mV|X>9Bv>mpcbJ{CeB5mUsfteYow}Y6KVp*U2=EAouQ7 z1$ahw!bdiXHPm;Vj5TE=cWUgp|kK#sBb zVjm+_IgWk9h-Q7CN|kG>S6Xt1=9b=bJtUgNpy~C4Jx%eX;|#&@r+VgCd?1#&4UzFK za}zB;B^eEiF8vNh3b#FaVYY7!H`e4Ap2|r|f}asmqIm%})-%Mml{q zWz1-NMx@2zH-@p>XV69CtkfB@gV4c8Pun{vn--v#1R0-zE101IRXW4fqNWxb6w*Ly z-jguv{K39IZ+NM&eNrNz29q@9MQi!PQSrE3B2C}O7&#z_8H0FR)=J8$sWhgie+*#i zgPP8JK)9-w)_~i8tX$0-sydN6WsTPFf8+r_cZxltySn2Hnm15QLWQD@HF>O3AsMn- zpqT9GG%)UTUsp`>LfPU_bt7;Ylu=PpUw@~yrlFEiyg+XuBlhsCon;Gzhx)|~TyfjbJ+@v0QM+TUg#L*DwWNr}BsP(&rw4DI?#m5`ik7iL;AfVso`vTm6 zhJ-Jgf8Awz)r3|x3y@EoJp8#y7=r?dD^^kuEI;rP+5JC6vF5?qvYm|R{$;in+ zvY@~<^fPF9c=7Y%IZpkx^nGr!eKf^)z1$*X=zZ+>?&5j2On&nLutj1PMn0kVs4s0% zDRS=t`3HmeyluE9)46aYUpimU$^)R!0gtK?-GYxufQH!*t+OTD^1LCPHFJ8(z#kZb zkAf8cYBrb>VqD=_*X?P?>2I3Sk}hQFcAjU%=+i(8POCD1#H^Q&wx_}fX{n$aX-N{J zhfDe0;n8dQHq1h%Ug69G2CziqI%OHgGZ=)8LO3DTY2l6{)!v8N(`c2p#aC;%q2DQI zqNH@yk3S#aVludgVi)23StD&a%l^BNLP95wAew75*3EqQa*lp*Vv`)I{o{CvR3@BZ zkz&d1Nxq@gIbV+>M(uzsAvSd9AvX3+S{H0RPawQ~ksb0@^y241)n9S%D_*_!dAMM< zIO&bD;NLgInMKF|i|VEN4uf3O9r z$%*-NNJA#4K@omi0bkQ3ZqFcU`fGU0TEj7!jQxOhRJN%=&(*i{| zn|LA($r8VnTvN6_?9Y0@D=GnyjK|R-P-6WHw%%QRy(#5r!FucoFzhRqK$D%guiVPv zj8CLGwSzI&Mxl{iddW_+H4ec3!?lzyC z)P6yBh5X<)tXqQ35*0?SGr;Xx@z01XMn(}>@Fx@KzssJgQ#`u>wT$7@=UAN2O3oUY zn;KUlSHx3G_3k-=5NfD^YC#%s@|tm^(0w|#n3b7D)jG9Gexn|TR;&>k-bL51Uc@WV z;%_i3T#y1sbt{bI!SCga6LNybx66PcH~Ah&*oX?%-RKl$n;0waO&3ZN7k6hsW>`x@nGl}oVz?mu|dcHqtk$Ub_=B!iOxLk|5@Rsf!LlPgwVO zBhy+6>khZ};mTQ~{nQR(xE$a;hdEeKoIZ3IYreWx{c?!Nc6XO#XP}OQ2>enRuSWiI zf1+p{KXk$J7!-ZY{J2r_h9^867!*BnTnFaL2r?;W2YemT^D~Zlhwtjh?~zXJUgD)m zKfE4wVQr2pIs?RbfdWrIZB1WlvlX+-RP2^^KEKr9S^V@%ZjTrHLiJ;5oj+NaSJ?U% z5NXT|>NFSKs0Xy!N8>f62#o`*yPKQdm1^T8djOicLX>;T}G)NUvcPLnQR5Au1f%?6#*F zabA#n%TKVBwI5p1B4siUI!5|TAK=P76%_k^Y@n7ykwGTNFs69btgaRfRa3nAbp6Ca zsrz}(tA(`Mc{aq~kNC9Jt+IoO(caucM*wsC z{A*XDiw}2C>u8Oy;{^xbz5I}m+l2sOz^`4;&vF|-omI_DU6Rtol(CV*l)LLMiX*}IS?&ktodHvCS3bzTS6<6_?|4nrykAD@jk%e z1%+W#rrx)1vdDO%FeKFenA6D92i-xqIo$ZX+kWy~+mpb_56DE&2_L@o(6K6= z(qa&Krx(5_Jow8YB<3Hn3prR#C~gYgqSb?|cda!F8$ySc`=%EAG8U^O5*1>W*j}hb z$VptLonkDO{ z0lej?Muh@v=*;%}*LC3414ruMip(5PmrsZ8xUWStd|9o5z%{ z6`jAi@r&>rq0}PJEfLv<@uCB77tK{~DkHv9yLTYLbRHD>2=K@nm5Qdqdi(Tgh48j` z(3-AvnfswaX(dFTixPpE&6N1sB_!} z#w1gBp)I8Xc~fD=7L}#9VxY;oHi#U$XO0ZI1Wvr_E(PG>d3;OieY(u)|G=9Nf1dKD z!ewG3%0TPhXfv2ti%x8MO~i?E9lKa}f6 z`UA?xBdKlTnB0R|J4kM1&RrirUJ?Lx zUE30?EpVjL3vog?;NA^@R8|?gC|@y38EcvuPw-m=4Y<1TE?-eOst~ zGiF6Tx3M4kW8;{P<17Ke8ra-}ci!mviS%*^O(B=e-sMp0UD(K{a)YVA%ywSPOobrG z-tjGji?x99`DSPU4mhNv65$ELkm{n20yUf#1_gSfgOiwJS{NM)OZU9^OX`oF{t%Jce(??GdGb#Ov z2fo?m*wCy%Lv7$gEqIu>A>;AobF=t-VNh}%yk@7>=mK^WIQg(&wc6GNl{$9s6-yns ztda2L8Gd7KvCyk%89ux@PkWpb$8ZPP==&(`=&$C%2Q*N$0O#;RVuBK(6*xtnFJB!( zU2|55BWXG6l(dr${4V^)MIqW)t!1JW8y!ch`!MYWZaQBg=Y#uWXj_BCdrDa2NG?5a z{yrBHX^kI&b4OKIURw`q!gOt_1EoIdac$6Z_0zZT-U}|<^*+}_vzif@op0;I5ncNr z-^JbtNF>+Oz*jzIkACDg8~vD(0O0qGnw`1N@%|nef!u@2mQX_-JUc>4TQsMSQ{cZ+ zzH=k2M92G7M(+o#!D#8Q9g`Tu5f8sEkwU2a+;h+Js&8id(14*OdedB`dEh!8jFD}Q zAg*3}<0v+mEky8brMZ;SOcNQUQtiOj$ zlQTp*L~<-=qK<~=Dr@naO(&L7N12$wpg2t`Fbu0X#6rVn=O|INYCcqmrp?=Dd%0-o zED8U$Di^gzq|iXb->z7^=a`b(I~n69f9T2#)l_p z8_eYgx37`X6lqozVI|>L>^YOGb#Lj=DW=4Fu!)YvNA)&Vp(zOyA^`2oawa))Ky^Q) z7WuWZDkjXGTx-s$C~{YNU-&Zg;v`YFq|c;r$QS3i>9*}=MzvI^_$VbK$H^enQ)^(z ze9~aMWO6gY~NF`+R6-NB`|< z-h~bzRIgcZf_K$nJpi}Sc{yZ}?z|v}5sV=zVuHExip={<*mQEW#VX9NwEM%@CL>~Y zHVNsa<|Z9G|7hz{#BG(yxv-Ch5~?0f`Te$osGN2I1TAg=^5_FmoxOJceGz<2xwSsT){+G-Vv}8&cEVGcSjV2Yh*0$VvKtK zOr42&gV<(R*ZZ7SwS3Em3Uf~T%LY2DHC%2j@oUXkyA&^1&~-7UgI*uHW=D<9QJcGZ zxrSJc2r)TBFJXkDP;L{eTj~g74_`n)WLZo(sGGmjbDf$GjNnW5VgIl|=xmT^j7*kC z`$AAJH!;VSR>c+vePYyCY2TlvtSDLqswSFR?G(Q{(pNPUw+CE@dKE_14ANGVpkAy) zTS`35>l$~Zh~O(gF3omK*D1X$pePo;b`dl=2qISGx<8vaM}~X{xF^;w^xe>fpP2X$ z4@?e1B=hm*XWdAbYJJhHQ3>L5%`j_^vNy*){8ppTl!W7>fn@M0*1e)rw~5-hvX5gf ziRi(kOLPS3jw$}80lIlLB|P5!mu$9mTsbn!`M`U>x(4kc4tXe(LEhr$)5sZNirBS6 zf}n~FUJ4vymm&MisbYpoA3Jix%`*bCs{c$P5$8F)z$f%0rC@2UD-fwp6GqDG)|^2;7m{aq{RpqvG9;dOB#YBd3)($iF@3! zZzS4MFwd%zHf@bp5n^YIcYL!{S9nEckl&6miTZgPT#{KJT2?}Ga?B1vASIF1FugFm z(B0HD1zCrdS?~4{#6;7)qVICaT@o>$+Q>=`*>bUfi)ePkg0COKe=42#rft)95+yAj zfpdn=szjQYB)Ol53FTL*0Ck-pie^>F#v`lVDt#ds$w$8mCXBMn9LnoCL&n~Otrl?< zLeP3nX=BJbmRLjan_^>7n1FL^DWZ_K=PL4touOyw7p@qQU7&6rWpyq|OODEOzWS-j z!o{HKgnGE5UEH2ZMQrOw!y?W$w_Y}n!Kdag>f^o@txZ`i^LT3`&9thV$Q&8XOV5!n z!8gbEFMt`TG*wU%1PqqyvL!}p`O~dxzcTi--L63E_76wYfs2#|1s=ss6_)R&AVCq?Yh<4u6{_50la9?ypAJ%&|KFKtKa!JZz{1< ziRUNKjm}~-skgkcG;$$+(c*a#+=rO9SeSe@j$X*)utKYzTKtSc- zB&K3dzxg$rdVevyJV`7rBkLcpK8JHj(XAj+D>+sEx^wGtNo_m1NdB####Uim71WKP zjF(N<1*RgG{^*u95;!_Y-x4tFuH{ByE~4EV5`G7f8PF#LCRF-B@$vYYXA`4}=Ca{? z6zc)1LNkPK-x(TB!=0CL32gybzsz zpf%$BQu`>Bc@y1RP?0h@!70ho`$LDbW=S{Q<}t(%{Vj~x=ItA0#$g^wJ7qcvvic)C zM4sshiPBBumIQLvQ1Ky$ucSMzD}6(4ie<-2 z5k#aRR;L@TC&}c!&N6T+6fGR1CcuP3uZ0wMOqtwcMMMUE#Y`4~A){|pL~yXD=>yo{ z3Zv1wRiavmEs^v%S1Nt>HPPYSycRx%uK#G$h+7!$pwbm0e$#2`3&G=$-#4Y_s-7RE z(&2rv^`#^fuuGC^yKPE!U2apj*&(otf<8j|-b!w+w6IvZd^ev#f#@QY>7brUo4rdL zL(STaS)12y)%aaZm%qWlyjI+&jM z+KT$`rn(PDvLt$i!qm9wjLCs*(fWm@%RCEw(lt}qg z21=2qQO9p`dF}RFah^SD5({N0frY8I=J?Mmg+r?$&a@E@9Qxsy-4@w0YaIzDef`&) z+N2DN62-?EN>y+J?=*$+CIn3A@x~uoZd|e)uN4^Ru6=JQ(ePlDo^Z6Dl#FL&!fV`* zMd48$B6k>MLl^q~S?TC}%w>y1SCtu(##{bd47WeU`K~bebH*!WvO!O`29=n|E4yRD z`z@Sg*$J4QQCb|OopeFOp5foDW^^j2Bx~eq658M)-p9$zw3()q5hFS&O(_zux%W3z z9Ywm-;h!fSD5hn|_KU9fVP>a$L`S9Bhk53Q74T%KlNbuGL2|YDdfymnRV?B3=BNx3 z%|%oiB(Kx=!@gaH92KL{P3_!Yw5B#z>uaV#)c+ouiKAVQQ>Qa#TC#zs#NWyT2)u?E zEA5cjnLg$ATt$A>zajGQqtzNfj>CL`N5)+}wS0E?cx;2mF3=W@8fw}70KEPnoe1GV zff*v}M9`b}{!-{is5}S$%2KkRJOc_cRtqd;PA)$kisp%o#ZSR26KC?D1npc*rxsUc zA5*CvA>rTBwwLQt^D0Gm)ezCJXrykz=>=Xf8K@UEc z@Uu=@>|rp^=*Ly!TX#yz?|t0H*_%A2Sb3Zq$4Ojj2l{Zyw8ST|&`g^GA19Tver z-<(Y2fQx&~&@+`Jm8L#N%kShsR}#;4qD8r-U8yHWoifuti#05pA+hTwSjThjYBrCX zKM7aH6GGmMZfz4=k&WM$QT7-;7O24E^pqcgvKNZ1)weq&Rz7a9Slt46iu%ho>Nz

I8Yibteqi`F)+< zZB0E}JKU}^KuXxk>l2j}mS8wQ)|wBfccX#{;S;dru*QI5jI#AW1&oAYD+4aP$_FHi zkgh?7GvwIvR((@|OnFU4Z29R9Zz~428nGW%x9y@xYd(kRRv;|b(UU|SCvkAipnOT~ zh_PpcTBpo`7d=!6<%ZF8$80|EQ^B09EW7zU_8{S64%zdSy#k5sr@h6Dp`(An90T3y z^%G_+S?-ZP-;BNbTm~J^>329Px^9|eDhaHbcqK1Tg^xja&L|>12<*Ka2_3AR!YtF;3cnH_hZ=< zw{?79_2(4>fl!(s@fw{k1a`u^v}cq=&6jmTv+AmK>i3CgHT+^&JLmmEYT@UA_QWGBsI&Ry>mSOLY?#<{591_vZbk#R>HaZqb;&N^H ztgKcf`Y0wKwG-F0R!@@&pYW0aA7Q{R1xl3#?azLICbpcJ_c{-U6^`$+H}8Iku%%0? zu@54;H^(Ktiamlp{4>d$>s6nH_PNxCmJb-j;;ng#!5{O<&{-F(SmB{ zLpC~$Qn`pZ0pb-IDDVNbM(Vz8#aY4^>a|j&UA0lJsb>6>%%+WX#de7Zq1uiN2c{3R zENJtdW>`d=J0%hY(A|EZA)Al12ZMxO_nZDzud&4q@+u1nQ{_|O0N&y6T{IBFEa~Xf zquf{{>F2fR@~C2A%ubO*5+g4^HGL5Wt9)NiAb?1moeyCXSM2!?Z_p7MGiInE?VynK zxyBOH?OKW-mLn_4rBCWw&yJ^EA)ou~{2X<;sse?&x!YQ{rI)bV+{W!49Cfq1%dpy7 z088(Ab=PQlVzee@1CYbo;7nZx1@_YnC-~;TQp#KPyXVKL!rp})SY;f`Co?P2rboTDx7iGuB4%*^%6K?YrUrk02QX$|k zpCY`$)d7#>oqV2%2l83_-+c1n#)zXl!|s8yhM+xJ5w*eEXl4$t>JQBC|Fq4M#)B6A zq~299xa^hSCRpEj+4aCWKC&@ruw-E7p4sKrO3r-tbgDtbU#L8qFR+CE;%=rHxHu1a z%A119f05=NYqxpRK@%-GLz8=qnjTkp?6xj*DLGQb+e}eECS@Y5YKVVQx(zmHu)@b) z(`d-lSAb9b#WBv7B#4oo^+f?6ZW|7ctJto)0TG08T~0S}We1}_K_iG#o)6NUbpVm$ z5f63#qB_ct1EuqT?E;vf1*sa%ML1;LxeR8;<-kSXAiQib{Sc>QdKR{#`q>lC5A8at z{ZM0no6wo&+?@v4`kDvphC?6)CMPC@=Yrh5`%-8gRrJo!TF zZV`#*8d^->{QUZ}aHednrn7HS+Xe1g7BRV87Z#5jEwHEHU8j?ao=Ys!7L{3PdZJ-l zy?jlvEJ~>h*P&Fec*Sum7WpwH8F^E?8dg6TYv^0rx^2lE5qQ5@qff>1<+=l3Xym^3 z!+?~J39I+i;s8Je?r04#MH{-6-Rz)>=k97@Qf4l+Kjq8`oMtP>Hne%C*vBC+ZZxvH z;29T+&^{iwXq?c`=swWX<(xg%6-w$4^w}^{mVVog(HN3dqpUs2msJWg(XQpAzTanp zzAk+wto`ov^-}6=ec9#8*uu6VOcb<=HN1WRYmWjOtN>9^@T%W1yb>%KiUGqe$zfbm z0{n-|Yzo?%cTv$Oy0UPAQy6VEBTq)7b}EVPMgWS*fZn&E=U!sWYJ?cGoRu!`!1GX>U=Y0MA4>x0S!f5&@)@Q)uV|9H7F%g7_wLgB z7K@6oE^T-v!5dQtNlNJj*_f4FqKA#+pHZn8k(gnJ_%0C$(VB-|lT_CcSeoKTVc1se z%_Fo)%`a_JKM7ZSHhQ1Roc}(R8Dw(~+1`l%U4Ia?8Rn_7O72^FO>VR$v3Rb7)sOcT zW4&8*zlW}oxvh0Q?q3yQDA~3c$#H8J3%}7NFDA+9T)21OP@TQXs0WeC#(-*vePozq z;0kz}N?WZFY`h&g*($LcP-T(RD*3RqJcRyArD$453wdtn>0lq6l+MbR2EN_Ze4Q~N zaZLYsAl)VUeHw1zbNo+Maa41ip&`TE>Ns-u4gsUiOD)jSc$-_x0&bd!qQ+)ZM;rO4 z3CVd%H;B)hDrFMDc(3}T0eK?8`2fOrYnM!wRz0khh5SmZM==Erg-Yf!a*Oe8e{=LE z9cqCs28?SHUjwaH)|>oiKxbUM%M^K$w6{!NpM zb?#aU_4a;{aobU<`I(gW zkvKQrnKz?K9J6bWaFungW|LZfep`n$%m8+p4lcSd${m7*Hl-$Iy{5ZYx z&=}(oGo7*{)OGtzuS$i4#G?cYt|p3`6GD?h9%@0L^#KdUB+8MGgZl#GK(MlAvrgQda!d`uOo=C!=9Q3Pzklvfv z&*8Bc`gjCj>dJYETu9VVZCBigNUe5)t89K^Neugr@QB3IPaymGTotiq!c*ETn?V>p8Tpy)zX~7URfwhmZ1Dx6rAu}Tf&pql;<9q~aGjb{e8>KddCM2nokFgQ7K`3*w<<6V>&f_FA2slx{o{eanOo*` zDHrIEDg*Ac*}UfFN~7RlUO_Vr{FfB7BcWNy>hY;8W$;)-UfK;lH*lYs6_(WZ?id7C zZ|dzATtzu!3&dAh0WQD##_|^E2tS5`{K8?4Sp>^rbpNytVcL9)ifSA_5mI3mmS`DC zq=y~0Rao?kPs88AjpqLFn{E3O2)zEHNTS0pIbv+p0ayljOV_|)H6#^|diatK6VEib zBH4`@CQtMEz=Qcn2nrhC;LV}UFhX=kP`*pSqZmr{ZcPWIPNU_ZL%<1O>xU5tR1jG` z$h2oPq>dVYdGmBsH5^a$Xl~BAliyf`3Dxwi8IJSX<&$4N>BGAu@`30+ zU(VZltG;sPAqKn|cyTS!75r`IPqj2X$%&bj!j|fs(bbbKm9UgaPknk(bGy1 z^ada0z|mJ;V3AqgIilWRrjHJ0rKzs%yM#}@cPg9mDEI3-i;z9A@eyZ`T5#_sK)zue zu`_#M`TFaFmEqp;WDz}1*B7FT?wkn!#fC>~F}D*upYfeZ%p6vlJU30)eNB=k%PHGA zBs2+(H?TkYh2JVv$xw@|@Ao4J=zHP%?`}vlfFr=(3}A2SWoT<gl=*_NN=Y z|D9XC`cWR{o%ep9gRuN}TvrE2LtB75!1gzARE~LM^5E}O7+7wFrgxg%ySYsN9aZ(C zx{8>D>Tjl7oQVB5VFZc$FYw81BpDjzj3kA%H8f7D{bmE6{z@*-SezkrOIqGWMb&nZD#!S`5F6ciuKLaZ zCpRnSclogQ`g6p|A@!3Wh~Ib1F^ox_gu&mysbeLy!`b1@fT(ysXGw6TnQvI~LkHle z>vS%b6QcE+PRznMA`#ROSlgH9+*JEFu*b1?FRw* zU8{fX{Qn!2|NVdhaxU`w!`}nd|LbV1za0Hf4a61T;_C7qQvS0Ae`T2bg9ZN%mH#gW z`Csfv`%jF&$GQJ83g%yK`E#hm`ClLiNO92OKLGzHO8#LM49M@eZ`%&mtNQ+Z%lAU` z7m7N>|8=gTm!q?THNe!B$<@Km_V26>iP&*5Fc1*8_akxt!rJ=>mWqUkxPk3a{M(-H>_k*zif-!*pzb47ch)F1_O8gn}yV0Cgi+28YGu3E@a(4#oKfT+61PKE2S0^jH>qh^*?fo0$==FC>)V*-(&-cS+Y(YT&xc0v< z6*S`irTn`M{@xn?>jdw~)}MjDg{x!2DtFf2-Q$f40z&Z@7jeB;`0r-@yFpsIx;h&E zua@=SiC`o@oPM`~*!S|ccJQ8u{WHB zSidiTBbu`);(Kr2@y;XtOHDt%-@pHCmz68P+1T~};QHQid=XdN!Op*e|0&`4 z^GW_G-}vJsL;u}L{*rzCo&NW{;}1Gf=YLg&KV>0*Xa7B@|G_5g`mfl34)IEIkiRpo S_r44VMDM*fy?jT2fc$^TOFuaP literal 0 HcmV?d00001 diff --git a/.tox/log/.lock b/.tox/log/.lock new file mode 100755 index 0000000..e69de29 diff --git a/.tox/log/GLOB-0.log b/.tox/log/GLOB-0.log new file mode 100644 index 0000000..d2bd4f3 --- /dev/null +++ b/.tox/log/GLOB-0.log @@ -0,0 +1,64 @@ +action: GLOB, msg: packaging +cwd: /var/lib/buildkite-agent-3/builds/ip-172-31-58-32-us-west-2-compute-internal-3-1/ngrok/api-client-prs/.cache/ngrok-api-python +cmd: /var/lib/buildkite-agent-3/builds/ip-172-31-58-32-us-west-2-compute-internal-3-1/ngrok/api-client-prs/.cache/ngrok-api-python/venv/bin/python setup.py sdist --formats=zip --dist-dir /var/lib/buildkite-agent-3/builds/ip-172-31-58-32-us-west-2-compute-internal-3-1/ngrok/api-client-prs/.cache/ngrok-api-python/.tox/dist +running sdist +running egg_info +writing ngrok_api.egg-info/PKG-INFO +writing dependency_links to ngrok_api.egg-info/dependency_links.txt +writing requirements to ngrok_api.egg-info/requires.txt +writing top-level names to ngrok_api.egg-info/top_level.txt +reading manifest file 'ngrok_api.egg-info/SOURCES.txt' +adding license file 'LICENSE' +writing manifest file 'ngrok_api.egg-info/SOURCES.txt' +running check +creating ngrok-api-0.0.0 +creating ngrok-api-0.0.0/ngrok +creating ngrok-api-0.0.0/ngrok_api.egg-info +creating ngrok-api-0.0.0/tests +copying files to ngrok-api-0.0.0... +copying LICENSE -> ngrok-api-0.0.0 +copying README.md -> ngrok-api-0.0.0 +copying pyproject.toml -> ngrok-api-0.0.0 +copying setup.py -> ngrok-api-0.0.0 +copying ngrok/__init__.py -> ngrok-api-0.0.0/ngrok +copying ngrok/client.py -> ngrok-api-0.0.0/ngrok +copying ngrok/datatypes.py -> ngrok-api-0.0.0/ngrok +copying ngrok/error.py -> ngrok-api-0.0.0/ngrok +copying ngrok/http_client.py -> ngrok-api-0.0.0/ngrok +copying ngrok/iterator.py -> ngrok-api-0.0.0/ngrok +copying ngrok/services.py -> ngrok-api-0.0.0/ngrok +copying ngrok/utils.py -> ngrok-api-0.0.0/ngrok +copying ngrok_api.egg-info/PKG-INFO -> ngrok-api-0.0.0/ngrok_api.egg-info +copying ngrok_api.egg-info/SOURCES.txt -> ngrok-api-0.0.0/ngrok_api.egg-info +copying ngrok_api.egg-info/dependency_links.txt -> ngrok-api-0.0.0/ngrok_api.egg-info +copying ngrok_api.egg-info/requires.txt -> ngrok-api-0.0.0/ngrok_api.egg-info +copying ngrok_api.egg-info/top_level.txt -> ngrok-api-0.0.0/ngrok_api.egg-info +copying tests/test_ngrok.py -> ngrok-api-0.0.0/tests +Writing ngrok-api-0.0.0/setup.cfg +creating /var/lib/buildkite-agent-3/builds/ip-172-31-58-32-us-west-2-compute-internal-3-1/ngrok/api-client-prs/.cache/ngrok-api-python/.tox/dist +creating '/var/lib/buildkite-agent-3/builds/ip-172-31-58-32-us-west-2-compute-internal-3-1/ngrok/api-client-prs/.cache/ngrok-api-python/.tox/dist/ngrok-api-0.0.0.zip' and adding 'ngrok-api-0.0.0' to it +adding 'ngrok-api-0.0.0' +adding 'ngrok-api-0.0.0/tests' +adding 'ngrok-api-0.0.0/ngrok' +adding 'ngrok-api-0.0.0/ngrok_api.egg-info' +adding 'ngrok-api-0.0.0/PKG-INFO' +adding 'ngrok-api-0.0.0/pyproject.toml' +adding 'ngrok-api-0.0.0/README.md' +adding 'ngrok-api-0.0.0/LICENSE' +adding 'ngrok-api-0.0.0/setup.cfg' +adding 'ngrok-api-0.0.0/setup.py' +adding 'ngrok-api-0.0.0/tests/test_ngrok.py' +adding 'ngrok-api-0.0.0/ngrok/http_client.py' +adding 'ngrok-api-0.0.0/ngrok/utils.py' +adding 'ngrok-api-0.0.0/ngrok/error.py' +adding 'ngrok-api-0.0.0/ngrok/iterator.py' +adding 'ngrok-api-0.0.0/ngrok/services.py' +adding 'ngrok-api-0.0.0/ngrok/client.py' +adding 'ngrok-api-0.0.0/ngrok/datatypes.py' +adding 'ngrok-api-0.0.0/ngrok/__init__.py' +adding 'ngrok-api-0.0.0/ngrok_api.egg-info/PKG-INFO' +adding 'ngrok-api-0.0.0/ngrok_api.egg-info/dependency_links.txt' +adding 'ngrok-api-0.0.0/ngrok_api.egg-info/top_level.txt' +adding 'ngrok-api-0.0.0/ngrok_api.egg-info/SOURCES.txt' +adding 'ngrok-api-0.0.0/ngrok_api.egg-info/requires.txt' +removing 'ngrok-api-0.0.0' (and everything under it) diff --git a/README.md b/README.md index a4328bb..582f828 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ This library is published on [PyPi](https://pypi.org/project/ngrok-api/): pip install ngrok-api +## Support + +The best place to get support using this library is through the [ngrok Slack Community](https://ngrok.com/slack). If you find any bugs, please contribute by opening a new GitHub issue. + ## Documentation A quickstart guide and a full API reference are included in the [ngrok python API documentation](https://python-api.docs.ngrok.com). diff --git a/doc/source/application_sessions.rst b/doc/source/application_sessions.rst new file mode 100644 index 0000000..fd3ac2d --- /dev/null +++ b/doc/source/application_sessions.rst @@ -0,0 +1,9 @@ +Application Sessions +===================================== + +Do not construct this object directly, instead access the +:attr:`~ngrok.Client.application_sessions` property of an :class:`ngrok.Client` object. + +.. automodule:: ngrok.services + :members: ApplicationSessionsClient + :undoc-members: ApplicationSessionsClient diff --git a/doc/source/application_users.rst b/doc/source/application_users.rst new file mode 100644 index 0000000..7aa4ca6 --- /dev/null +++ b/doc/source/application_users.rst @@ -0,0 +1,9 @@ +Application Users +===================================== + +Do not construct this object directly, instead access the +:attr:`~ngrok.Client.application_users` property of an :class:`ngrok.Client` object. + +.. automodule:: ngrok.services + :members: ApplicationUsersClient + :undoc-members: ApplicationUsersClient diff --git a/doc/source/index.rst b/doc/source/index.rst index 699c4c0..35697fc 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -123,6 +123,8 @@ API Reference abuse_reports agent_ingresses api_keys + application_sessions + application_users failover_backends http_response_backends tunnel_group_backends diff --git a/docs/_modules/index.html b/docs/_modules/index.html index 48408d8..1e8a6dd 100644 --- a/docs/_modules/index.html +++ b/docs/_modules/index.html @@ -118,6 +118,8 @@

  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/_modules/ngrok/client.html b/docs/_modules/ngrok/client.html index c0acd20..a33a0e1 100644 --- a/docs/_modules/ngrok/client.html +++ b/docs/_modules/ngrok/client.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • @@ -190,7 +192,7 @@ @property def abuse_reports(self) -> AbuseReportsClient: - """Abuse Reports allow you to submit take-down requests for URLs hosted by + """Abuse Reports allow you to submit take-down requests for URLs hosted by ngrok that violate ngrok's terms of service.""" return AbuseReportsClient(self) @@ -200,16 +202,24 @@ @property def api_keys(self) -> APIKeysClient: - """API Keys are used to authenticate to the `ngrok - API` <https://ngrok.com/docs/api#authentication>`_. You may use the API itself + """API Keys are used to authenticate to the `ngrok + API <https://ngrok.com/docs/api#authentication>`_. You may use the API itself to provision and manage API Keys but you'll need to provision your first API - key from the `API Keys page` <https://dashboard.ngrok.com/api/keys>`_ on your + key from the `API Keys page <https://dashboard.ngrok.com/api/keys>`_ on your ngrok.com dashboard.""" return APIKeysClient(self) + @property + def application_sessions(self) -> ApplicationSessionsClient: + return ApplicationSessionsClient(self) + + @property + def application_users(self) -> ApplicationUsersClient: + return ApplicationUsersClient(self) + @property def certificate_authorities(self) -> CertificateAuthoritiesClient: - """Certificate Authorities are x509 certificates that are used to sign other + """Certificate Authorities are x509 certificates that are used to sign other x509 certificates. Attach a Certificate Authority to the Mutual TLS module to verify that the TLS certificate presented by a client has been signed by this CA. Certificate Authorities are used only for mTLS validation only and @@ -218,7 +228,7 @@ @property def credentials(self) -> CredentialsClient: - """Tunnel Credentials are ngrok agent authtokens. They authorize the ngrok + """Tunnel Credentials are ngrok agent authtokens. They authorize the ngrok agent to connect the ngrok service as your account. They are installed with the ``ngrok config add-authtoken`` command or by specifying it in the ``ngrok.yml`` configuration file with the ``authtoken`` property.""" @@ -226,7 +236,7 @@ @property def endpoints(self) -> EndpointsClient: - """Endpoints provides an API for querying the endpoint objects + """Endpoints provides an API for querying the endpoint objects which define what tunnel or edge is used to serve a hostport. Only active endpoints associated with a tunnel or backend are returned.""" return EndpointsClient(self) @@ -245,7 +255,7 @@ @property def ip_policies(self) -> IPPoliciesClient: - """IP Policies are reusable groups of CIDR ranges with an ``allow`` or ``deny`` + """IP Policies are reusable groups of CIDR ranges with an ``allow`` or ``deny`` action. They can be attached to endpoints via the Endpoint Configuration IP Policy module. They can also be used with IP Restrictions to control source IP ranges that can start tunnel sessions and connect to the API and dashboard.""" @@ -253,13 +263,13 @@ @property def ip_policy_rules(self) -> IPPolicyRulesClient: - """IP Policy Rules are the IPv4 or IPv6 CIDRs entries that + """IP Policy Rules are the IPv4 or IPv6 CIDRs entries that make up an IP Policy.""" return IPPolicyRulesClient(self) @property def ip_restrictions(self) -> IPRestrictionsClient: - """An IP restriction is a restriction placed on the CIDRs that are allowed to + """An IP restriction is a restriction placed on the CIDRs that are allowed to initiate traffic to a specific aspect of your ngrok account. An IP restriction has a type which defines the ingress it applies to. IP restrictions can be used to enforce the source IPs that can make API @@ -269,14 +279,14 @@ @property def reserved_addrs(self) -> ReservedAddrsClient: - """Reserved Addresses are TCP addresses that can be used to listen for traffic. + """Reserved Addresses are TCP addresses that can be used to listen for traffic. TCP address hostnames and ports are assigned by ngrok, they cannot be chosen.""" return ReservedAddrsClient(self) @property def reserved_domains(self) -> ReservedDomainsClient: - """Reserved Domains are hostnames that you can listen for traffic on. Domains + """Reserved Domains are hostnames that you can listen for traffic on. Domains can be used to listen for http, https or tls traffic. You may use a domain that you own by creating a CNAME record specified in the returned resource. This CNAME record points traffic for that domain to ngrok's edge servers.""" @@ -284,33 +294,33 @@ @property def ssh_certificate_authorities(self) -> SSHCertificateAuthoritiesClient: - """An SSH Certificate Authority is a pair of an SSH Certificate and its private + """An SSH Certificate Authority is a pair of an SSH Certificate and its private key that can be used to sign other SSH host and user certificates.""" return SSHCertificateAuthoritiesClient(self) @property def ssh_credentials(self) -> SSHCredentialsClient: - """SSH Credentials are SSH public keys that can be used to start SSH tunnels + """SSH Credentials are SSH public keys that can be used to start SSH tunnels via the ngrok SSH tunnel gateway.""" return SSHCredentialsClient(self) @property def ssh_host_certificates(self) -> SSHHostCertificatesClient: - """SSH Host Certificates along with the corresponding private key allows an SSH + """SSH Host Certificates along with the corresponding private key allows an SSH server to assert its authenticity to connecting SSH clients who trust the SSH Certificate Authority that was used to sign the certificate.""" return SSHHostCertificatesClient(self) @property def ssh_user_certificates(self) -> SSHUserCertificatesClient: - """SSH User Certificates are presented by SSH clients when connecting to an SSH + """SSH User Certificates are presented by SSH clients when connecting to an SSH server to authenticate their connection. The SSH server must trust the SSH Certificate Authority used to sign the certificate.""" return SSHUserCertificatesClient(self) @property def tls_certificates(self) -> TLSCertificatesClient: - """TLS Certificates are pairs of x509 certificates and their matching private + """TLS Certificates are pairs of x509 certificates and their matching private key that can be used to terminate TLS traffic. TLS certificates are unused until they are attached to a Domain. TLS Certificates may also be provisioned by ngrok automatically for domains on which you have enabled @@ -319,14 +329,14 @@ @property def tunnel_sessions(self) -> TunnelSessionsClient: - """Tunnel Sessions represent instances of ngrok agents or SSH reverse tunnel + """Tunnel Sessions represent instances of ngrok agents or SSH reverse tunnel sessions that are running and connected to the ngrok service. Each tunnel session can include one or more Tunnels.""" return TunnelSessionsClient(self) @property def tunnels(self) -> TunnelsClient: - """Tunnels provide endpoints to access services exposed by a running ngrok + """Tunnels provide endpoints to access services exposed by a running ngrok agent tunnel session or an SSH reverse tunnel session.""" return TunnelsClient(self) diff --git a/docs/_modules/ngrok/datatypes.html b/docs/_modules/ngrok/datatypes.html index bd641c7..54bcec6 100644 --- a/docs/_modules/ngrok/datatypes.html +++ b/docs/_modules/ngrok/datatypes.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • @@ -180,6 +182,7 @@

    Source code for ngrok.datatypes

     from __future__ import annotations
     from typing import Any, Mapping, Sequence
    +from datetime import datetime, timedelta
     from .iterator import PagedIterator
     
     
    @@ -199,12 +202,12 @@
     
         @property
         def id(self) -> str:
    -        """a resource identifier"""
    +        """a resource identifier"""
             return self._props["id"]
     
         @property
         def uri(self) -> str:
    -        """a uri for locating a resource"""
    +        """a uri for locating a resource"""
             return self._props["uri"]
    @@ -229,37 +232,37 @@ @property def id(self) -> str: - """ID of the abuse report""" + """ID of the abuse report""" return self._props["id"] @property def uri(self) -> str: - """URI of the abuse report API resource""" + """URI of the abuse report API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp that the abuse report record was created in RFC 3339 format""" + """timestamp that the abuse report record was created in RFC 3339 format""" return self._props["created_at"] @property def urls(self) -> Sequence[str]: - """a list of URLs containing suspected abusive content""" + """a list of URLs containing suspected abusive content""" return self._props["urls"] @property def metadata(self) -> str: - """arbitrary user-defined data about this abuse report. Optional, max 4096 bytes.""" + """arbitrary user-defined data about this abuse report. Optional, max 4096 bytes.""" return self._props["metadata"] @property def status(self) -> str: - """Indicates whether ngrok has processed the abuse report. one of ``PENDING``, ``PROCESSED``, or ``PARTIALLY_PROCESSED``""" + """Indicates whether ngrok has processed the abuse report. one of ``PENDING``, ``PROCESSED``, or ``PARTIALLY_PROCESSED``""" return self._props["status"] @property def hostnames(self) -> Sequence[AbuseReportHostname]: - """an array of hostname statuses related to the report""" + """an array of hostname statuses related to the report""" return self._props["hostnames"] @@ -279,12 +282,12 @@ @property def hostname(self) -> str: - """the hostname ngrok has parsed out of one of the reported URLs in this abuse report""" + """the hostname ngrok has parsed out of one of the reported URLs in this abuse report""" return self._props["hostname"] @property def status(self) -> str: - """indicates what action ngrok has taken against the hostname. one of ``PENDING``, ``BANNED``, ``UNBANNED``, or ``IGNORE``""" + """indicates what action ngrok has taken against the hostname. one of ``PENDING``, ``BANNED``, ``UNBANNED``, or ``IGNORE``""" return self._props["status"] @@ -322,42 +325,42 @@ @property def id(self) -> str: - """unique Agent Ingress resource identifier""" + """unique Agent Ingress resource identifier""" return self._props["id"] @property def uri(self) -> str: - """URI to the API resource of this Agent ingress""" + """URI to the API resource of this Agent ingress""" return self._props["uri"] @property def description(self) -> str: - """human-readable description of the use of this Agent Ingress. optional, max 255 bytes.""" + """human-readable description of the use of this Agent Ingress. optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this Agent Ingress. optional, max 4096 bytes""" + """arbitrary user-defined machine-readable data of this Agent Ingress. optional, max 4096 bytes""" return self._props["metadata"] @property def domain(self) -> str: - """the domain that you own to be used as the base domain name to generate regional agent ingress domains.""" + """the domain that you own to be used as the base domain name to generate regional agent ingress domains.""" return self._props["domain"] @property def ns_targets(self) -> Sequence[str]: - """a list of target values to use as the values of NS records for the domain property these values will delegate control over the domain to ngrok""" + """a list of target values to use as the values of NS records for the domain property these values will delegate control over the domain to ngrok""" return self._props["ns_targets"] @property def region_domains(self) -> Sequence[str]: - """a list of regional agent ingress domains that are subdomains of the value of domain this value may increase over time as ngrok adds more regions""" + """a list of regional agent ingress domains that are subdomains of the value of domain this value may increase over time as ngrok adds more regions""" return self._props["region_domains"] @property def created_at(self) -> str: - """timestamp when the Agent Ingress was created, RFC 3339 format""" + """timestamp when the Agent Ingress was created, RFC 3339 format""" return self._props["created_at"] @@ -385,17 +388,17 @@ @property def ingresses(self) -> Sequence[AgentIngress]: - """the list of Agent Ingresses owned by this account""" + """the list of Agent Ingresses owned by this account""" return self._props["ingresses"] @property def uri(self) -> str: - """URI of the Agent Ingress list API resource""" + """URI of the Agent Ingress list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -433,33 +436,38 @@ @property def id(self) -> str: - """unique API key resource identifier""" + """unique API key resource identifier""" return self._props["id"] @property def uri(self) -> str: - """URI to the API resource of this API key""" + """URI to the API resource of this API key""" return self._props["uri"] @property def description(self) -> str: - """human-readable description of what uses the API key to authenticate. optional, max 255 bytes.""" + """human-readable description of what uses the API key to authenticate. optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined data of this API key. optional, max 4096 bytes""" + """arbitrary user-defined data of this API key. optional, max 4096 bytes""" return self._props["metadata"] @property def created_at(self) -> str: - """timestamp when the api key was created, RFC 3339 format""" + """timestamp when the api key was created, RFC 3339 format""" return self._props["created_at"] @property def token(self) -> str: - """the bearer token that can be placed into the Authorization header to authenticate request to the ngrok API. **This value is only available one time, on the API response from key creation. Otherwise it is null.**""" - return self._props["token"] + """the bearer token that can be placed into the Authorization header to authenticate request to the ngrok API. **This value is only available one time, on the API response from key creation. Otherwise it is null.**""" + return self._props["token"] + + @property + def owner_id(self) -> str: + """If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot.""" + return self._props["owner_id"]
    [docs]class APIKeyList(object): @@ -486,20 +494,416 @@ @property def keys(self) -> Sequence[APIKey]: - """the list of API keys for this account""" + """the list of API keys for this account""" return self._props["keys"] @property def uri(self) -> str: - """URI of the API keys list API resource""" + """URI of the API keys list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"]
    +
    [docs]class ApplicationSession(object): + def __init__(self, client, props): + self._client = client + self._props = props + self._props["browser_session"] = ( + BrowserSession(client, props["browser_session"]) + if props.get("browser_session") is not None + else None + ) + self._props["application_user"] = ( + Ref(client, props["application_user"]) + if props.get("application_user") is not None + else None + ) + self._props["endpoint"] = ( + Ref(client, props["endpoint"]) + if props.get("endpoint") is not None + else None + ) + self._props["edge"] = ( + Ref(client, props["edge"]) if props.get("edge") is not None else None + ) + self._props["route"] = ( + Ref(client, props["route"]) if props.get("route") is not None else None + ) + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "<ApplicationSession {} {}>".format(self.id, repr(self._props)) + else: + return "<ApplicationSession {}>".format(repr(self._props)) + +
    [docs] def delete( + self, + ): + self._client.application_sessions.delete( + id=self.id, + )
    + + @property + def id(self) -> str: + """unique application session resource identifier""" + return self._props["id"] + + @property + def uri(self) -> str: + """URI of the application session API resource""" + return self._props["uri"] + + @property + def public_url(self) -> str: + """URL of the hostport served by this endpoint""" + return self._props["public_url"] + + @property + def browser_session(self) -> BrowserSession: + """browser session details of the application session""" + return self._props["browser_session"] + + @property + def application_user(self) -> Ref: + """application user this session is associated with""" + return self._props["application_user"] + + @property + def created_at(self) -> str: + """timestamp when the user was created in RFC 3339 format""" + return self._props["created_at"] + + @property + def last_active(self) -> str: + """timestamp when the user was last active in RFC 3339 format""" + return self._props["last_active"] + + @property + def expires_at(self) -> str: + """timestamp when session expires in RFC 3339 format""" + return self._props["expires_at"] + + @property + def endpoint(self) -> Ref: + """ephemeral endpoint this session is associated with""" + return self._props["endpoint"] + + @property + def edge(self) -> Ref: + """edge this session is associated with, null if the endpoint is agent-initiated""" + return self._props["edge"] + + @property + def route(self) -> Ref: + """route this session is associated with, null if the endpoint is agent-initiated""" + return self._props["route"]
    + + +
    [docs]class ApplicationSessionList(object): + def __init__(self, client, props): + self._client = client + self._props = props + self._props["application_sessions"] = ( + [ApplicationSession(client, x) for x in props["application_sessions"]] + if props.get("application_sessions") is not None + else [] + ) + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "<ApplicationSessionList {} {}>".format(self.id, repr(self._props)) + else: + return "<ApplicationSessionList {}>".format(repr(self._props)) + + def __iter__(self): + return PagedIterator(self._client, self, "application_sessions") + + @property + def application_sessions(self) -> Sequence[ApplicationSession]: + """list of all application sessions on this account""" + return self._props["application_sessions"] + + @property + def uri(self) -> str: + """URI of the application session list API resource""" + return self._props["uri"] + + @property + def next_page_uri(self) -> str: + """URI of the next page, or null if there is no next page""" + return self._props["next_page_uri"]
    + + +
    [docs]class BrowserSession(object): + def __init__(self, client, props): + self._client = client + self._props = props + self._props["user_agent"] = ( + UserAgent(client, props["user_agent"]) + if props.get("user_agent") is not None + else None + ) + self._props["location"] = ( + Location(client, props["location"]) + if props.get("location") is not None + else None + ) + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "<BrowserSession {} {}>".format(self.id, repr(self._props)) + else: + return "<BrowserSession {}>".format(repr(self._props)) + + @property + def user_agent(self) -> UserAgent: + """HTTP User-Agent data""" + return self._props["user_agent"] + + @property + def ip_address(self) -> str: + """IP address""" + return self._props["ip_address"] + + @property + def location(self) -> Location: + """IP geolocation data""" + return self._props["location"]
    + + +
    [docs]class UserAgent(object): + def __init__(self, client, props): + self._client = client + self._props = props + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "<UserAgent {} {}>".format(self.id, repr(self._props)) + else: + return "<UserAgent {}>".format(repr(self._props)) + + @property + def raw(self) -> str: + """raw User-Agent request header""" + return self._props["raw"] + + @property + def browser_name(self) -> str: + """browser name (e.g. Chrome)""" + return self._props["browser_name"] + + @property + def browser_version(self) -> str: + """browser version (e.g. 102)""" + return self._props["browser_version"] + + @property + def device_type(self) -> str: + """type of device (e.g. Desktop)""" + return self._props["device_type"] + + @property + def os_name(self) -> str: + """operating system name (e.g. MacOS)""" + return self._props["os_name"] + + @property + def os_version(self) -> str: + """operating system version (e.g. 10.15.7)""" + return self._props["os_version"]
    + + +
    [docs]class Location(object): + def __init__(self, client, props): + self._client = client + self._props = props + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "<Location {} {}>".format(self.id, repr(self._props)) + else: + return "<Location {}>".format(repr(self._props)) + + @property + def country_code(self) -> str: + """ISO country code""" + return self._props["country_code"] + + @property + def latitude(self) -> float: + """geographical latitude""" + return self._props["latitude"] + + @property + def longitude(self) -> float: + """geographical longitude""" + return self._props["longitude"] + + @property + def lat_long_radius_km(self) -> int: + """accuracy radius of the geographical coordinates""" + return self._props["lat_long_radius_km"]
    + + +
    [docs]class ApplicationUser(object): + def __init__(self, client, props): + self._client = client + self._props = props + self._props["identity_provider"] = ( + IdentityProvider(client, props["identity_provider"]) + if props.get("identity_provider") is not None + else None + ) + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "<ApplicationUser {} {}>".format(self.id, repr(self._props)) + else: + return "<ApplicationUser {}>".format(repr(self._props)) + +
    [docs] def delete( + self, + ): + self._client.application_users.delete( + id=self.id, + )
    + + @property + def id(self) -> str: + """unique application user resource identifier""" + return self._props["id"] + + @property + def uri(self) -> str: + """URI of the application user API resource""" + return self._props["uri"] + + @property + def identity_provider(self) -> IdentityProvider: + """identity provider that the user authenticated with""" + return self._props["identity_provider"] + + @property + def provider_user_id(self) -> str: + """unique user identifier""" + return self._props["provider_user_id"] + + @property + def username(self) -> str: + """user username""" + return self._props["username"] + + @property + def email(self) -> str: + """user email""" + return self._props["email"] + + @property + def name(self) -> str: + """user common name""" + return self._props["name"] + + @property + def created_at(self) -> str: + """timestamp when the user was created in RFC 3339 format""" + return self._props["created_at"] + + @property + def last_active(self) -> str: + """timestamp when the user was last active in RFC 3339 format""" + return self._props["last_active"] + + @property + def last_login(self) -> str: + """timestamp when the user last signed-in in RFC 3339 format""" + return self._props["last_login"]
    + + +
    [docs]class ApplicationUserList(object): + def __init__(self, client, props): + self._client = client + self._props = props + self._props["application_users"] = ( + [ApplicationUser(client, x) for x in props["application_users"]] + if props.get("application_users") is not None + else [] + ) + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "<ApplicationUserList {} {}>".format(self.id, repr(self._props)) + else: + return "<ApplicationUserList {}>".format(repr(self._props)) + + def __iter__(self): + return PagedIterator(self._client, self, "application_users") + + @property + def application_users(self) -> Sequence[ApplicationUser]: + """list of all application users on this account""" + return self._props["application_users"] + + @property + def uri(self) -> str: + """URI of the application user list API resource""" + return self._props["uri"] + + @property + def next_page_uri(self) -> str: + """URI of the next page, or null if there is no next page""" + return self._props["next_page_uri"]
    + + +
    [docs]class IdentityProvider(object): + def __init__(self, client, props): + self._client = client + self._props = props + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "<IdentityProvider {} {}>".format(self.id, repr(self._props)) + else: + return "<IdentityProvider {}>".format(repr(self._props)) + + @property + def name(self) -> str: + """name of the identity provider (e.g. Google)""" + return self._props["name"] + + @property + def url(self) -> str: + """URL of the identity provider (e.g. `https://accounts.google.com <https://accounts.google.com>`_)""" + return self._props["url"]
    + +
    [docs]class FailoverBackend(object): def __init__(self, client, props): self._client = client @@ -536,32 +940,32 @@ @property def id(self) -> str: - """unique identifier for this Failover backend""" + """unique identifier for this Failover backend""" return self._props["id"] @property def uri(self) -> str: - """URI of the FailoverBackend API resource""" + """URI of the FailoverBackend API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the backend was created, RFC 3339 format""" + """timestamp when the backend was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of this backend. Optional""" + """human-readable description of this backend. Optional""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this backend. Optional""" + """arbitrary user-defined machine-readable data of this backend. Optional""" return self._props["metadata"] @property def backends(self) -> Sequence[str]: - """the ids of the child backends in order""" + """the ids of the child backends in order""" return self._props["backends"]
    @@ -589,17 +993,17 @@ @property def backends(self) -> Sequence[FailoverBackend]: - """the list of all Failover backends on this account""" + """the list of all Failover backends on this account""" return self._props["backends"] @property def uri(self) -> str: - """URI of the Failover backends list API resource""" + """URI of the Failover backends list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -647,37 +1051,37 @@ @property def uri(self) -> str: - """URI of the HTTPResponseBackend API resource""" + """URI of the HTTPResponseBackend API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the backend was created, RFC 3339 format""" + """timestamp when the backend was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of this backend. Optional""" + """human-readable description of this backend. Optional""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this backend. Optional""" + """arbitrary user-defined machine-readable data of this backend. Optional""" return self._props["metadata"] @property def body(self) -> str: - """body to return as fixed content""" + """body to return as fixed content""" return self._props["body"] @property def headers(self) -> Mapping[str, str]: - """headers to return""" + """headers to return""" return self._props["headers"] @property def status_code(self) -> int: - """status code to return""" + """status code to return""" return self._props["status_code"] @@ -757,37 +1161,37 @@ @property def id(self) -> str: - """unique identifier for this TunnelGroup backend""" + """unique identifier for this TunnelGroup backend""" return self._props["id"] @property def uri(self) -> str: - """URI of the TunnelGroupBackend API resource""" + """URI of the TunnelGroupBackend API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the backend was created, RFC 3339 format""" + """timestamp when the backend was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of this backend. Optional""" + """human-readable description of this backend. Optional""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this backend. Optional""" + """arbitrary user-defined machine-readable data of this backend. Optional""" return self._props["metadata"] @property def labels(self) -> Mapping[str, str]: - """labels to watch for tunnels on, e.g. app->foo, dc->bar""" + """labels to watch for tunnels on, e.g. app->foo, dc->bar""" return self._props["labels"] @property def tunnels(self) -> Sequence[Ref]: - """tunnels matching this backend""" + """tunnels matching this backend""" return self._props["tunnels"] @@ -815,17 +1219,17 @@ @property def backends(self) -> Sequence[TunnelGroupBackend]: - """the list of all TunnelGroup backends on this account""" + """the list of all TunnelGroup backends on this account""" return self._props["backends"] @property def uri(self) -> str: - """URI of the TunnelGroup backends list API resource""" + """URI of the TunnelGroup backends list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -865,32 +1269,32 @@ @property def id(self) -> str: - """unique identifier for this Weighted backend""" + """unique identifier for this Weighted backend""" return self._props["id"] @property def uri(self) -> str: - """URI of the WeightedBackend API resource""" + """URI of the WeightedBackend API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the backend was created, RFC 3339 format""" + """timestamp when the backend was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of this backend. Optional""" + """human-readable description of this backend. Optional""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this backend. Optional""" + """arbitrary user-defined machine-readable data of this backend. Optional""" return self._props["metadata"] @property def backends(self) -> Mapping[str, int]: - """the ids of the child backends to their weights [0-10000]""" + """the ids of the child backends to their weights [0-10000]""" return self._props["backends"] @@ -918,17 +1322,17 @@ @property def backends(self) -> Sequence[WeightedBackend]: - """the list of all Weighted backends on this account""" + """the list of all Weighted backends on this account""" return self._props["backends"] @property def uri(self) -> str: - """URI of the Weighted backends list API resource""" + """URI of the Weighted backends list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -966,57 +1370,57 @@ @property def id(self) -> str: - """unique identifier for this Certificate Authority""" + """unique identifier for this Certificate Authority""" return self._props["id"] @property def uri(self) -> str: - """URI of the Certificate Authority API resource""" + """URI of the Certificate Authority API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the Certificate Authority was created, RFC 3339 format""" + """timestamp when the Certificate Authority was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of this Certificate Authority. optional, max 255 bytes.""" + """human-readable description of this Certificate Authority. optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this Certificate Authority. optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this Certificate Authority. optional, max 4096 bytes.""" return self._props["metadata"] @property def ca_pem(self) -> str: - """raw PEM of the Certificate Authority""" + """raw PEM of the Certificate Authority""" return self._props["ca_pem"] @property def subject_common_name(self) -> str: - """subject common name of the Certificate Authority""" + """subject common name of the Certificate Authority""" return self._props["subject_common_name"] @property def not_before(self) -> str: - """timestamp when this Certificate Authority becomes valid, RFC 3339 format""" + """timestamp when this Certificate Authority becomes valid, RFC 3339 format""" return self._props["not_before"] @property def not_after(self) -> str: - """timestamp when this Certificate Authority becomes invalid, RFC 3339 format""" + """timestamp when this Certificate Authority becomes invalid, RFC 3339 format""" return self._props["not_after"] @property def key_usages(self) -> Sequence[str]: - """set of actions the private key of this Certificate Authority can be used for""" + """set of actions the private key of this Certificate Authority can be used for""" return self._props["key_usages"] @property def extended_key_usages(self) -> Sequence[str]: - """extended set of actions the private key of this Certificate Authority can be used for""" + """extended set of actions the private key of this Certificate Authority can be used for""" return self._props["extended_key_usages"] @@ -1044,17 +1448,17 @@ @property def certificate_authorities(self) -> Sequence[CertificateAuthority]: - """the list of all certificate authorities on this account""" + """the list of all certificate authorities on this account""" return self._props["certificate_authorities"] @property def uri(self) -> str: - """URI of the certificates authorities list API resource""" + """URI of the certificates authorities list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -1094,38 +1498,43 @@ @property def id(self) -> str: - """unique tunnel credential resource identifier""" + """unique tunnel credential resource identifier""" return self._props["id"] @property def uri(self) -> str: - """URI of the tunnel credential API resource""" + """URI of the tunnel credential API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the tunnel credential was created, RFC 3339 format""" + """timestamp when the tunnel credential was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of who or what will use the credential to authenticate. Optional, max 255 bytes.""" + """human-readable description of who or what will use the credential to authenticate. Optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this credential. Optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this credential. Optional, max 4096 bytes.""" return self._props["metadata"] @property def token(self) -> str: - """the credential's authtoken that can be used to authenticate an ngrok agent. **This value is only available one time, on the API response from credential creation, otherwise it is null.**""" + """the credential's authtoken that can be used to authenticate an ngrok agent. **This value is only available one time, on the API response from credential creation, otherwise it is null.**""" return self._props["token"] @property def acl(self) -> Sequence[str]: - """optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions.""" - return self._props["acl"] + """optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of ``bind:*=example`` which will allow ``x=example``, ``y=example``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions.""" + return self._props["acl"] + + @property + def owner_id(self) -> str: + """If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot.""" + return self._props["owner_id"]
    [docs]class CredentialList(object): @@ -1152,17 +1561,17 @@ @property def credentials(self) -> Sequence[Credential]: - """the list of all tunnel credentials on this account""" + """the list of all tunnel credentials on this account""" return self._props["credentials"] @property def uri(self) -> str: - """URI of the tunnel credential list API resource""" + """URI of the tunnel credential list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"]
    @@ -1184,17 +1593,17 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property def provider(self) -> str: - """a string indicating which webhook provider will be sending webhooks to this endpoint. Value must be one of the supported providers: ``SLACK``, ``SNS``, ``STRIPE``, ``GITHUB``, ``TWILIO``, ``SHOPIFY``, ``GITLAB``, ``INTERCOM``, ``SENDGRID``, ``XERO``, ``PAGERDUTY``.""" + """a string indicating which webhook provider will be sending webhooks to this endpoint. Value must be one of the supported providers defined at `https://ngrok.com/docs/cloud-edge/modules/webhook <https://ngrok.com/docs/cloud-edge/modules/webhook>`_""" return self._props["provider"] @property def secret(self) -> str: - """a string secret used to validate requests from the given provider. All providers except AWS SNS require a secret""" + """a string secret used to validate requests from the given provider. All providers except AWS SNS require a secret""" return self._props["secret"] @@ -1214,7 +1623,7 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @@ -1239,12 +1648,12 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property def certificate_authorities(self) -> Sequence[Ref]: - """PEM-encoded CA certificates that will be used to validate. Multiple CAs may be provided by concatenating them together.""" + """PEM-encoded CA certificates that will be used to validate. Multiple CAs may be provided by concatenating them together.""" return self._props["certificate_authorities"] @@ -1264,12 +1673,12 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property def certificate_authority_ids(self) -> Sequence[str]: - """list of certificate authorities that will be used to validate the TLS client certificate presented by the initiator of the TLS connection""" + """list of certificate authorities that will be used to validate the TLS client certificate presented by the initiator of the TLS connection""" return self._props["certificate_authority_ids"] @@ -1289,17 +1698,17 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property def terminate_at(self) -> str: - """``edge`` if the ngrok edge should terminate TLS traffic, ``upstream`` if TLS traffic should be passed through to the upstream ngrok agent / application server for termination. if ``upstream`` is chosen, most other modules will be disallowed because they rely on the ngrok edge being able to access the underlying traffic.""" + """``edge`` if the ngrok edge should terminate TLS traffic, ``upstream`` if TLS traffic should be passed through to the upstream ngrok agent / application server for termination. if ``upstream`` is chosen, most other modules will be disallowed because they rely on the ngrok edge being able to access the underlying traffic.""" return self._props["terminate_at"] @property def min_version(self) -> str: - """The minimum TLS version used for termination and advertised to the client during the TLS handshake. if unspecified, ngrok will choose an industry-safe default. This value must be null if ``terminate_at`` is set to ``upstream``.""" + """The minimum TLS version used for termination and advertised to the client during the TLS handshake. if unspecified, ngrok will choose an industry-safe default. This value must be null if ``terminate_at`` is set to ``upstream``.""" return self._props["min_version"] @@ -1321,12 +1730,12 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property def min_version(self) -> str: - """The minimum TLS version used for termination and advertised to the client during the TLS handshake. if unspecified, ngrok will choose an industry-safe default. This value must be null if ``terminate_at`` is set to ``upstream``.""" + """The minimum TLS version used for termination and advertised to the client during the TLS handshake. if unspecified, ngrok will choose an industry-safe default. This value must be null if ``terminate_at`` is set to ``upstream``.""" return self._props["min_version"] @@ -1346,17 +1755,17 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property def add(self) -> Mapping[str, str]: - """a map of header key to header value that will be injected into the HTTP Request before being sent to the upstream application server""" + """a map of header key to header value that will be injected into the HTTP Request before being sent to the upstream application server""" return self._props["add"] @property def remove(self) -> Sequence[str]: - """a list of header names that will be removed from the HTTP Request before being sent to the upstream application server""" + """a list of header names that will be removed from the HTTP Request before being sent to the upstream application server""" return self._props["remove"] @@ -1376,17 +1785,17 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property def add(self) -> Mapping[str, str]: - """a map of header key to header value that will be injected into the HTTP Response returned to the HTTP client""" + """a map of header key to header value that will be injected into the HTTP Response returned to the HTTP client""" return self._props["add"] @property def remove(self) -> Sequence[str]: - """a list of header names that will be removed from the HTTP Response returned to the HTTP client""" + """a list of header names that will be removed from the HTTP Response returned to the HTTP client""" return self._props["remove"] @@ -1411,7 +1820,7 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property @@ -1435,12 +1844,12 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property def ip_policy_ids(self) -> Sequence[str]: - """list of all IP policies that will be used to check if a source IP is allowed access to the endpoint""" + """list of all IP policies that will be used to check if a source IP is allowed access to the endpoint""" return self._props["ip_policy_ids"] @@ -1460,32 +1869,32 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property - def tripped_duration(self) -> int: - """Integer number of seconds after which the circuit is tripped to wait before re-evaluating upstream health""" - return self._props["tripped_duration"] + def tripped_duration(self) -> timedelta: + """Integer number of seconds after which the circuit is tripped to wait before re-evaluating upstream health""" + return timedelta(seconds=self._props["tripped_duration"]) @property def rolling_window(self) -> int: - """Integer number of seconds in the statistical rolling window that metrics are retained for.""" + """Integer number of seconds in the statistical rolling window that metrics are retained for.""" return self._props["rolling_window"] @property def num_buckets(self) -> int: - """Integer number of buckets into which metrics are retained. Max 128.""" + """Integer number of buckets into which metrics are retained. Max 128.""" return self._props["num_buckets"] @property def volume_threshold(self) -> int: - """Integer number of requests in a rolling window that will trip the circuit. Helpful if traffic volume is low.""" + """Integer number of requests in a rolling window that will trip the circuit. Helpful if traffic volume is low.""" return self._props["volume_threshold"] @property def error_threshold_percentage(self) -> float: - """Error threshold percentage should be between 0 - 1.0, not 0-100.0""" + """Error threshold percentage should be between 0 - 1.0, not 0-100.0""" return self._props["error_threshold_percentage"] @@ -1510,37 +1919,37 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property def provider(self) -> EndpointOAuthProvider: - """an object which defines the identity provider to use for authentication and configuration for who may access the endpoint""" + """an object which defines the identity provider to use for authentication and configuration for who may access the endpoint""" return self._props["provider"] @property def options_passthrough(self) -> bool: - """Do not enforce authentication on HTTP OPTIONS requests. necessary if you are supporting CORS.""" + """Do not enforce authentication on HTTP OPTIONS requests. necessary if you are supporting CORS.""" return self._props["options_passthrough"] @property def cookie_prefix(self) -> str: - """the prefix of the session cookie that ngrok sets on the http client to cache authentication. default is 'ngrok.'""" + """the prefix of the session cookie that ngrok sets on the http client to cache authentication. default is 'ngrok.'""" return self._props["cookie_prefix"] @property def inactivity_timeout(self) -> int: - """Integer number of seconds of inactivity after which if the user has not accessed the endpoint, their session will time out and they will be forced to reauthenticate.""" + """Integer number of seconds of inactivity after which if the user has not accessed the endpoint, their session will time out and they will be forced to reauthenticate.""" return self._props["inactivity_timeout"] @property - def maximum_duration(self) -> int: - """Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.""" - return self._props["maximum_duration"] + def maximum_duration(self) -> timedelta: + """Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.""" + return timedelta(seconds=self._props["maximum_duration"]) @property def auth_check_interval(self) -> int: - """Integer number of seconds after which ngrok guarantees it will refresh user state from the identity provider and recheck whether the user is still authorized to access the endpoint. This is the preferred tunable to use to enforce a minimum amount of time after which a revoked user will no longer be able to access the resource.""" + """Integer number of seconds after which ngrok guarantees it will refresh user state from the identity provider and recheck whether the user is still authorized to access the endpoint. This is the preferred tunable to use to enforce a minimum amount of time after which a revoked user will no longer be able to access the resource.""" return self._props["auth_check_interval"] @@ -1568,6 +1977,26 @@ if props.get("google") is not None else None ) + self._props["linkedin"] = ( + EndpointOAuthLinkedIn(client, props["linkedin"]) + if props.get("linkedin") is not None + else None + ) + self._props["gitlab"] = ( + EndpointOAuthGitLab(client, props["gitlab"]) + if props.get("gitlab") is not None + else None + ) + self._props["twitch"] = ( + EndpointOAuthTwitch(client, props["twitch"]) + if props.get("twitch") is not None + else None + ) + self._props["amazon"] = ( + EndpointOAuthAmazon(client, props["amazon"]) + if props.get("amazon") is not None + else None + ) def __eq__(self, other): return self._props == other._props @@ -1580,23 +2009,43 @@ @property def github(self) -> EndpointOAuthGitHub: - """configuration for using github as the identity provider""" + """configuration for using github as the identity provider""" return self._props["github"] @property def facebook(self) -> EndpointOAuthFacebook: - """configuration for using facebook as the identity provider""" + """configuration for using facebook as the identity provider""" return self._props["facebook"] @property def microsoft(self) -> EndpointOAuthMicrosoft: - """configuration for using microsoft as the identity provider""" + """configuration for using microsoft as the identity provider""" return self._props["microsoft"] @property def google(self) -> EndpointOAuthGoogle: - """configuration for using google as the identity provider""" - return self._props["google"] + """configuration for using google as the identity provider""" + return self._props["google"] + + @property + def linkedin(self) -> EndpointOAuthLinkedIn: + """configuration for using linkedin as the identity provider""" + return self._props["linkedin"] + + @property + def gitlab(self) -> EndpointOAuthGitLab: + """configuration for using gitlab as the identity provider""" + return self._props["gitlab"] + + @property + def twitch(self) -> EndpointOAuthTwitch: + """configuration for using twitch as the identity provider""" + return self._props["twitch"] + + @property + def amazon(self) -> EndpointOAuthAmazon: + """configuration for using amazon as the identity provider""" + return self._props["amazon"]
    [docs]class EndpointOAuthGitHub(object): @@ -1615,37 +2064,37 @@ @property def client_id(self) -> str: - """the OAuth app client ID. retrieve it from the identity provider's dashboard where you created your own OAuth app. optional. if unspecified, ngrok will use its own managed oauth application which has additional restrictions. see the OAuth module docs for more details. if present, client_secret must be present as well.""" + """the OAuth app client ID. retrieve it from the identity provider's dashboard where you created your own OAuth app. optional. if unspecified, ngrok will use its own managed oauth application which has additional restrictions. see the OAuth module docs for more details. if present, client_secret must be present as well.""" return self._props["client_id"] @property def client_secret(self) -> str: - """the OAuth app client secret. retrieve if from the identity provider's dashboard where you created your own OAuth app. optional, see all of the caveats in the docs for ``client_id``.""" + """the OAuth app client secret. retrieve if from the identity provider's dashboard where you created your own OAuth app. optional, see all of the caveats in the docs for ``client_id``.""" return self._props["client_secret"] @property def scopes(self) -> Sequence[str]: - """a list of provider-specific OAuth scopes with the permissions your OAuth app would like to ask for. these may not be set if you are using the ngrok-managed oauth app (i.e. you must pass both ``client_id`` and ``client_secret`` to set scopes)""" + """a list of provider-specific OAuth scopes with the permissions your OAuth app would like to ask for. these may not be set if you are using the ngrok-managed oauth app (i.e. you must pass both ``client_id`` and ``client_secret`` to set scopes)""" return self._props["scopes"] @property def email_addresses(self) -> Sequence[str]: - """a list of email addresses of users authenticated by identity provider who are allowed access to the endpoint""" + """a list of email addresses of users authenticated by identity provider who are allowed access to the endpoint""" return self._props["email_addresses"] @property def email_domains(self) -> Sequence[str]: - """a list of email domains of users authenticated by identity provider who are allowed access to the endpoint""" + """a list of email domains of users authenticated by identity provider who are allowed access to the endpoint""" return self._props["email_domains"] @property def teams(self) -> Sequence[str]: - """a list of github teams identifiers. users will be allowed access to the endpoint if they are a member of any of these teams. identifiers should be in the 'slug' format qualified with the org name, e.g. ``org-name/team-name``""" + """a list of github teams identifiers. users will be allowed access to the endpoint if they are a member of any of these teams. identifiers should be in the 'slug' format qualified with the org name, e.g. ``org-name/team-name``""" return self._props["teams"] @property def organizations(self) -> Sequence[str]: - """a list of github org identifiers. users who are members of any of the listed organizations will be allowed access. identifiers should be the organization's 'slug'""" + """a list of github org identifiers. users who are members of any of the listed organizations will be allowed access. identifiers should be the organization's 'slug'""" return self._props["organizations"]
    @@ -1665,27 +2114,27 @@ @property def client_id(self) -> str: - """the OAuth app client ID. retrieve it from the identity provider's dashboard where you created your own OAuth app. optional. if unspecified, ngrok will use its own managed oauth application which has additional restrictions. see the OAuth module docs for more details. if present, client_secret must be present as well.""" + """the OAuth app client ID. retrieve it from the identity provider's dashboard where you created your own OAuth app. optional. if unspecified, ngrok will use its own managed oauth application which has additional restrictions. see the OAuth module docs for more details. if present, client_secret must be present as well.""" return self._props["client_id"] @property def client_secret(self) -> str: - """the OAuth app client secret. retrieve if from the identity provider's dashboard where you created your own OAuth app. optional, see all of the caveats in the docs for ``client_id``.""" + """the OAuth app client secret. retrieve if from the identity provider's dashboard where you created your own OAuth app. optional, see all of the caveats in the docs for ``client_id``.""" return self._props["client_secret"] @property def scopes(self) -> Sequence[str]: - """a list of provider-specific OAuth scopes with the permissions your OAuth app would like to ask for. these may not be set if you are using the ngrok-managed oauth app (i.e. you must pass both ``client_id`` and ``client_secret`` to set scopes)""" + """a list of provider-specific OAuth scopes with the permissions your OAuth app would like to ask for. these may not be set if you are using the ngrok-managed oauth app (i.e. you must pass both ``client_id`` and ``client_secret`` to set scopes)""" return self._props["scopes"] @property def email_addresses(self) -> Sequence[str]: - """a list of email addresses of users authenticated by identity provider who are allowed access to the endpoint""" + """a list of email addresses of users authenticated by identity provider who are allowed access to the endpoint""" return self._props["email_addresses"] @property def email_domains(self) -> Sequence[str]: - """a list of email domains of users authenticated by identity provider who are allowed access to the endpoint""" + """a list of email domains of users authenticated by identity provider who are allowed access to the endpoint""" return self._props["email_domains"] @@ -1705,27 +2154,27 @@ @property def client_id(self) -> str: - """the OAuth app client ID. retrieve it from the identity provider's dashboard where you created your own OAuth app. optional. if unspecified, ngrok will use its own managed oauth application which has additional restrictions. see the OAuth module docs for more details. if present, client_secret must be present as well.""" + """the OAuth app client ID. retrieve it from the identity provider's dashboard where you created your own OAuth app. optional. if unspecified, ngrok will use its own managed oauth application which has additional restrictions. see the OAuth module docs for more details. if present, client_secret must be present as well.""" return self._props["client_id"] @property def client_secret(self) -> str: - """the OAuth app client secret. retrieve if from the identity provider's dashboard where you created your own OAuth app. optional, see all of the caveats in the docs for ``client_id``.""" + """the OAuth app client secret. retrieve if from the identity provider's dashboard where you created your own OAuth app. optional, see all of the caveats in the docs for ``client_id``.""" return self._props["client_secret"] @property def scopes(self) -> Sequence[str]: - """a list of provider-specific OAuth scopes with the permissions your OAuth app would like to ask for. these may not be set if you are using the ngrok-managed oauth app (i.e. you must pass both ``client_id`` and ``client_secret`` to set scopes)""" + """a list of provider-specific OAuth scopes with the permissions your OAuth app would like to ask for. these may not be set if you are using the ngrok-managed oauth app (i.e. you must pass both ``client_id`` and ``client_secret`` to set scopes)""" return self._props["scopes"] @property def email_addresses(self) -> Sequence[str]: - """a list of email addresses of users authenticated by identity provider who are allowed access to the endpoint""" + """a list of email addresses of users authenticated by identity provider who are allowed access to the endpoint""" return self._props["email_addresses"] @property def email_domains(self) -> Sequence[str]: - """a list of email domains of users authenticated by identity provider who are allowed access to the endpoint""" + """a list of email domains of users authenticated by identity provider who are allowed access to the endpoint""" return self._props["email_domains"] @@ -1745,27 +2194,167 @@ @property def client_id(self) -> str: - """the OAuth app client ID. retrieve it from the identity provider's dashboard where you created your own OAuth app. optional. if unspecified, ngrok will use its own managed oauth application which has additional restrictions. see the OAuth module docs for more details. if present, client_secret must be present as well.""" + """the OAuth app client ID. retrieve it from the identity provider's dashboard where you created your own OAuth app. optional. if unspecified, ngrok will use its own managed oauth application which has additional restrictions. see the OAuth module docs for more details. if present, client_secret must be present as well.""" + return self._props["client_id"] + + @property + def client_secret(self) -> str: + """the OAuth app client secret. retrieve if from the identity provider's dashboard where you created your own OAuth app. optional, see all of the caveats in the docs for ``client_id``.""" + return self._props["client_secret"] + + @property + def scopes(self) -> Sequence[str]: + """a list of provider-specific OAuth scopes with the permissions your OAuth app would like to ask for. these may not be set if you are using the ngrok-managed oauth app (i.e. you must pass both ``client_id`` and ``client_secret`` to set scopes)""" + return self._props["scopes"] + + @property + def email_addresses(self) -> Sequence[str]: + """a list of email addresses of users authenticated by identity provider who are allowed access to the endpoint""" + return self._props["email_addresses"] + + @property + def email_domains(self) -> Sequence[str]: + """a list of email domains of users authenticated by identity provider who are allowed access to the endpoint""" + return self._props["email_domains"] + + +
    [docs]class EndpointOAuthLinkedIn(object): + def __init__(self, client, props): + self._client = client + self._props = props + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "<EndpointOAuthLinkedIn {} {}>".format(self.id, repr(self._props)) + else: + return "<EndpointOAuthLinkedIn {}>".format(repr(self._props)) + + @property + def client_id(self) -> str: + return self._props["client_id"] + + @property + def client_secret(self) -> str: + return self._props["client_secret"] + + @property + def scopes(self) -> Sequence[str]: + return self._props["scopes"] + + @property + def email_addresses(self) -> Sequence[str]: + return self._props["email_addresses"] + + @property + def email_domains(self) -> Sequence[str]: + return self._props["email_domains"]
    + + +
    [docs]class EndpointOAuthGitLab(object): + def __init__(self, client, props): + self._client = client + self._props = props + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "<EndpointOAuthGitLab {} {}>".format(self.id, repr(self._props)) + else: + return "<EndpointOAuthGitLab {}>".format(repr(self._props)) + + @property + def client_id(self) -> str: + return self._props["client_id"] + + @property + def client_secret(self) -> str: + return self._props["client_secret"] + + @property + def scopes(self) -> Sequence[str]: + return self._props["scopes"] + + @property + def email_addresses(self) -> Sequence[str]: + return self._props["email_addresses"] + + @property + def email_domains(self) -> Sequence[str]: + return self._props["email_domains"]
    + + +
    [docs]class EndpointOAuthTwitch(object): + def __init__(self, client, props): + self._client = client + self._props = props + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "<EndpointOAuthTwitch {} {}>".format(self.id, repr(self._props)) + else: + return "<EndpointOAuthTwitch {}>".format(repr(self._props)) + + @property + def client_id(self) -> str: + return self._props["client_id"] + + @property + def client_secret(self) -> str: + return self._props["client_secret"] + + @property + def scopes(self) -> Sequence[str]: + return self._props["scopes"] + + @property + def email_addresses(self) -> Sequence[str]: + return self._props["email_addresses"] + + @property + def email_domains(self) -> Sequence[str]: + return self._props["email_domains"]
    + + +
    [docs]class EndpointOAuthAmazon(object): + def __init__(self, client, props): + self._client = client + self._props = props + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "<EndpointOAuthAmazon {} {}>".format(self.id, repr(self._props)) + else: + return "<EndpointOAuthAmazon {}>".format(repr(self._props)) + + @property + def client_id(self) -> str: return self._props["client_id"] @property def client_secret(self) -> str: - """the OAuth app client secret. retrieve if from the identity provider's dashboard where you created your own OAuth app. optional, see all of the caveats in the docs for ``client_id``.""" return self._props["client_secret"] @property def scopes(self) -> Sequence[str]: - """a list of provider-specific OAuth scopes with the permissions your OAuth app would like to ask for. these may not be set if you are using the ngrok-managed oauth app (i.e. you must pass both ``client_id`` and ``client_secret`` to set scopes)""" return self._props["scopes"] @property def email_addresses(self) -> Sequence[str]: - """a list of email addresses of users authenticated by identity provider who are allowed access to the endpoint""" return self._props["email_addresses"] @property def email_domains(self) -> Sequence[str]: - """a list of email domains of users authenticated by identity provider who are allowed access to the endpoint""" return self._props["email_domains"]
    @@ -1785,77 +2374,77 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property def options_passthrough(self) -> bool: - """Do not enforce authentication on HTTP OPTIONS requests. necessary if you are supporting CORS.""" + """Do not enforce authentication on HTTP OPTIONS requests. necessary if you are supporting CORS.""" return self._props["options_passthrough"] @property def cookie_prefix(self) -> str: - """the prefix of the session cookie that ngrok sets on the http client to cache authentication. default is 'ngrok.'""" + """the prefix of the session cookie that ngrok sets on the http client to cache authentication. default is 'ngrok.'""" return self._props["cookie_prefix"] @property def inactivity_timeout(self) -> int: - """Integer number of seconds of inactivity after which if the user has not accessed the endpoint, their session will time out and they will be forced to reauthenticate.""" + """Integer number of seconds of inactivity after which if the user has not accessed the endpoint, their session will time out and they will be forced to reauthenticate.""" return self._props["inactivity_timeout"] @property - def maximum_duration(self) -> int: - """Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.""" - return self._props["maximum_duration"] + def maximum_duration(self) -> timedelta: + """Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.""" + return timedelta(seconds=self._props["maximum_duration"]) @property def idp_metadata(self) -> str: - """The full XML IdP EntityDescriptor. Your IdP may provide this to you as a a file to download or as a URL.""" + """The full XML IdP EntityDescriptor. Your IdP may provide this to you as a a file to download or as a URL.""" return self._props["idp_metadata"] @property def force_authn(self) -> bool: - """If true, indicates that whenever we redirect a user to the IdP for authentication that the IdP must prompt the user for authentication credentials even if the user already has a valid session with the IdP.""" + """If true, indicates that whenever we redirect a user to the IdP for authentication that the IdP must prompt the user for authentication credentials even if the user already has a valid session with the IdP.""" return self._props["force_authn"] @property def allow_idp_initiated(self) -> bool: - """If true, the IdP may initiate a login directly (e.g. the user does not need to visit the endpoint first and then be redirected). The IdP should set the ``RelayState`` parameter to the target URL of the resource they want the user to be redirected to after the SAML login assertion has been processed.""" + """If true, the IdP may initiate a login directly (e.g. the user does not need to visit the endpoint first and then be redirected). The IdP should set the ``RelayState`` parameter to the target URL of the resource they want the user to be redirected to after the SAML login assertion has been processed.""" return self._props["allow_idp_initiated"] @property def authorized_groups(self) -> Sequence[str]: - """If present, only users who are a member of one of the listed groups may access the target endpoint.""" + """If present, only users who are a member of one of the listed groups may access the target endpoint.""" return self._props["authorized_groups"] @property def entity_id(self) -> str: - """The SP Entity's unique ID. This always takes the form of a URL. In ngrok's implementation, this URL is the same as the metadata URL. This will need to be specified to the IdP as configuration.""" + """The SP Entity's unique ID. This always takes the form of a URL. In ngrok's implementation, this URL is the same as the metadata URL. This will need to be specified to the IdP as configuration.""" return self._props["entity_id"] @property def assertion_consumer_service_url(self) -> str: - """The public URL of the SP's Assertion Consumer Service. This is where the IdP will redirect to during an authentication flow. This will need to be specified to the IdP as configuration.""" + """The public URL of the SP's Assertion Consumer Service. This is where the IdP will redirect to during an authentication flow. This will need to be specified to the IdP as configuration.""" return self._props["assertion_consumer_service_url"] @property def single_logout_url(self) -> str: - """The public URL of the SP's Single Logout Service. This is where the IdP will redirect to during a single logout flow. This will optionally need to be specified to the IdP as configuration.""" + """The public URL of the SP's Single Logout Service. This is where the IdP will redirect to during a single logout flow. This will optionally need to be specified to the IdP as configuration.""" return self._props["single_logout_url"] @property def request_signing_certificate_pem(self) -> str: - """PEM-encoded x.509 certificate of the key pair that is used to sign all SAML requests that the ngrok SP makes to the IdP. Many IdPs do not support request signing verification, but we highly recommend specifying this in the IdP's configuration if it is supported.""" + """PEM-encoded x.509 certificate of the key pair that is used to sign all SAML requests that the ngrok SP makes to the IdP. Many IdPs do not support request signing verification, but we highly recommend specifying this in the IdP's configuration if it is supported.""" return self._props["request_signing_certificate_pem"] @property def metadata_url(self) -> str: - """A public URL where the SP's metadata is hosted. If an IdP supports dynamic configuration, this is the URL it can use to retrieve the SP metadata.""" + """A public URL where the SP's metadata is hosted. If an IdP supports dynamic configuration, this is the URL it can use to retrieve the SP metadata.""" return self._props["metadata_url"] @property def nameid_format(self) -> str: - """Defines the name identifier format the SP expects the IdP to use in its assertions to identify subjects. If unspecified, a default value of ``urn:oasis:names:tc:SAML:2.0:nameid-format:persistent`` will be used. A subset of the allowed values enumerated by the SAML specification are supported.""" + """Defines the name identifier format the SP expects the IdP to use in its assertions to identify subjects. If unspecified, a default value of ``urn:oasis:names:tc:SAML:2.0:nameid-format:persistent`` will be used. A subset of the allowed values enumerated by the SAML specification are supported.""" return self._props["nameid_format"] @@ -1875,52 +2464,52 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property def options_passthrough(self) -> bool: - """Do not enforce authentication on HTTP OPTIONS requests. necessary if you are supporting CORS.""" + """Do not enforce authentication on HTTP OPTIONS requests. necessary if you are supporting CORS.""" return self._props["options_passthrough"] @property def cookie_prefix(self) -> str: - """the prefix of the session cookie that ngrok sets on the http client to cache authentication. default is 'ngrok.'""" + """the prefix of the session cookie that ngrok sets on the http client to cache authentication. default is 'ngrok.'""" return self._props["cookie_prefix"] @property def inactivity_timeout(self) -> int: - """Integer number of seconds of inactivity after which if the user has not accessed the endpoint, their session will time out and they will be forced to reauthenticate.""" + """Integer number of seconds of inactivity after which if the user has not accessed the endpoint, their session will time out and they will be forced to reauthenticate.""" return self._props["inactivity_timeout"] @property - def maximum_duration(self) -> int: - """Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.""" - return self._props["maximum_duration"] + def maximum_duration(self) -> timedelta: + """Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.""" + return timedelta(seconds=self._props["maximum_duration"]) @property def idp_metadata(self) -> str: - """The full XML IdP EntityDescriptor. Your IdP may provide this to you as a a file to download or as a URL.""" + """The full XML IdP EntityDescriptor. Your IdP may provide this to you as a a file to download or as a URL.""" return self._props["idp_metadata"] @property def force_authn(self) -> bool: - """If true, indicates that whenever we redirect a user to the IdP for authentication that the IdP must prompt the user for authentication credentials even if the user already has a valid session with the IdP.""" + """If true, indicates that whenever we redirect a user to the IdP for authentication that the IdP must prompt the user for authentication credentials even if the user already has a valid session with the IdP.""" return self._props["force_authn"] @property def allow_idp_initiated(self) -> bool: - """If true, the IdP may initiate a login directly (e.g. the user does not need to visit the endpoint first and then be redirected). The IdP should set the ``RelayState`` parameter to the target URL of the resource they want the user to be redirected to after the SAML login assertion has been processed.""" + """If true, the IdP may initiate a login directly (e.g. the user does not need to visit the endpoint first and then be redirected). The IdP should set the ``RelayState`` parameter to the target URL of the resource they want the user to be redirected to after the SAML login assertion has been processed.""" return self._props["allow_idp_initiated"] @property def authorized_groups(self) -> Sequence[str]: - """If present, only users who are a member of one of the listed groups may access the target endpoint.""" + """If present, only users who are a member of one of the listed groups may access the target endpoint.""" return self._props["authorized_groups"] @property def nameid_format(self) -> str: - """Defines the name identifier format the SP expects the IdP to use in its assertions to identify subjects. If unspecified, a default value of ``urn:oasis:names:tc:SAML:2.0:nameid-format:persistent`` will be used. A subset of the allowed values enumerated by the SAML specification are supported.""" + """Defines the name identifier format the SP expects the IdP to use in its assertions to identify subjects. If unspecified, a default value of ``urn:oasis:names:tc:SAML:2.0:nameid-format:persistent`` will be used. A subset of the allowed values enumerated by the SAML specification are supported.""" return self._props["nameid_format"] @@ -1940,47 +2529,47 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property def options_passthrough(self) -> bool: - """Do not enforce authentication on HTTP OPTIONS requests. necessary if you are supporting CORS.""" + """Do not enforce authentication on HTTP OPTIONS requests. necessary if you are supporting CORS.""" return self._props["options_passthrough"] @property def cookie_prefix(self) -> str: - """the prefix of the session cookie that ngrok sets on the http client to cache authentication. default is 'ngrok.'""" + """the prefix of the session cookie that ngrok sets on the http client to cache authentication. default is 'ngrok.'""" return self._props["cookie_prefix"] @property def inactivity_timeout(self) -> int: - """Integer number of seconds of inactivity after which if the user has not accessed the endpoint, their session will time out and they will be forced to reauthenticate.""" + """Integer number of seconds of inactivity after which if the user has not accessed the endpoint, their session will time out and they will be forced to reauthenticate.""" return self._props["inactivity_timeout"] @property - def maximum_duration(self) -> int: - """Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.""" - return self._props["maximum_duration"] + def maximum_duration(self) -> timedelta: + """Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.""" + return timedelta(seconds=self._props["maximum_duration"]) @property def issuer(self) -> str: - """URL of the OIDC "OpenID provider". This is the base URL used for discovery.""" + """URL of the OIDC "OpenID provider". This is the base URL used for discovery.""" return self._props["issuer"] @property def client_id(self) -> str: - """The OIDC app's client ID and OIDC audience.""" + """The OIDC app's client ID and OIDC audience.""" return self._props["client_id"] @property def client_secret(self) -> str: - """The OIDC app's client secret.""" + """The OIDC app's client secret.""" return self._props["client_secret"] @property def scopes(self) -> Sequence[str]: - """The set of scopes to request from the OIDC identity provider.""" + """The set of scopes to request from the OIDC identity provider.""" return self._props["scopes"] @@ -2003,12 +2592,12 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property def backend(self) -> Ref: - """backend to be used to back this endpoint""" + """backend to be used to back this endpoint""" return self._props["backend"] @@ -2028,12 +2617,12 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @property def backend_id(self) -> str: - """backend to be used to back this endpoint""" + """backend to be used to back this endpoint""" return self._props["backend_id"] @@ -2055,7 +2644,7 @@ @property def enabled(self) -> bool: - """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" + """``true`` if the module will be applied to traffic, ``false`` to disable. default ``true`` if unspecified""" return self._props["enabled"] @@ -2176,97 +2765,97 @@ @property def edge_id(self) -> str: - """unique identifier of this edge""" + """unique identifier of this edge""" return self._props["edge_id"] @property def id(self) -> str: - """unique identifier of this edge route""" + """unique identifier of this edge route""" return self._props["id"] @property def created_at(self) -> str: - """timestamp when the edge configuration was created, RFC 3339 format""" + """timestamp when the edge configuration was created, RFC 3339 format""" return self._props["created_at"] @property def match_type(self) -> str: - """Type of match to use for this route. Valid values are "exact_path" and "path_prefix".""" + """Type of match to use for this route. Valid values are "exact_path" and "path_prefix".""" return self._props["match_type"] @property def match(self) -> str: - """Route selector: "/blog" or "example.com" or "example.com/blog" """ + """Route selector: "/blog" or "example.com" or "example.com/blog" """ return self._props["match"] @property def uri(self) -> str: - """URI of the edge API resource""" + """URI of the edge API resource""" return self._props["uri"] @property def description(self) -> str: - """human-readable description of what this edge will be used for; optional, max 255 bytes.""" + """human-readable description of what this edge will be used for; optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this edge. Optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this edge. Optional, max 4096 bytes.""" return self._props["metadata"] @property def backend(self) -> EndpointBackend: - """backend module configuration or ``null``""" + """backend module configuration or ``null``""" return self._props["backend"] @property def ip_restriction(self) -> EndpointIPPolicy: - """ip restriction module configuration or ``null``""" + """ip restriction module configuration or ``null``""" return self._props["ip_restriction"] @property def circuit_breaker(self) -> EndpointCircuitBreaker: - """circuit breaker module configuration or ``null``""" + """circuit breaker module configuration or ``null``""" return self._props["circuit_breaker"] @property def compression(self) -> EndpointCompression: - """compression module configuration or ``null``""" + """compression module configuration or ``null``""" return self._props["compression"] @property def request_headers(self) -> EndpointRequestHeaders: - """request headers module configuration or ``null``""" + """request headers module configuration or ``null``""" return self._props["request_headers"] @property def response_headers(self) -> EndpointResponseHeaders: - """response headers module configuration or ``null``""" + """response headers module configuration or ``null``""" return self._props["response_headers"] @property def webhook_verification(self) -> EndpointWebhookValidation: - """webhook verification module configuration or ``null``""" + """webhook verification module configuration or ``null``""" return self._props["webhook_verification"] @property def oauth(self) -> EndpointOAuth: - """oauth module configuration or ``null``""" + """oauth module configuration or ``null``""" return self._props["oauth"] @property def saml(self) -> EndpointSAML: - """saml module configuration or ``null``""" + """saml module configuration or ``null``""" return self._props["saml"] @property def oidc(self) -> EndpointOIDC: - """oidc module configuration or ``null``""" + """oidc module configuration or ``null``""" return self._props["oidc"] @property def websocket_tcp_converter(self) -> EndpointWebsocketTCPConverter: - """websocket to tcp adapter configuration or ``null``""" + """websocket to tcp adapter configuration or ``null``""" return self._props["websocket_tcp_converter"] @@ -2294,17 +2883,17 @@ @property def https_edges(self) -> Sequence[HTTPSEdge]: - """the list of all HTTPS Edges on this account""" + """the list of all HTTPS Edges on this account""" return self._props["https_edges"] @property def uri(self) -> str: - """URI of the HTTPS Edge list API resource""" + """URI of the HTTPS Edge list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -2363,37 +2952,37 @@ @property def id(self) -> str: - """unique identifier of this edge""" + """unique identifier of this edge""" return self._props["id"] @property def description(self) -> str: - """human-readable description of what this edge will be used for; optional, max 255 bytes.""" + """human-readable description of what this edge will be used for; optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this edge; optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this edge; optional, max 4096 bytes.""" return self._props["metadata"] @property def created_at(self) -> str: - """timestamp when the edge configuration was created, RFC 3339 format""" + """timestamp when the edge configuration was created, RFC 3339 format""" return self._props["created_at"] @property def uri(self) -> str: - """URI of the edge API resource""" + """URI of the edge API resource""" return self._props["uri"] @property def hostports(self) -> Sequence[str]: - """hostports served by this edge""" + """hostports served by this edge""" return self._props["hostports"] @property def mutual_tls(self) -> EndpointMutualTLS: - """edge modules""" + """edge modules""" return self._props["mutual_tls"] @property @@ -2402,7 +2991,7 @@ @property def routes(self) -> Sequence[HTTPSEdgeRoute]: - """routes""" + """routes""" return self._props["routes"] @@ -2430,17 +3019,17 @@ @property def tcp_edges(self) -> Sequence[TCPEdge]: - """the list of all TCP Edges on this account""" + """the list of all TCP Edges on this account""" return self._props["tcp_edges"] @property def uri(self) -> str: - """URI of the TCP Edge list API resource""" + """URI of the TCP Edge list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -2494,37 +3083,37 @@ @property def id(self) -> str: - """unique identifier of this edge""" + """unique identifier of this edge""" return self._props["id"] @property def description(self) -> str: - """human-readable description of what this edge will be used for; optional, max 255 bytes.""" + """human-readable description of what this edge will be used for; optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this edge. Optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this edge. Optional, max 4096 bytes.""" return self._props["metadata"] @property def created_at(self) -> str: - """timestamp when the edge was created, RFC 3339 format""" + """timestamp when the edge was created, RFC 3339 format""" return self._props["created_at"] @property def uri(self) -> str: - """URI of the edge API resource""" + """URI of the edge API resource""" return self._props["uri"] @property def hostports(self) -> Sequence[str]: - """hostports served by this edge""" + """hostports served by this edge""" return self._props["hostports"] @property def backend(self) -> EndpointBackend: - """edge modules""" + """edge modules""" return self._props["backend"] @property @@ -2556,17 +3145,17 @@ @property def tls_edges(self) -> Sequence[TLSEdge]: - """the list of all TLS Edges on this account""" + """the list of all TLS Edges on this account""" return self._props["tls_edges"] @property def uri(self) -> str: - """URI of the TLS Edge list API resource""" + """URI of the TLS Edge list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -2634,37 +3223,37 @@ @property def id(self) -> str: - """unique identifier of this edge""" + """unique identifier of this edge""" return self._props["id"] @property def description(self) -> str: - """human-readable description of what this edge will be used for; optional, max 255 bytes.""" + """human-readable description of what this edge will be used for; optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this edge. Optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this edge. Optional, max 4096 bytes.""" return self._props["metadata"] @property def created_at(self) -> str: - """timestamp when the edge configuration was created, RFC 3339 format""" + """timestamp when the edge configuration was created, RFC 3339 format""" return self._props["created_at"] @property def uri(self) -> str: - """URI of the edge API resource""" + """URI of the edge API resource""" return self._props["uri"] @property def hostports(self) -> Sequence[str]: - """hostports served by this edge""" + """hostports served by this edge""" return self._props["hostports"] @property def backend(self) -> EndpointBackend: - """edge modules""" + """edge modules""" return self._props["backend"] @property @@ -2710,67 +3299,67 @@ @property def id(self) -> str: - """unique endpoint resource identifier""" + """unique endpoint resource identifier""" return self._props["id"] @property def region(self) -> str: - """identifier of the region this endpoint belongs to""" + """identifier of the region this endpoint belongs to""" return self._props["region"] @property def created_at(self) -> str: - """timestamp when the endpoint was created in RFC 3339 format""" + """timestamp when the endpoint was created in RFC 3339 format""" return self._props["created_at"] @property def updated_at(self) -> str: - """timestamp when the endpoint was updated in RFC 3339 format""" + """timestamp when the endpoint was updated in RFC 3339 format""" return self._props["updated_at"] @property def public_url(self) -> str: - """URL of the hostport served by this endpoint""" + """URL of the hostport served by this endpoint""" return self._props["public_url"] @property def proto(self) -> str: - """protocol served by this endpoint. one of ``http``, ``https``, ``tcp``, or ``tls``""" + """protocol served by this endpoint. one of ``http``, ``https``, ``tcp``, or ``tls``""" return self._props["proto"] @property def hostport(self) -> str: - """hostport served by this endpoint (hostname:port)""" + """hostport served by this endpoint (hostname:port)""" return self._props["hostport"] @property def type(self) -> str: - """whether the endpoint is ``ephemeral`` (served directly by an agent-initiated tunnel) or ``edge`` (served by an edge)""" + """whether the endpoint is ``ephemeral`` (served directly by an agent-initiated tunnel) or ``edge`` (served by an edge)""" return self._props["type"] @property def metadata(self) -> str: - """user-supplied metadata of the associated tunnel or edge object""" + """user-supplied metadata of the associated tunnel or edge object""" return self._props["metadata"] @property def domain(self) -> Ref: - """the domain reserved for this endpoint""" + """the domain reserved for this endpoint""" return self._props["domain"] @property def tcp_addr(self) -> Ref: - """the address reserved for this endpoint""" + """the address reserved for this endpoint""" return self._props["tcp_addr"] @property def tunnel(self) -> Ref: - """the tunnel serving requests to this endpoint, if this is an ephemeral endpoint""" + """the tunnel serving requests to this endpoint, if this is an ephemeral endpoint""" return self._props["tunnel"] @property def edge(self) -> Ref: - """the edge serving requests to this endpoint, if this is an edge endpoint""" + """the edge serving requests to this endpoint, if this is an edge endpoint""" return self._props["edge"] @@ -2798,17 +3387,17 @@ @property def endpoints(self) -> Sequence[Endpoint]: - """the list of all active endpoints on this account""" + """the list of all active endpoints on this account""" return self._props["endpoints"] @property def uri(self) -> str: - """URI of the endpoints list API resource""" + """URI of the endpoints list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -2840,37 +3429,37 @@ @property def id(self) -> str: - """Unique identifier for this Event Destination.""" + """Unique identifier for this Event Destination.""" return self._props["id"] @property def metadata(self) -> str: - """Arbitrary user-defined machine-readable data of this Event Destination. Optional, max 4096 bytes.""" + """Arbitrary user-defined machine-readable data of this Event Destination. Optional, max 4096 bytes.""" return self._props["metadata"] @property def created_at(self) -> str: - """Timestamp when the Event Destination was created, RFC 3339 format.""" + """Timestamp when the Event Destination was created, RFC 3339 format.""" return self._props["created_at"] @property def description(self) -> str: - """Human-readable description of the Event Destination. Optional, max 255 bytes.""" + """Human-readable description of the Event Destination. Optional, max 255 bytes.""" return self._props["description"] @property def format(self) -> str: - """The output format you would like to serialize events into when sending to their target. Currently the only accepted value is ``JSON``.""" + """The output format you would like to serialize events into when sending to their target. Currently the only accepted value is ``JSON``.""" return self._props["format"] @property def target(self) -> EventTarget: - """An object that encapsulates where and how to send your events. An event destination must contain exactly one of the following objects, leaving the rest null: ``kinesis``, ``firehose``, ``cloudwatch_logs``, or ``s3``.""" + """An object that encapsulates where and how to send your events. An event destination must contain exactly one of the following objects, leaving the rest null: ``kinesis``, ``firehose``, ``cloudwatch_logs``, or ``s3``.""" return self._props["target"] @property def uri(self) -> str: - """URI of the Event Destination API resource.""" + """URI of the Event Destination API resource.""" return self._props["uri"] @@ -2898,17 +3487,17 @@ @property def event_destinations(self) -> Sequence[EventDestination]: - """The list of all Event Destinations on this account.""" + """The list of all Event Destinations on this account.""" return self._props["event_destinations"] @property def uri(self) -> str: - """URI of the Event Destinations list API resource.""" + """URI of the Event Destinations list API resource.""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page.""" + """URI of the next page, or null if there is no next page.""" return self._props["next_page_uri"] @@ -2943,17 +3532,17 @@ @property def firehose(self) -> EventTargetFirehose: - """Configuration used to send events to Amazon Kinesis Data Firehose.""" + """Configuration used to send events to Amazon Kinesis Data Firehose.""" return self._props["firehose"] @property def kinesis(self) -> EventTargetKinesis: - """Configuration used to send events to Amazon Kinesis.""" + """Configuration used to send events to Amazon Kinesis.""" return self._props["kinesis"] @property def cloudwatch_logs(self) -> EventTargetCloudwatchLogs: - """Configuration used to send events to Amazon CloudWatch Logs.""" + """Configuration used to send events to Amazon CloudWatch Logs.""" return self._props["cloudwatch_logs"] @@ -2976,12 +3565,12 @@ @property def auth(self) -> AWSAuth: - """Configuration for how to authenticate into your AWS account. Exactly one of ``role`` or ``creds`` should be configured.""" + """Configuration for how to authenticate into your AWS account. Exactly one of ``role`` or ``creds`` should be configured.""" return self._props["auth"] @property def delivery_stream_arn(self) -> str: - """An Amazon Resource Name specifying the Firehose delivery stream to deposit events into.""" + """An Amazon Resource Name specifying the Firehose delivery stream to deposit events into.""" return self._props["delivery_stream_arn"] @@ -3004,12 +3593,12 @@ @property def auth(self) -> AWSAuth: - """Configuration for how to authenticate into your AWS account. Exactly one of ``role`` or ``creds`` should be configured.""" + """Configuration for how to authenticate into your AWS account. Exactly one of ``role`` or ``creds`` should be configured.""" return self._props["auth"] @property def stream_arn(self) -> str: - """An Amazon Resource Name specifying the Kinesis stream to deposit events into.""" + """An Amazon Resource Name specifying the Kinesis stream to deposit events into.""" return self._props["stream_arn"] @@ -3034,12 +3623,12 @@ @property def auth(self) -> AWSAuth: - """Configuration for how to authenticate into your AWS account. Exactly one of ``role`` or ``creds`` should be configured.""" + """Configuration for how to authenticate into your AWS account. Exactly one of ``role`` or ``creds`` should be configured.""" return self._props["auth"] @property def log_group_arn(self) -> str: - """An Amazon Resource Name specifying the CloudWatch Logs group to deposit events into.""" + """An Amazon Resource Name specifying the CloudWatch Logs group to deposit events into.""" return self._props["log_group_arn"] @@ -3067,12 +3656,12 @@ @property def role(self) -> AWSRole: - """A role for ngrok to assume on your behalf to deposit events into your AWS account.""" + """A role for ngrok to assume on your behalf to deposit events into your AWS account.""" return self._props["role"] @property def creds(self) -> AWSCredentials: - """Credentials to your AWS account if you prefer ngrok to sign in with long-term access keys.""" + """Credentials to your AWS account if you prefer ngrok to sign in with long-term access keys.""" return self._props["creds"] @@ -3092,7 +3681,7 @@ @property def role_arn(self) -> str: - """An ARN that specifies the role that ngrok should use to deliver to the configured target.""" + """An ARN that specifies the role that ngrok should use to deliver to the configured target.""" return self._props["role_arn"] @@ -3112,12 +3701,12 @@ @property def aws_access_key_id(self) -> str: - """The ID portion of an AWS access key.""" + """The ID portion of an AWS access key.""" return self._props["aws_access_key_id"] @property def aws_secret_access_key(self) -> str: - """The secret portion of an AWS access key.""" + """The secret portion of an AWS access key.""" return self._props["aws_secret_access_key"] @@ -3145,17 +3734,17 @@ @property def event_subscriptions(self) -> Sequence[EventSubscription]: - """The list of all Event Subscriptions on this account.""" + """The list of all Event Subscriptions on this account.""" return self._props["event_subscriptions"] @property def uri(self) -> str: - """URI of the Event Subscriptions list API resource.""" + """URI of the Event Subscriptions list API resource.""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of next page, or null if there is no next page.""" + """URI of next page, or null if there is no next page.""" return self._props["next_page_uri"] @@ -3192,37 +3781,37 @@ @property def id(self) -> str: - """Unique identifier for this Event Subscription.""" + """Unique identifier for this Event Subscription.""" return self._props["id"] @property def uri(self) -> str: - """URI of the Event Subscription API resource.""" + """URI of the Event Subscription API resource.""" return self._props["uri"] @property def created_at(self) -> str: - """When the Event Subscription was created (RFC 3339 format).""" + """When the Event Subscription was created (RFC 3339 format).""" return self._props["created_at"] @property def metadata(self) -> str: - """Arbitrary customer supplied information intended to be machine readable. Optional, max 4096 chars.""" + """Arbitrary customer supplied information intended to be machine readable. Optional, max 4096 chars.""" return self._props["metadata"] @property def description(self) -> str: - """Arbitrary customer supplied information intended to be human readable. Optional, max 255 chars.""" + """Arbitrary customer supplied information intended to be human readable. Optional, max 255 chars.""" return self._props["description"] @property def sources(self) -> Sequence[EventSource]: - """Sources containing the types for which this event subscription will trigger""" + """Sources containing the types for which this event subscription will trigger""" return self._props["sources"] @property def destinations(self) -> Sequence[Ref]: - """Destinations to which these events will be sent""" + """Destinations to which these events will be sent""" return self._props["destinations"] @@ -3242,7 +3831,7 @@ @property def type(self) -> str: - """Type of event for which an event subscription will trigger""" + """Type of event for which an event subscription will trigger""" return self._props["type"] @@ -3262,12 +3851,12 @@ @property def type(self) -> str: - """Type of event for which an event subscription will trigger""" + """Type of event for which an event subscription will trigger""" return self._props["type"] @property def uri(self) -> str: - """URI of the Event Source API resource.""" + """URI of the Event Source API resource.""" return self._props["uri"] @@ -3292,12 +3881,12 @@ @property def sources(self) -> Sequence[EventSource]: - """The list of all Event Sources for an Event Subscription""" + """The list of all Event Sources for an Event Subscription""" return self._props["sources"] @property def uri(self) -> str: - """URI of the next page, or null if there is no next page.""" + """URI of the next page, or null if there is no next page.""" return self._props["uri"] @@ -3335,27 +3924,27 @@ @property def id(self) -> str: - """unique identifier for this IP policy""" + """unique identifier for this IP policy""" return self._props["id"] @property def uri(self) -> str: - """URI of the IP Policy API resource""" + """URI of the IP Policy API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the IP policy was created, RFC 3339 format""" + """timestamp when the IP policy was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of the source IPs of this IP policy. optional, max 255 bytes.""" + """human-readable description of the source IPs of this IP policy. optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this IP policy. optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this IP policy. optional, max 4096 bytes.""" return self._props["metadata"] @@ -3383,17 +3972,17 @@ @property def ip_policies(self) -> Sequence[IPPolicy]: - """the list of all IP policies on this account""" + """the list of all IP policies on this account""" return self._props["ip_policies"] @property def uri(self) -> str: - """URI of the IP policy list API resource""" + """URI of the IP policy list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -3438,42 +4027,42 @@ @property def id(self) -> str: - """unique identifier for this IP policy rule""" + """unique identifier for this IP policy rule""" return self._props["id"] @property def uri(self) -> str: - """URI of the IP policy rule API resource""" + """URI of the IP policy rule API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the IP policy rule was created, RFC 3339 format""" + """timestamp when the IP policy rule was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of the source IPs of this IP rule. optional, max 255 bytes.""" + """human-readable description of the source IPs of this IP rule. optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this IP policy rule. optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this IP policy rule. optional, max 4096 bytes.""" return self._props["metadata"] @property def cidr(self) -> str: - """an IP or IP range specified in CIDR notation. IPv4 and IPv6 are both supported.""" + """an IP or IP range specified in CIDR notation. IPv4 and IPv6 are both supported.""" return self._props["cidr"] @property def ip_policy(self) -> Ref: - """object describing the IP policy this IP Policy Rule belongs to""" + """object describing the IP policy this IP Policy Rule belongs to""" return self._props["ip_policy"] @property def action(self) -> str: - """the action to apply to the policy rule, either ``allow`` or ``deny``""" + """the action to apply to the policy rule, either ``allow`` or ``deny``""" return self._props["action"] @@ -3501,17 +4090,17 @@ @property def ip_policy_rules(self) -> Sequence[IPPolicyRule]: - """the list of all IP policy rules on this account""" + """the list of all IP policy rules on this account""" return self._props["ip_policy_rules"] @property def uri(self) -> str: - """URI of the IP policy rule list API resource""" + """URI of the IP policy rule list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -3543,42 +4132,42 @@ @property def id(self) -> str: - """unique identifier for this IP restriction""" + """unique identifier for this IP restriction""" return self._props["id"] @property def uri(self) -> str: - """URI of the IP restriction API resource""" + """URI of the IP restriction API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the IP restriction was created, RFC 3339 format""" + """timestamp when the IP restriction was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of this IP restriction. optional, max 255 bytes.""" + """human-readable description of this IP restriction. optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this IP restriction. optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this IP restriction. optional, max 4096 bytes.""" return self._props["metadata"] @property def enforced(self) -> bool: - """true if the IP restriction will be enforced. if false, only warnings will be issued""" + """true if the IP restriction will be enforced. if false, only warnings will be issued""" return self._props["enforced"] @property def type(self) -> str: - """the type of IP restriction. this defines what traffic will be restricted with the attached policies. four values are currently supported: ``dashboard``, ``api``, ``agent``, and ``endpoints``""" + """the type of IP restriction. this defines what traffic will be restricted with the attached policies. four values are currently supported: ``dashboard``, ``api``, ``agent``, and ``endpoints``""" return self._props["type"] @property def ip_policies(self) -> Sequence[Ref]: - """the set of IP policies that are used to enforce the restriction""" + """the set of IP policies that are used to enforce the restriction""" return self._props["ip_policies"] @@ -3606,17 +4195,17 @@ @property def ip_restrictions(self) -> Sequence[IPRestriction]: - """the list of all IP restrictions on this account""" + """the list of all IP restrictions on this account""" return self._props["ip_restrictions"] @property def uri(self) -> str: - """URI of the IP restrictions list API resource""" + """URI of the IP restrictions list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -3643,37 +4232,37 @@ @property def id(self) -> str: - """unique reserved address resource identifier""" + """unique reserved address resource identifier""" return self._props["id"] @property def uri(self) -> str: - """URI of the reserved address API resource""" + """URI of the reserved address API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the reserved address was created, RFC 3339 format""" + """timestamp when the reserved address was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of what this reserved address will be used for""" + """human-readable description of what this reserved address will be used for""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this reserved address. Optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this reserved address. Optional, max 4096 bytes.""" return self._props["metadata"] @property def addr(self) -> str: - """hostname:port of the reserved address that was assigned at creation time""" + """hostname:port of the reserved address that was assigned at creation time""" return self._props["addr"] @property def region(self) -> str: - """reserve the address in this geographic ngrok datacenter. Optional, default is us. (au, eu, ap, us, jp, in, sa)""" + """reserve the address in this geographic ngrok datacenter. Optional, default is us. (au, eu, ap, us, jp, in, sa)""" return self._props["region"] @@ -3701,17 +4290,17 @@ @property def reserved_addrs(self) -> Sequence[ReservedAddr]: - """the list of all reserved addresses on this account""" + """the list of all reserved addresses on this account""" return self._props["reserved_addrs"] @property def uri(self) -> str: - """URI of the reserved address list API resource""" + """URI of the reserved address list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -3753,62 +4342,62 @@ @property def id(self) -> str: - """unique reserved domain resource identifier""" + """unique reserved domain resource identifier""" return self._props["id"] @property def uri(self) -> str: - """URI of the reserved domain API resource""" + """URI of the reserved domain API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the reserved domain was created, RFC 3339 format""" + """timestamp when the reserved domain was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of what this reserved domain will be used for""" + """human-readable description of what this reserved domain will be used for""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this reserved domain. Optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this reserved domain. Optional, max 4096 bytes.""" return self._props["metadata"] @property def domain(self) -> str: - """hostname of the reserved domain""" + """hostname of the reserved domain""" return self._props["domain"] @property def region(self) -> str: - """reserve the domain in this geographic ngrok datacenter. Optional, default is us. (au, eu, ap, us, jp, in, sa)""" + """reserve the domain in this geographic ngrok datacenter. Optional, default is us. (au, eu, ap, us, jp, in, sa)""" return self._props["region"] @property def cname_target(self) -> str: - """DNS CNAME target for a custom hostname, or null if the reserved domain is a subdomain of *.ngrok.io""" + """DNS CNAME target for a custom hostname, or null if the reserved domain is a subdomain of *.ngrok.io""" return self._props["cname_target"] @property def certificate(self) -> Ref: - """object referencing the TLS certificate used for connections to this domain. This can be either a user-uploaded certificate, the most recently issued automatic one, or null otherwise.""" + """object referencing the TLS certificate used for connections to this domain. This can be either a user-uploaded certificate, the most recently issued automatic one, or null otherwise.""" return self._props["certificate"] @property def certificate_management_policy(self) -> ReservedDomainCertPolicy: - """configuration for automatic management of TLS certificates for this domain, or null if automatic management is disabled""" + """configuration for automatic management of TLS certificates for this domain, or null if automatic management is disabled""" return self._props["certificate_management_policy"] @property def certificate_management_status(self) -> ReservedDomainCertStatus: - """status of the automatic certificate management for this domain, or null if automatic management is disabled""" + """status of the automatic certificate management for this domain, or null if automatic management is disabled""" return self._props["certificate_management_status"] @property def acme_challenge_cname_target(self) -> str: - """DNS CNAME target for the host _acme-challenge.example.com, where example.com is your reserved domain name. This is required to issue certificates for wildcard, non-ngrok reserved domains. Must be null for non-wildcard domains and ngrok subdomains.""" + """DNS CNAME target for the host _acme-challenge.example.com, where example.com is your reserved domain name. This is required to issue certificates for wildcard, non-ngrok reserved domains. Must be null for non-wildcard domains and ngrok subdomains.""" return self._props["acme_challenge_cname_target"] @@ -3836,17 +4425,17 @@ @property def reserved_domains(self) -> Sequence[ReservedDomain]: - """the list of all reserved domains on this account""" + """the list of all reserved domains on this account""" return self._props["reserved_domains"] @property def uri(self) -> str: - """URI of the reserved domain list API resource""" + """URI of the reserved domain list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -3866,12 +4455,12 @@ @property def authority(self) -> str: - """certificate authority to request certificates from. The only supported value is letsencrypt.""" + """certificate authority to request certificates from. The only supported value is letsencrypt.""" return self._props["authority"] @property def private_key_type(self) -> str: - """type of private key to use when requesting certificates. Defaults to rsa, can be either rsa or ecdsa.""" + """type of private key to use when requesting certificates. Defaults to rsa, can be either rsa or ecdsa.""" return self._props["private_key_type"] @@ -3896,12 +4485,12 @@ @property def renews_at(self) -> str: - """timestamp when the next renewal will be requested, RFC 3339 format""" + """timestamp when the next renewal will be requested, RFC 3339 format""" return self._props["renews_at"] @property def provisioning_job(self) -> ReservedDomainCertJob: - """status of the certificate provisioning job, or null if the certificiate isn't being provisioned or renewed""" + """status of the certificate provisioning job, or null if the certificiate isn't being provisioned or renewed""" return self._props["provisioning_job"] @@ -3921,22 +4510,22 @@ @property def error_code(self) -> str: - """if present, an error code indicating why provisioning is failing. It may be either a temporary condition (INTERNAL_ERROR), or a permanent one the user must correct (DNS_ERROR).""" + """if present, an error code indicating why provisioning is failing. It may be either a temporary condition (INTERNAL_ERROR), or a permanent one the user must correct (DNS_ERROR).""" return self._props["error_code"] @property def msg(self) -> str: - """a message describing the current status or error""" + """a message describing the current status or error""" return self._props["msg"] @property def started_at(self) -> str: - """timestamp when the provisioning job started, RFC 3339 format""" + """timestamp when the provisioning job started, RFC 3339 format""" return self._props["started_at"] @property def retries_at(self) -> str: - """timestamp when the provisioning job will be retried""" + """timestamp when the provisioning job will be retried""" return self._props["retries_at"] @@ -3974,37 +4563,37 @@ @property def id(self) -> str: - """unique identifier for this SSH Certificate Authority""" + """unique identifier for this SSH Certificate Authority""" return self._props["id"] @property def uri(self) -> str: - """URI of the SSH Certificate Authority API resource""" + """URI of the SSH Certificate Authority API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the SSH Certificate Authority API resource was created, RFC 3339 format""" + """timestamp when the SSH Certificate Authority API resource was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of this SSH Certificate Authority. optional, max 255 bytes.""" + """human-readable description of this SSH Certificate Authority. optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this SSH Certificate Authority. optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this SSH Certificate Authority. optional, max 4096 bytes.""" return self._props["metadata"] @property def public_key(self) -> str: - """raw public key for this SSH Certificate Authority""" + """raw public key for this SSH Certificate Authority""" return self._props["public_key"] @property def key_type(self) -> str: - """the type of private key for this SSH Certificate Authority""" + """the type of private key for this SSH Certificate Authority""" return self._props["key_type"] @@ -4037,17 +4626,17 @@ @property def ssh_certificate_authorities(self) -> Sequence[SSHCertificateAuthority]: - """the list of all certificate authorities on this account""" + """the list of all certificate authorities on this account""" return self._props["ssh_certificate_authorities"] @property def uri(self) -> str: - """URI of the certificates authorities list API resource""" + """URI of the certificates authorities list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -4087,38 +4676,43 @@ @property def id(self) -> str: - """unique ssh credential resource identifier""" + """unique ssh credential resource identifier""" return self._props["id"] @property def uri(self) -> str: - """URI of the ssh credential API resource""" + """URI of the ssh credential API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the ssh credential was created, RFC 3339 format""" + """timestamp when the ssh credential was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of who or what will use the ssh credential to authenticate. Optional, max 255 bytes.""" + """human-readable description of who or what will use the ssh credential to authenticate. Optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this ssh credential. Optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this ssh credential. Optional, max 4096 bytes.""" return self._props["metadata"] @property def public_key(self) -> str: - """the PEM-encoded public key of the SSH keypair that will be used to authenticate""" + """the PEM-encoded public key of the SSH keypair that will be used to authenticate""" return self._props["public_key"] @property def acl(self) -> Sequence[str]: - """optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions.""" - return self._props["acl"] + """optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of ``bind:*=example`` which will allow ``x=example``, ``y=example``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions.""" + return self._props["acl"] + + @property + def owner_id(self) -> str: + """If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot.""" + return self._props["owner_id"]
    [docs]class SSHCredentialList(object): @@ -4145,17 +4739,17 @@ @property def ssh_credentials(self) -> Sequence[SSHCredential]: - """the list of all ssh credentials on this account""" + """the list of all ssh credentials on this account""" return self._props["ssh_credentials"] @property def uri(self) -> str: - """URI of the ssh credential list API resource""" + """URI of the ssh credential list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"]
    @@ -4193,62 +4787,62 @@ @property def id(self) -> str: - """unique identifier for this SSH Host Certificate""" + """unique identifier for this SSH Host Certificate""" return self._props["id"] @property def uri(self) -> str: - """URI of the SSH Host Certificate API resource""" + """URI of the SSH Host Certificate API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the SSH Host Certificate API resource was created, RFC 3339 format""" + """timestamp when the SSH Host Certificate API resource was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of this SSH Host Certificate. optional, max 255 bytes.""" + """human-readable description of this SSH Host Certificate. optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this SSH Host Certificate. optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this SSH Host Certificate. optional, max 4096 bytes.""" return self._props["metadata"] @property def public_key(self) -> str: - """a public key in OpenSSH Authorized Keys format that this certificate signs""" + """a public key in OpenSSH Authorized Keys format that this certificate signs""" return self._props["public_key"] @property def key_type(self) -> str: - """the key type of the ``public_key``, one of ``rsa``, ``ecdsa`` or ``ed25519``""" + """the key type of the ``public_key``, one of ``rsa``, ``ecdsa`` or ``ed25519``""" return self._props["key_type"] @property def ssh_certificate_authority_id(self) -> str: - """the ssh certificate authority that is used to sign this ssh host certificate""" + """the ssh certificate authority that is used to sign this ssh host certificate""" return self._props["ssh_certificate_authority_id"] @property def principals(self) -> Sequence[str]: - """the list of principals included in the ssh host certificate. This is the list of hostnames and/or IP addresses that are authorized to serve SSH traffic with this certificate. Dangerously, if no principals are specified, this certificate is considered valid for all hosts.""" + """the list of principals included in the ssh host certificate. This is the list of hostnames and/or IP addresses that are authorized to serve SSH traffic with this certificate. Dangerously, if no principals are specified, this certificate is considered valid for all hosts.""" return self._props["principals"] @property def valid_after(self) -> str: - """the time when the ssh host certificate becomes valid, in RFC 3339 format.""" + """the time when the ssh host certificate becomes valid, in RFC 3339 format.""" return self._props["valid_after"] @property def valid_until(self) -> str: - """the time after which the ssh host certificate becomes invalid, in RFC 3339 format. the OpenSSH certificates RFC calls this ``valid_before``.""" + """the time after which the ssh host certificate becomes invalid, in RFC 3339 format. the OpenSSH certificates RFC calls this ``valid_before``.""" return self._props["valid_until"] @property def certificate(self) -> str: - """the signed SSH certificate in OpenSSH Authorized Keys format. this value should be placed in a ``-cert.pub`` certificate file on disk that should be referenced in your ``sshd_config`` configuration file with a ``HostCertificate`` directive""" + """the signed SSH certificate in OpenSSH Authorized Keys format. this value should be placed in a ``-cert.pub`` certificate file on disk that should be referenced in your ``sshd_config`` configuration file with a ``HostCertificate`` directive""" return self._props["certificate"] @@ -4276,17 +4870,17 @@ @property def ssh_host_certificates(self) -> Sequence[SSHHostCertificate]: - """the list of all ssh host certificates on this account""" + """the list of all ssh host certificates on this account""" return self._props["ssh_host_certificates"] @property def uri(self) -> str: - """URI of the ssh host certificates list API resource""" + """URI of the ssh host certificates list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -4324,72 +4918,72 @@ @property def id(self) -> str: - """unique identifier for this SSH User Certificate""" + """unique identifier for this SSH User Certificate""" return self._props["id"] @property def uri(self) -> str: - """URI of the SSH User Certificate API resource""" + """URI of the SSH User Certificate API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the SSH User Certificate API resource was created, RFC 3339 format""" + """timestamp when the SSH User Certificate API resource was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of this SSH User Certificate. optional, max 255 bytes.""" + """human-readable description of this SSH User Certificate. optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this SSH User Certificate. optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this SSH User Certificate. optional, max 4096 bytes.""" return self._props["metadata"] @property def public_key(self) -> str: - """a public key in OpenSSH Authorized Keys format that this certificate signs""" + """a public key in OpenSSH Authorized Keys format that this certificate signs""" return self._props["public_key"] @property def key_type(self) -> str: - """the key type of the ``public_key``, one of ``rsa``, ``ecdsa`` or ``ed25519``""" + """the key type of the ``public_key``, one of ``rsa``, ``ecdsa`` or ``ed25519``""" return self._props["key_type"] @property def ssh_certificate_authority_id(self) -> str: - """the ssh certificate authority that is used to sign this ssh user certificate""" + """the ssh certificate authority that is used to sign this ssh user certificate""" return self._props["ssh_certificate_authority_id"] @property def principals(self) -> Sequence[str]: - """the list of principals included in the ssh user certificate. This is the list of usernames that the certificate holder may sign in as on a machine authorizing the signing certificate authority. Dangerously, if no principals are specified, this certificate may be used to log in as any user.""" + """the list of principals included in the ssh user certificate. This is the list of usernames that the certificate holder may sign in as on a machine authorizing the signing certificate authority. Dangerously, if no principals are specified, this certificate may be used to log in as any user.""" return self._props["principals"] @property def critical_options(self) -> Mapping[str, str]: - """A map of critical options included in the certificate. Only two critical options are currently defined by OpenSSH: ``force-command`` and ``source-address``. See `the OpenSSH certificate protocol spec` <https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.certkeys>`_ for additional details.""" + """A map of critical options included in the certificate. Only two critical options are currently defined by OpenSSH: ``force-command`` and ``source-address``. See `the OpenSSH certificate protocol spec <https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.certkeys>`_ for additional details.""" return self._props["critical_options"] @property def extensions(self) -> Mapping[str, str]: - """A map of extensions included in the certificate. Extensions are additional metadata that can be interpreted by the SSH server for any purpose. These can be used to permit or deny the ability to open a terminal, do port forwarding, x11 forwarding, and more. If unspecified, the certificate will include limited permissions with the following extension map: ``{"permit-pty": "", "permit-user-rc": ""}`` OpenSSH understands a number of predefined extensions. See `the OpenSSH certificate protocol spec` <https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.certkeys>`_ for additional details.""" + """A map of extensions included in the certificate. Extensions are additional metadata that can be interpreted by the SSH server for any purpose. These can be used to permit or deny the ability to open a terminal, do port forwarding, x11 forwarding, and more. If unspecified, the certificate will include limited permissions with the following extension map: ``{"permit-pty": "", "permit-user-rc": ""}`` OpenSSH understands a number of predefined extensions. See `the OpenSSH certificate protocol spec <https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.certkeys>`_ for additional details.""" return self._props["extensions"] @property def valid_after(self) -> str: - """the time when the ssh host certificate becomes valid, in RFC 3339 format.""" + """the time when the ssh host certificate becomes valid, in RFC 3339 format.""" return self._props["valid_after"] @property def valid_until(self) -> str: - """the time after which the ssh host certificate becomes invalid, in RFC 3339 format. the OpenSSH certificates RFC calls this ``valid_before``.""" + """the time after which the ssh host certificate becomes invalid, in RFC 3339 format. the OpenSSH certificates RFC calls this ``valid_before``.""" return self._props["valid_until"] @property def certificate(self) -> str: - """the signed SSH certificate in OpenSSH Authorized Keys Format. this value should be placed in a ``-cert.pub`` certificate file on disk that should be referenced in your ``sshd_config`` configuration file with a ``HostCertificate`` directive""" + """the signed SSH certificate in OpenSSH Authorized Keys Format. this value should be placed in a ``-cert.pub`` certificate file on disk that should be referenced in your ``sshd_config`` configuration file with a ``HostCertificate`` directive""" return self._props["certificate"] @@ -4417,17 +5011,17 @@ @property def ssh_user_certificates(self) -> Sequence[SSHUserCertificate]: - """the list of all ssh user certificates on this account""" + """the list of all ssh user certificates on this account""" return self._props["ssh_user_certificates"] @property def uri(self) -> str: - """URI of the ssh user certificates list API resource""" + """URI of the ssh user certificates list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -4470,107 +5064,107 @@ @property def id(self) -> str: - """unique identifier for this TLS certificate""" + """unique identifier for this TLS certificate""" return self._props["id"] @property def uri(self) -> str: - """URI of the TLS certificate API resource""" + """URI of the TLS certificate API resource""" return self._props["uri"] @property def created_at(self) -> str: - """timestamp when the TLS certificate was created, RFC 3339 format""" + """timestamp when the TLS certificate was created, RFC 3339 format""" return self._props["created_at"] @property def description(self) -> str: - """human-readable description of this TLS certificate. optional, max 255 bytes.""" + """human-readable description of this TLS certificate. optional, max 255 bytes.""" return self._props["description"] @property def metadata(self) -> str: - """arbitrary user-defined machine-readable data of this TLS certificate. optional, max 4096 bytes.""" + """arbitrary user-defined machine-readable data of this TLS certificate. optional, max 4096 bytes.""" return self._props["metadata"] @property def certificate_pem(self) -> str: - """chain of PEM-encoded certificates, leaf first. See `Certificate Bundles` <https://ngrok.com/docs/api#tls-certificates-pem>`_.""" + """chain of PEM-encoded certificates, leaf first. See `Certificate Bundles <https://ngrok.com/docs/api#tls-certificates-pem>`_.""" return self._props["certificate_pem"] @property def subject_common_name(self) -> str: - """subject common name from the leaf of this TLS certificate""" + """subject common name from the leaf of this TLS certificate""" return self._props["subject_common_name"] @property def subject_alternative_names(self) -> TLSCertificateSANs: - """subject alternative names (SANs) from the leaf of this TLS certificate""" + """subject alternative names (SANs) from the leaf of this TLS certificate""" return self._props["subject_alternative_names"] @property def issued_at(self) -> str: - """timestamp (in RFC 3339 format) when this TLS certificate was issued automatically, or null if this certificate was user-uploaded""" + """timestamp (in RFC 3339 format) when this TLS certificate was issued automatically, or null if this certificate was user-uploaded""" return self._props["issued_at"] @property def not_before(self) -> str: - """timestamp when this TLS certificate becomes valid, RFC 3339 format""" + """timestamp when this TLS certificate becomes valid, RFC 3339 format""" return self._props["not_before"] @property def not_after(self) -> str: - """timestamp when this TLS certificate becomes invalid, RFC 3339 format""" + """timestamp when this TLS certificate becomes invalid, RFC 3339 format""" return self._props["not_after"] @property def key_usages(self) -> Sequence[str]: - """set of actions the private key of this TLS certificate can be used for""" + """set of actions the private key of this TLS certificate can be used for""" return self._props["key_usages"] @property def extended_key_usages(self) -> Sequence[str]: - """extended set of actions the private key of this TLS certificate can be used for""" + """extended set of actions the private key of this TLS certificate can be used for""" return self._props["extended_key_usages"] @property def private_key_type(self) -> str: - """type of the private key of this TLS certificate. One of rsa, ecdsa, or ed25519.""" + """type of the private key of this TLS certificate. One of rsa, ecdsa, or ed25519.""" return self._props["private_key_type"] @property def issuer_common_name(self) -> str: - """issuer common name from the leaf of this TLS certificate""" + """issuer common name from the leaf of this TLS certificate""" return self._props["issuer_common_name"] @property def serial_number(self) -> str: - """serial number of the leaf of this TLS certificate""" + """serial number of the leaf of this TLS certificate""" return self._props["serial_number"] @property def subject_organization(self) -> str: - """subject organization from the leaf of this TLS certificate""" + """subject organization from the leaf of this TLS certificate""" return self._props["subject_organization"] @property def subject_organizational_unit(self) -> str: - """subject organizational unit from the leaf of this TLS certificate""" + """subject organizational unit from the leaf of this TLS certificate""" return self._props["subject_organizational_unit"] @property def subject_locality(self) -> str: - """subject locality from the leaf of this TLS certificate""" + """subject locality from the leaf of this TLS certificate""" return self._props["subject_locality"] @property def subject_province(self) -> str: - """subject province from the leaf of this TLS certificate""" + """subject province from the leaf of this TLS certificate""" return self._props["subject_province"] @property def subject_country(self) -> str: - """subject country from the leaf of this TLS certificate""" + """subject country from the leaf of this TLS certificate""" return self._props["subject_country"] @@ -4598,17 +5192,17 @@ @property def tls_certificates(self) -> Sequence[TLSCertificate]: - """the list of all TLS certificates on this account""" + """the list of all TLS certificates on this account""" return self._props["tls_certificates"] @property def uri(self) -> str: - """URI of the TLS certificates list API resource""" + """URI of the TLS certificates list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -4628,12 +5222,12 @@ @property def dns_names(self) -> Sequence[str]: - """set of additional domains (including wildcards) this TLS certificate is valid for""" + """set of additional domains (including wildcards) this TLS certificate is valid for""" return self._props["dns_names"] @property def ips(self) -> Sequence[str]: - """set of IP addresses this TLS certificate is also valid for""" + """set of IP addresses this TLS certificate is also valid for""" return self._props["ips"] @@ -4658,52 +5252,52 @@ @property def agent_version(self) -> str: - """version of the ngrok agent that started this ngrok tunnel session""" + """version of the ngrok agent that started this ngrok tunnel session""" return self._props["agent_version"] @property def credential(self) -> Ref: - """reference to the tunnel credential or ssh credential used by the ngrok agent to start this tunnel session""" + """reference to the tunnel credential or ssh credential used by the ngrok agent to start this tunnel session""" return self._props["credential"] @property def id(self) -> str: - """unique tunnel session resource identifier""" + """unique tunnel session resource identifier""" return self._props["id"] @property def ip(self) -> str: - """source ip address of the tunnel session""" + """source ip address of the tunnel session""" return self._props["ip"] @property def metadata(self) -> str: - """arbitrary user-defined data specified in the metadata property in the ngrok configuration file. See the metadata configuration option""" + """arbitrary user-defined data specified in the metadata property in the ngrok configuration file. See the metadata configuration option""" return self._props["metadata"] @property def os(self) -> str: - """operating system of the host the ngrok agent is running on""" + """operating system of the host the ngrok agent is running on""" return self._props["os"] @property def region(self) -> str: - """the ngrok region identifier in which this tunnel session was started""" + """the ngrok region identifier in which this tunnel session was started""" return self._props["region"] @property def started_at(self) -> str: - """time when the tunnel session first connected to the ngrok servers""" + """time when the tunnel session first connected to the ngrok servers""" return self._props["started_at"] @property def transport(self) -> str: - """the transport protocol used to start the tunnel session. Either ``ngrok/v2`` or ``ssh``""" + """the transport protocol used to start the tunnel session. Either ``ngrok/v2`` or ``ssh``""" return self._props["transport"] @property def uri(self) -> str: - """URI to the API resource of the tunnel session""" + """URI to the API resource of the tunnel session""" return self._props["uri"] @@ -4731,17 +5325,17 @@ @property def tunnel_sessions(self) -> Sequence[TunnelSession]: - """list of all tunnel sessions on this account""" + """list of all tunnel sessions on this account""" return self._props["tunnel_sessions"] @property def uri(self) -> str: - """URI to the API resource of the tunnel session list""" + """URI to the API resource of the tunnel session list""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] @@ -4776,57 +5370,57 @@ @property def id(self) -> str: - """unique tunnel resource identifier""" + """unique tunnel resource identifier""" return self._props["id"] @property def public_url(self) -> str: - """URL of the ephemeral tunnel's public endpoint""" + """URL of the ephemeral tunnel's public endpoint""" return self._props["public_url"] @property def started_at(self) -> str: - """timestamp when the tunnel was initiated in RFC 3339 format""" + """timestamp when the tunnel was initiated in RFC 3339 format""" return self._props["started_at"] @property def metadata(self) -> str: - """user-supplied metadata for the tunnel defined in the ngrok configuration file. See the tunnel `metadata configuration option` <https://ngrok.com/docs#tunnel-definitions-metadata>`_ In API version 0, this value was instead pulled from the top-level `metadata configuration option` <https://ngrok.com/docs#config_metadata>`_.""" + """user-supplied metadata for the tunnel defined in the ngrok configuration file. See the tunnel `metadata configuration option <https://ngrok.com/docs#tunnel-definitions-metadata>`_ In API version 0, this value was instead pulled from the top-level `metadata configuration option <https://ngrok.com/docs#config_metadata>`_.""" return self._props["metadata"] @property def proto(self) -> str: - """tunnel protocol for ephemeral tunnels. one of ``http``, ``https``, ``tcp`` or ``tls``""" + """tunnel protocol for ephemeral tunnels. one of ``http``, ``https``, ``tcp`` or ``tls``""" return self._props["proto"] @property def region(self) -> str: - """identifier of tune region where the tunnel is running""" + """identifier of tune region where the tunnel is running""" return self._props["region"] @property def tunnel_session(self) -> Ref: - """reference object pointing to the tunnel session on which this tunnel was started""" + """reference object pointing to the tunnel session on which this tunnel was started""" return self._props["tunnel_session"] @property def endpoint(self) -> Ref: - """the ephemeral endpoint this tunnel is associated with, if this is an agent-initiated tunnel""" + """the ephemeral endpoint this tunnel is associated with, if this is an agent-initiated tunnel""" return self._props["endpoint"] @property def labels(self) -> Mapping[str, str]: - """the labels the tunnel group backends will match against, if this is a backend tunnel""" + """the labels the tunnel group backends will match against, if this is a backend tunnel""" return self._props["labels"] @property def backends(self) -> Sequence[Ref]: - """tunnel group backends served by this backend tunnel""" + """tunnel group backends served by this backend tunnel""" return self._props["backends"] @property def forwards_to(self) -> str: - """upstream address the ngrok agent forwards traffic over this tunnel to. this may be expressed as a URL or a network address.""" + """upstream address the ngrok agent forwards traffic over this tunnel to. this may be expressed as a URL or a network address.""" return self._props["forwards_to"] @@ -4854,17 +5448,17 @@ @property def tunnels(self) -> Sequence[Tunnel]: - """the list of all online tunnels on this account""" + """the list of all online tunnels on this account""" return self._props["tunnels"] @property def uri(self) -> str: - """URI of the tunnels list API resource""" + """URI of the tunnels list API resource""" return self._props["uri"] @property def next_page_uri(self) -> str: - """URI of the next page, or null if there is no next page""" + """URI of the next page, or null if there is no next page""" return self._props["next_page_uri"] diff --git a/docs/_modules/ngrok/error.html b/docs/_modules/ngrok/error.html index 0049b99..2d050ee 100644 --- a/docs/_modules/ngrok/error.html +++ b/docs/_modules/ngrok/error.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • @@ -182,7 +184,7 @@
    [docs]class Error(Exception): - """Raised by failed ngrok API operations. + """Raised by failed ngrok API operations. This class encapsulates details about the error to make it simple for callers to introspect the error and take action on it. @@ -207,7 +209,7 @@ @property def operation_id(self): - """ + """ OperationID returns the unique trace ID assigned by ngrok to this API request. """ @@ -215,7 +217,7 @@
    [docs]class NotFoundError(Error): - """Raised if the http_status_code of an API operation is 404. + """Raised if the http_status_code of an API operation is 404. This is a separate class to make this common condition easier to handle. """ diff --git a/docs/_modules/ngrok/services.html b/docs/_modules/ngrok/services.html index 2afa1a8..0f1bf56 100644 --- a/docs/_modules/ngrok/services.html +++ b/docs/_modules/ngrok/services.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • @@ -181,6 +183,7 @@ from __future__ import annotations from collections.abc import Iterator from typing import Any, Mapping, Sequence +from datetime import datetime, timedelta from .http_client import HTTPClient from .datatypes import * @@ -188,7 +191,7 @@
    [docs]class AbuseReportsClient(object): - """Abuse Reports allow you to submit take-down requests for URLs hosted by + """Abuse Reports allow you to submit take-down requests for URLs hosted by ngrok that violate ngrok's terms of service.""" def __init__(self, client): @@ -199,7 +202,7 @@ urls: Sequence[str], metadata: str = "", ) -> AbuseReport: - """Creates a new abuse report which will be reviewed by our system and abuse response team. This API is only available to authorized accounts. Contact abuse@ngrok.com to request access + """Creates a new abuse report which will be reviewed by our system and abuse response team. This API is only available to authorized accounts. Contact abuse@ngrok.com to request access :param urls: a list of URLs containing suspected abusive content :param metadata: arbitrary user-defined data about this abuse report. Optional, max 4096 bytes. @@ -218,7 +221,7 @@ self, id: str, ) -> AbuseReport: - """Get the detailed status of abuse report by ID. + """Get the detailed status of abuse report by ID. :param id: a resource identifier @@ -243,7 +246,7 @@ description: str = "", metadata: str = "", ) -> AgentIngress: - """Create a new Agent Ingress. The ngrok agent can be configured to connect to ngrok via the new set of addresses on the returned Agent Ingress. + """Create a new Agent Ingress. The ngrok agent can be configured to connect to ngrok via the new set of addresses on the returned Agent Ingress. :param description: human-readable description of the use of this Agent Ingress. optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this Agent Ingress. optional, max 4096 bytes @@ -264,7 +267,7 @@ self, id: str, ): - """Delete an Agent Ingress by ID + """Delete an Agent Ingress by ID :param id: a resource identifier @@ -281,7 +284,7 @@ self, id: str, ) -> AgentIngress: - """Get the details of an Agent Ingress by ID. + """Get the details of an Agent Ingress by ID. :param id: a resource identifier @@ -300,7 +303,7 @@ before_id: str = None, limit: str = None, ) -> AgentIngressList: - """List all Agent Ingresses owned by this account + """List all Agent Ingresses owned by this account :param before_id: :param limit: @@ -321,7 +324,7 @@ description: str = None, metadata: str = None, ) -> AgentIngress: - """Update attributes of an Agent Ingress by ID. + """Update attributes of an Agent Ingress by ID. :param id: :param description: human-readable description of the use of this Agent Ingress. optional, max 255 bytes. @@ -342,10 +345,10 @@
    [docs]class APIKeysClient(object): - """API Keys are used to authenticate to the `ngrok - API` <https://ngrok.com/docs/api#authentication>`_. You may use the API itself + """API Keys are used to authenticate to the `ngrok + API <https://ngrok.com/docs/api#authentication>`_. You may use the API itself to provision and manage API Keys but you'll need to provision your first API - key from the `API Keys page` <https://dashboard.ngrok.com/api/keys>`_ on your + key from the `API Keys page <https://dashboard.ngrok.com/api/keys>`_ on your ngrok.com dashboard.""" def __init__(self, client): @@ -355,11 +358,13 @@ self, description: str = "", metadata: str = "", + owner_id: str = None, ) -> APIKey: - """Create a new API key. The generated API key can be used to authenticate to the ngrok API. + """Create a new API key. The generated API key can be used to authenticate to the ngrok API. :param description: human-readable description of what uses the API key to authenticate. optional, max 255 bytes. :param metadata: arbitrary user-defined data of this API key. optional, max 4096 bytes + :param owner_id: If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot. https://ngrok.com/docs/api#api-api-keys-create """ @@ -367,6 +372,7 @@ body_arg = dict( description=description, metadata=metadata, + owner_id=owner_id, ) result = self._client.http_client.post(path, body_arg) return APIKey(self._client, result)
    @@ -375,7 +381,7 @@ self, id: str, ): - """Delete an API key by ID + """Delete an API key by ID :param id: a resource identifier @@ -392,7 +398,7 @@ self, id: str, ) -> APIKey: - """Get the details of an API key by ID. + """Get the details of an API key by ID. :param id: a resource identifier @@ -411,7 +417,7 @@ before_id: str = None, limit: str = None, ) -> APIKeyList: - """List all API keys owned by this account + """List all API keys owned by this account :param before_id: :param limit: @@ -432,7 +438,7 @@ description: str = None, metadata: str = None, ) -> APIKey: - """Update attributes of an API key by ID. + """Update attributes of an API key by ID. :param id: :param description: human-readable description of what uses the API key to authenticate. optional, max 255 bytes. @@ -452,8 +458,128 @@ return APIKey(self._client, result)
    +
    [docs]class ApplicationSessionsClient(object): + def __init__(self, client): + self._client = client + +
    [docs] def get( + self, + id: str, + ) -> ApplicationSession: + """Get an application session by ID. + + :param id: a resource identifier + + https://ngrok.com/docs/api#api-application-sessions-get + """ + path = "/app/sessions/{id}" + path = path.format( + id=id, + ) + body_arg = None + result = self._client.http_client.get(path, body_arg) + return ApplicationSession(self._client, result)
    + +
    [docs] def delete( + self, + id: str, + ): + """Delete an application session by ID. + + :param id: a resource identifier + + https://ngrok.com/docs/api#api-application-sessions-delete + """ + path = "/app/sessions/{id}" + path = path.format( + id=id, + ) + body_arg = None + self._client.http_client.delete(path, body_arg)
    + +
    [docs] def list( + self, + before_id: str = None, + limit: str = None, + ) -> ApplicationSessionList: + """List all application sessions for this account. + + :param before_id: + :param limit: + + https://ngrok.com/docs/api#api-application-sessions-list + """ + path = "/app/sessions" + body_arg = dict( + before_id=before_id, + limit=limit, + ) + result = self._client.http_client.get(path, body_arg) + return ApplicationSessionList(self._client, result)
    + + +
    [docs]class ApplicationUsersClient(object): + def __init__(self, client): + self._client = client + +
    [docs] def get( + self, + id: str, + ) -> ApplicationUser: + """Get an application user by ID. + + :param id: a resource identifier + + https://ngrok.com/docs/api#api-application-users-get + """ + path = "/app/users/{id}" + path = path.format( + id=id, + ) + body_arg = None + result = self._client.http_client.get(path, body_arg) + return ApplicationUser(self._client, result)
    + +
    [docs] def delete( + self, + id: str, + ): + """Delete an application user by ID. + + :param id: a resource identifier + + https://ngrok.com/docs/api#api-application-users-delete + """ + path = "/app/users/{id}" + path = path.format( + id=id, + ) + body_arg = None + self._client.http_client.delete(path, body_arg)
    + +
    [docs] def list( + self, + before_id: str = None, + limit: str = None, + ) -> ApplicationUserList: + """List all application users for this account. + + :param before_id: + :param limit: + + https://ngrok.com/docs/api#api-application-users-list + """ + path = "/app/users" + body_arg = dict( + before_id=before_id, + limit=limit, + ) + result = self._client.http_client.get(path, body_arg) + return ApplicationUserList(self._client, result)
    + +
    [docs]class FailoverBackendsClient(object): - """A Failover backend defines failover behavior within a list of referenced + """A Failover backend defines failover behavior within a list of referenced backends. Traffic is sent to the first backend in the list. If that backend is offline or no connection can be established, ngrok attempts to connect to the next backend in the list until one is successful.""" @@ -467,7 +593,7 @@ metadata: str = "", backends: Sequence[str] = [], ) -> FailoverBackend: - """Create a new Failover backend + """Create a new Failover backend :param description: human-readable description of this backend. Optional :param metadata: arbitrary user-defined machine-readable data of this backend. Optional @@ -488,7 +614,7 @@ self, id: str, ): - """Delete a Failover backend by ID. + """Delete a Failover backend by ID. :param id: a resource identifier @@ -505,7 +631,7 @@ self, id: str, ) -> FailoverBackend: - """Get detailed information about a Failover backend by ID + """Get detailed information about a Failover backend by ID :param id: a resource identifier @@ -524,7 +650,7 @@ before_id: str = None, limit: str = None, ) -> FailoverBackendList: - """List all Failover backends on this account + """List all Failover backends on this account :param before_id: :param limit: @@ -546,7 +672,7 @@ metadata: str = None, backends: Sequence[str] = [], ) -> FailoverBackend: - """Update Failover backend by ID + """Update Failover backend by ID :param id: :param description: human-readable description of this backend. Optional @@ -580,7 +706,7 @@ headers: Mapping[str, str] = {}, status_code: int = None, ) -> HTTPResponseBackend: - """ + """ :param description: human-readable description of this backend. Optional :param metadata: arbitrary user-defined machine-readable data of this backend. Optional @@ -605,7 +731,7 @@ self, id: str, ): - """ + """ :param id: a resource identifier @@ -622,7 +748,7 @@ self, id: str, ) -> HTTPResponseBackend: - """ + """ :param id: a resource identifier @@ -641,7 +767,7 @@ before_id: str = None, limit: str = None, ) -> HTTPResponseBackendList: - """ + """ :param before_id: :param limit: @@ -665,7 +791,7 @@ headers: Mapping[str, str] = None, status_code: int = None, ) -> HTTPResponseBackend: - """ + """ :param id: :param description: human-readable description of this backend. Optional @@ -692,7 +818,7 @@
    [docs]class TunnelGroupBackendsClient(object): - """A Tunnel Group Backend balances traffic among all online tunnels that match + """A Tunnel Group Backend balances traffic among all online tunnels that match a label selector.""" def __init__(self, client): @@ -704,7 +830,7 @@ metadata: str = "", labels: Mapping[str, str] = {}, ) -> TunnelGroupBackend: - """Create a new TunnelGroup backend + """Create a new TunnelGroup backend :param description: human-readable description of this backend. Optional :param metadata: arbitrary user-defined machine-readable data of this backend. Optional @@ -725,7 +851,7 @@ self, id: str, ): - """Delete a TunnelGroup backend by ID. + """Delete a TunnelGroup backend by ID. :param id: a resource identifier @@ -742,7 +868,7 @@ self, id: str, ) -> TunnelGroupBackend: - """Get detailed information about a TunnelGroup backend by ID + """Get detailed information about a TunnelGroup backend by ID :param id: a resource identifier @@ -761,7 +887,7 @@ before_id: str = None, limit: str = None, ) -> TunnelGroupBackendList: - """List all TunnelGroup backends on this account + """List all TunnelGroup backends on this account :param before_id: :param limit: @@ -783,7 +909,7 @@ metadata: str = None, labels: Mapping[str, str] = {}, ) -> TunnelGroupBackend: - """Update TunnelGroup backend by ID + """Update TunnelGroup backend by ID :param id: :param description: human-readable description of this backend. Optional @@ -806,7 +932,7 @@
    [docs]class WeightedBackendsClient(object): - """A Weighted Backend balances traffic among the referenced backends. Traffic + """A Weighted Backend balances traffic among the referenced backends. Traffic is assigned proportionally to each based on its weight. The percentage of traffic is calculated by dividing a backend's weight by the sum of all weights.""" @@ -820,7 +946,7 @@ metadata: str = "", backends: Mapping[str, int] = {}, ) -> WeightedBackend: - """Create a new Weighted backend + """Create a new Weighted backend :param description: human-readable description of this backend. Optional :param metadata: arbitrary user-defined machine-readable data of this backend. Optional @@ -841,7 +967,7 @@ self, id: str, ): - """Delete a Weighted backend by ID. + """Delete a Weighted backend by ID. :param id: a resource identifier @@ -858,7 +984,7 @@ self, id: str, ) -> WeightedBackend: - """Get detailed information about a Weighted backend by ID + """Get detailed information about a Weighted backend by ID :param id: a resource identifier @@ -877,7 +1003,7 @@ before_id: str = None, limit: str = None, ) -> WeightedBackendList: - """List all Weighted backends on this account + """List all Weighted backends on this account :param before_id: :param limit: @@ -899,7 +1025,7 @@ metadata: str = None, backends: Mapping[str, int] = {}, ) -> WeightedBackend: - """Update Weighted backend by ID + """Update Weighted backend by ID :param id: :param description: human-readable description of this backend. Optional @@ -922,7 +1048,7 @@
    [docs]class CertificateAuthoritiesClient(object): - """Certificate Authorities are x509 certificates that are used to sign other + """Certificate Authorities are x509 certificates that are used to sign other x509 certificates. Attach a Certificate Authority to the Mutual TLS module to verify that the TLS certificate presented by a client has been signed by this CA. Certificate Authorities are used only for mTLS validation only and @@ -937,7 +1063,7 @@ description: str = "", metadata: str = "", ) -> CertificateAuthority: - """Upload a new Certificate Authority + """Upload a new Certificate Authority :param description: human-readable description of this Certificate Authority. optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this Certificate Authority. optional, max 4096 bytes. @@ -958,7 +1084,7 @@ self, id: str, ): - """Delete a Certificate Authority + """Delete a Certificate Authority :param id: a resource identifier @@ -975,7 +1101,7 @@ self, id: str, ) -> CertificateAuthority: - """Get detailed information about a certficate authority + """Get detailed information about a certficate authority :param id: a resource identifier @@ -994,7 +1120,7 @@ before_id: str = None, limit: str = None, ) -> CertificateAuthorityList: - """List all Certificate Authority on this account + """List all Certificate Authority on this account :param before_id: :param limit: @@ -1015,7 +1141,7 @@ description: str = None, metadata: str = None, ) -> CertificateAuthority: - """Update attributes of a Certificate Authority by ID + """Update attributes of a Certificate Authority by ID :param id: :param description: human-readable description of this Certificate Authority. optional, max 255 bytes. @@ -1036,7 +1162,7 @@
    [docs]class CredentialsClient(object): - """Tunnel Credentials are ngrok agent authtokens. They authorize the ngrok + """Tunnel Credentials are ngrok agent authtokens. They authorize the ngrok agent to connect the ngrok service as your account. They are installed with the ``ngrok config add-authtoken`` command or by specifying it in the ``ngrok.yml`` configuration file with the ``authtoken`` property.""" @@ -1049,12 +1175,14 @@ description: str = "", metadata: str = "", acl: Sequence[str] = [], + owner_id: str = None, ) -> Credential: - """Create a new tunnel authtoken credential. This authtoken credential can be used to start a new tunnel session. The response to this API call is the only time the generated token is available. If you need it for future use, you must save it securely yourself. + """Create a new tunnel authtoken credential. This authtoken credential can be used to start a new tunnel session. The response to this API call is the only time the generated token is available. If you need it for future use, you must save it securely yourself. :param description: human-readable description of who or what will use the credential to authenticate. Optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this credential. Optional, max 4096 bytes. - :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. + :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of ``bind:*=example`` which will allow ``x=example``, ``y=example``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. + :param owner_id: If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot. https://ngrok.com/docs/api#api-credentials-create """ @@ -1063,6 +1191,7 @@ description=description, metadata=metadata, acl=acl, + owner_id=owner_id, ) result = self._client.http_client.post(path, body_arg) return Credential(self._client, result)
    @@ -1071,7 +1200,7 @@ self, id: str, ): - """Delete a tunnel authtoken credential by ID + """Delete a tunnel authtoken credential by ID :param id: a resource identifier @@ -1088,7 +1217,7 @@ self, id: str, ) -> Credential: - """Get detailed information about a tunnel authtoken credential + """Get detailed information about a tunnel authtoken credential :param id: a resource identifier @@ -1107,7 +1236,7 @@ before_id: str = None, limit: str = None, ) -> CredentialList: - """List all tunnel authtoken credentials on this account + """List all tunnel authtoken credentials on this account :param before_id: :param limit: @@ -1129,12 +1258,12 @@ metadata: str = None, acl: Sequence[str] = None, ) -> Credential: - """Update attributes of an tunnel authtoken credential by ID + """Update attributes of an tunnel authtoken credential by ID :param id: :param description: human-readable description of who or what will use the credential to authenticate. Optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this credential. Optional, max 4096 bytes. - :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. + :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of ``bind:*=example`` which will allow ``x=example``, ``y=example``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. https://ngrok.com/docs/api#api-credentials-update """ @@ -1174,7 +1303,7 @@ oidc: EndpointOIDC = None, websocket_tcp_converter: EndpointWebsocketTCPConverter = None, ) -> HTTPSEdgeRoute: - """Create an HTTPS Edge Route + """Create an HTTPS Edge Route :param edge_id: unique identifier of this edge :param match_type: Type of match to use for this route. Valid values are "exact_path" and "path_prefix". @@ -1224,7 +1353,7 @@ edge_id: str, id: str, ) -> HTTPSEdgeRoute: - """Get an HTTPS Edge Route by ID + """Get an HTTPS Edge Route by ID :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -1260,7 +1389,7 @@ oidc: EndpointOIDC = None, websocket_tcp_converter: EndpointWebsocketTCPConverter = None, ) -> HTTPSEdgeRoute: - """Updates an HTTPS Edge Route by ID. If a module is not specified in the update, it will not be modified. However, each module configuration that is specified will completely replace the existing value. There is no way to delete an existing module via this API, instead use the delete module API. + """Updates an HTTPS Edge Route by ID. If a module is not specified in the update, it will not be modified. However, each module configuration that is specified will completely replace the existing value. There is no way to delete an existing module via this API, instead use the delete module API. :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -1312,7 +1441,7 @@ edge_id: str, id: str, ): - """Delete an HTTPS Edge Route by ID + """Delete an HTTPS Edge Route by ID :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -1340,7 +1469,7 @@ mutual_tls: EndpointMutualTLSMutate = None, tls_termination: EndpointTLSTerminationAtEdge = None, ) -> HTTPSEdge: - """Create an HTTPS Edge + """Create an HTTPS Edge :param description: human-readable description of what this edge will be used for; optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this edge; optional, max 4096 bytes. @@ -1365,7 +1494,7 @@ self, id: str, ) -> HTTPSEdge: - """Get an HTTPS Edge by ID + """Get an HTTPS Edge by ID :param id: a resource identifier @@ -1384,7 +1513,7 @@ before_id: str = None, limit: str = None, ) -> HTTPSEdgeList: - """Returns a list of all HTTPS Edges on this account + """Returns a list of all HTTPS Edges on this account :param before_id: :param limit: @@ -1408,7 +1537,7 @@ mutual_tls: EndpointMutualTLSMutate = None, tls_termination: EndpointTLSTerminationAtEdge = None, ) -> HTTPSEdge: - """Updates an HTTPS Edge by ID. If a module is not specified in the update, it will not be modified. However, each module configuration that is specified will completely replace the existing value. There is no way to delete an existing module via this API, instead use the delete module API. + """Updates an HTTPS Edge by ID. If a module is not specified in the update, it will not be modified. However, each module configuration that is specified will completely replace the existing value. There is no way to delete an existing module via this API, instead use the delete module API. :param id: unique identifier of this edge :param description: human-readable description of what this edge will be used for; optional, max 255 bytes. @@ -1437,7 +1566,7 @@ self, id: str, ): - """Delete an HTTPS Edge by ID + """Delete an HTTPS Edge by ID :param id: a resource identifier @@ -1460,7 +1589,7 @@ id: str, module: EndpointMutualTLSMutate = None, ) -> EndpointMutualTLS: - """ + """ :param id: :param module: @@ -1479,7 +1608,7 @@ self, id: str, ) -> EndpointMutualTLS: - """ + """ :param id: a resource identifier @@ -1497,7 +1626,7 @@ self, id: str, ): - """ + """ :param id: a resource identifier @@ -1520,7 +1649,7 @@ id: str, module: EndpointTLSTerminationAtEdge = None, ) -> EndpointTLSTermination: - """ + """ :param id: :param module: @@ -1539,7 +1668,7 @@ self, id: str, ) -> EndpointTLSTermination: - """ + """ :param id: a resource identifier @@ -1557,7 +1686,7 @@ self, id: str, ): - """ + """ :param id: a resource identifier @@ -1581,7 +1710,7 @@ id: str, module: EndpointBackendMutate = None, ) -> EndpointBackend: - """ + """ :param edge_id: :param id: @@ -1603,7 +1732,7 @@ edge_id: str, id: str, ) -> EndpointBackend: - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -1624,7 +1753,7 @@ edge_id: str, id: str, ): - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -1650,7 +1779,7 @@ id: str, module: EndpointIPPolicyMutate = None, ) -> EndpointIPPolicy: - """ + """ :param edge_id: :param id: @@ -1672,7 +1801,7 @@ edge_id: str, id: str, ) -> EndpointIPPolicy: - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -1693,7 +1822,7 @@ edge_id: str, id: str, ): - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -1719,7 +1848,7 @@ id: str, module: EndpointRequestHeaders = None, ) -> EndpointRequestHeaders: - """ + """ :param edge_id: :param id: @@ -1741,7 +1870,7 @@ edge_id: str, id: str, ) -> EndpointRequestHeaders: - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -1762,7 +1891,7 @@ edge_id: str, id: str, ): - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -1788,7 +1917,7 @@ id: str, module: EndpointResponseHeaders = None, ) -> EndpointResponseHeaders: - """ + """ :param edge_id: :param id: @@ -1810,7 +1939,7 @@ edge_id: str, id: str, ) -> EndpointResponseHeaders: - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -1831,7 +1960,7 @@ edge_id: str, id: str, ): - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -1857,7 +1986,7 @@ id: str, module: EndpointCompression = None, ) -> EndpointCompression: - """ + """ :param edge_id: :param id: @@ -1879,7 +2008,7 @@ edge_id: str, id: str, ) -> EndpointCompression: - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -1900,7 +2029,7 @@ edge_id: str, id: str, ): - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -1926,7 +2055,7 @@ id: str, module: EndpointCircuitBreaker = None, ) -> EndpointCircuitBreaker: - """ + """ :param edge_id: :param id: @@ -1948,7 +2077,7 @@ edge_id: str, id: str, ) -> EndpointCircuitBreaker: - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -1969,7 +2098,7 @@ edge_id: str, id: str, ): - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -1995,7 +2124,7 @@ id: str, module: EndpointWebhookValidation = None, ) -> EndpointWebhookValidation: - """ + """ :param edge_id: :param id: @@ -2017,7 +2146,7 @@ edge_id: str, id: str, ) -> EndpointWebhookValidation: - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -2038,7 +2167,7 @@ edge_id: str, id: str, ): - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -2064,7 +2193,7 @@ id: str, module: EndpointOAuth = None, ) -> EndpointOAuth: - """ + """ :param edge_id: :param id: @@ -2086,7 +2215,7 @@ edge_id: str, id: str, ) -> EndpointOAuth: - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -2107,7 +2236,7 @@ edge_id: str, id: str, ): - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -2133,7 +2262,7 @@ id: str, module: EndpointSAMLMutate = None, ) -> EndpointSAML: - """ + """ :param edge_id: :param id: @@ -2155,7 +2284,7 @@ edge_id: str, id: str, ) -> EndpointSAML: - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -2176,7 +2305,7 @@ edge_id: str, id: str, ): - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -2202,7 +2331,7 @@ id: str, module: EndpointOIDC = None, ) -> EndpointOIDC: - """ + """ :param edge_id: :param id: @@ -2224,7 +2353,7 @@ edge_id: str, id: str, ) -> EndpointOIDC: - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -2245,7 +2374,7 @@ edge_id: str, id: str, ): - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -2271,7 +2400,7 @@ id: str, module: EndpointWebsocketTCPConverter = None, ) -> EndpointWebsocketTCPConverter: - """ + """ :param edge_id: :param id: @@ -2293,7 +2422,7 @@ edge_id: str, id: str, ) -> EndpointWebsocketTCPConverter: - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -2314,7 +2443,7 @@ edge_id: str, id: str, ): - """ + """ :param edge_id: unique identifier of this edge :param id: unique identifier of this edge route @@ -2342,7 +2471,7 @@ backend: EndpointBackendMutate = None, ip_restriction: EndpointIPPolicyMutate = None, ) -> TCPEdge: - """Create a TCP Edge + """Create a TCP Edge :param description: human-readable description of what this edge will be used for; optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this edge. Optional, max 4096 bytes. @@ -2367,7 +2496,7 @@ self, id: str, ) -> TCPEdge: - """Get a TCP Edge by ID + """Get a TCP Edge by ID :param id: a resource identifier @@ -2386,7 +2515,7 @@ before_id: str = None, limit: str = None, ) -> TCPEdgeList: - """Returns a list of all TCP Edges on this account + """Returns a list of all TCP Edges on this account :param before_id: :param limit: @@ -2410,7 +2539,7 @@ backend: EndpointBackendMutate = None, ip_restriction: EndpointIPPolicyMutate = None, ) -> TCPEdge: - """Updates a TCP Edge by ID. If a module is not specified in the update, it will not be modified. However, each module configuration that is specified will completely replace the existing value. There is no way to delete an existing module via this API, instead use the delete module API. + """Updates a TCP Edge by ID. If a module is not specified in the update, it will not be modified. However, each module configuration that is specified will completely replace the existing value. There is no way to delete an existing module via this API, instead use the delete module API. :param id: unique identifier of this edge :param description: human-readable description of what this edge will be used for; optional, max 255 bytes. @@ -2439,7 +2568,7 @@ self, id: str, ): - """Delete a TCP Edge by ID + """Delete a TCP Edge by ID :param id: a resource identifier @@ -2462,7 +2591,7 @@ id: str, module: EndpointBackendMutate = None, ) -> EndpointBackend: - """ + """ :param id: :param module: @@ -2481,7 +2610,7 @@ self, id: str, ) -> EndpointBackend: - """ + """ :param id: a resource identifier @@ -2499,7 +2628,7 @@ self, id: str, ): - """ + """ :param id: a resource identifier @@ -2522,7 +2651,7 @@ id: str, module: EndpointIPPolicyMutate = None, ) -> EndpointIPPolicy: - """ + """ :param id: :param module: @@ -2541,7 +2670,7 @@ self, id: str, ) -> EndpointIPPolicy: - """ + """ :param id: a resource identifier @@ -2559,7 +2688,7 @@ self, id: str, ): - """ + """ :param id: a resource identifier @@ -2587,7 +2716,7 @@ mutual_tls: EndpointMutualTLSMutate = None, tls_termination: EndpointTLSTermination = None, ) -> TLSEdge: - """Create a TLS Edge + """Create a TLS Edge :param description: human-readable description of what this edge will be used for; optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this edge. Optional, max 4096 bytes. @@ -2616,7 +2745,7 @@ self, id: str, ) -> TLSEdge: - """Get a TLS Edge by ID + """Get a TLS Edge by ID :param id: a resource identifier @@ -2635,7 +2764,7 @@ before_id: str = None, limit: str = None, ) -> TLSEdgeList: - """Returns a list of all TLS Edges on this account + """Returns a list of all TLS Edges on this account :param before_id: :param limit: @@ -2661,7 +2790,7 @@ mutual_tls: EndpointMutualTLSMutate = None, tls_termination: EndpointTLSTermination = None, ) -> TLSEdge: - """Updates a TLS Edge by ID. If a module is not specified in the update, it will not be modified. However, each module configuration that is specified will completely replace the existing value. There is no way to delete an existing module via this API, instead use the delete module API. + """Updates a TLS Edge by ID. If a module is not specified in the update, it will not be modified. However, each module configuration that is specified will completely replace the existing value. There is no way to delete an existing module via this API, instead use the delete module API. :param id: unique identifier of this edge :param description: human-readable description of what this edge will be used for; optional, max 255 bytes. @@ -2694,7 +2823,7 @@ self, id: str, ): - """Delete a TLS Edge by ID + """Delete a TLS Edge by ID :param id: a resource identifier @@ -2717,7 +2846,7 @@ id: str, module: EndpointBackendMutate = None, ) -> EndpointBackend: - """ + """ :param id: :param module: @@ -2736,7 +2865,7 @@ self, id: str, ) -> EndpointBackend: - """ + """ :param id: a resource identifier @@ -2754,7 +2883,7 @@ self, id: str, ): - """ + """ :param id: a resource identifier @@ -2777,7 +2906,7 @@ id: str, module: EndpointIPPolicyMutate = None, ) -> EndpointIPPolicy: - """ + """ :param id: :param module: @@ -2796,7 +2925,7 @@ self, id: str, ) -> EndpointIPPolicy: - """ + """ :param id: a resource identifier @@ -2814,7 +2943,7 @@ self, id: str, ): - """ + """ :param id: a resource identifier @@ -2837,7 +2966,7 @@ id: str, module: EndpointMutualTLSMutate = None, ) -> EndpointMutualTLS: - """ + """ :param id: :param module: @@ -2856,7 +2985,7 @@ self, id: str, ) -> EndpointMutualTLS: - """ + """ :param id: a resource identifier @@ -2874,7 +3003,7 @@ self, id: str, ): - """ + """ :param id: a resource identifier @@ -2897,7 +3026,7 @@ id: str, module: EndpointTLSTermination = None, ) -> EndpointTLSTermination: - """ + """ :param id: :param module: @@ -2916,7 +3045,7 @@ self, id: str, ) -> EndpointTLSTermination: - """ + """ :param id: a resource identifier @@ -2934,7 +3063,7 @@ self, id: str, ): - """ + """ :param id: a resource identifier @@ -2949,7 +3078,7 @@
    [docs]class EndpointsClient(object): - """Endpoints provides an API for querying the endpoint objects + """Endpoints provides an API for querying the endpoint objects which define what tunnel or edge is used to serve a hostport. Only active endpoints associated with a tunnel or backend are returned.""" @@ -2961,7 +3090,7 @@ before_id: str = None, limit: str = None, ) -> EndpointList: - """List all active endpoints on the account + """List all active endpoints on the account :param before_id: :param limit: @@ -2980,7 +3109,7 @@ self, id: str, ) -> Endpoint: - """Get the status of an endpoint by ID + """Get the status of an endpoint by ID :param id: a resource identifier @@ -3006,7 +3135,7 @@ format: str = "", target: EventTarget = None, ) -> EventDestination: - """Create a new Event Destination. It will not apply to anything until it is associated with an Event Stream, and that Event Stream is associated with an Endpoint Config. + """Create a new Event Destination. It will not apply to anything until it is associated with an Event Subscription. :param metadata: Arbitrary user-defined machine-readable data of this Event Destination. Optional, max 4096 bytes. :param description: Human-readable description of the Event Destination. Optional, max 255 bytes. @@ -3029,7 +3158,7 @@ self, id: str, ): - """Delete an Event Destination. If the Event Destination is still referenced by an Event Subscription. + """Delete an Event Destination. If the Event Destination is still referenced by an Event Subscription. :param id: a resource identifier @@ -3046,7 +3175,7 @@ self, id: str, ) -> EventDestination: - """Get detailed information about an Event Destination by ID. + """Get detailed information about an Event Destination by ID. :param id: a resource identifier @@ -3065,7 +3194,7 @@ before_id: str = None, limit: str = None, ) -> EventDestinationList: - """List all Event Destinations on this account. + """List all Event Destinations on this account. :param before_id: :param limit: @@ -3088,7 +3217,7 @@ format: str = None, target: EventTarget = None, ) -> EventDestination: - """Update attributes of an Event Destination. + """Update attributes of an Event Destination. :param id: Unique identifier for this Event Destination. :param metadata: Arbitrary user-defined machine-readable data of this Event Destination. Optional, max 4096 bytes. @@ -3123,7 +3252,7 @@ sources: Sequence[EventSourceReplace] = [], destination_ids: Sequence[str] = [], ) -> EventSubscription: - """Create an Event Subscription. + """Create an Event Subscription. :param metadata: Arbitrary customer supplied information intended to be machine readable. Optional, max 4096 chars. :param description: Arbitrary customer supplied information intended to be human readable. Optional, max 255 chars. @@ -3146,7 +3275,7 @@ self, id: str, ): - """Delete an Event Subscription. + """Delete an Event Subscription. :param id: a resource identifier @@ -3163,7 +3292,7 @@ self, id: str, ) -> EventSubscription: - """Get an Event Subscription by ID. + """Get an Event Subscription by ID. :param id: a resource identifier @@ -3182,7 +3311,7 @@ before_id: str = None, limit: str = None, ) -> EventSubscriptionList: - """List this Account's Event Subscriptions. + """List this Account's Event Subscriptions. :param before_id: :param limit: @@ -3205,7 +3334,7 @@ sources: Sequence[EventSourceReplace] = None, destination_ids: Sequence[str] = None, ) -> EventSubscription: - """Update an Event Subscription. + """Update an Event Subscription. :param id: Unique identifier for this Event Subscription. :param metadata: Arbitrary customer supplied information intended to be machine readable. Optional, max 4096 chars. @@ -3238,7 +3367,7 @@ subscription_id: str, type: str = "", ) -> EventSource: - """Add an additional type for which this event subscription will trigger + """Add an additional type for which this event subscription will trigger :param subscription_id: The unique identifier for the Event Subscription that this Event Source is attached to. :param type: Type of event for which an event subscription will trigger @@ -3260,7 +3389,7 @@ subscription_id: str, type: str, ): - """Remove a type for which this event subscription will trigger + """Remove a type for which this event subscription will trigger :param subscription_id: The unique identifier for the Event Subscription that this Event Source is attached to. :param type: Type of event for which an event subscription will trigger @@ -3280,7 +3409,7 @@ subscription_id: str, type: str, ) -> EventSource: - """Get the details for a given type that triggers for the given event subscription + """Get the details for a given type that triggers for the given event subscription :param subscription_id: The unique identifier for the Event Subscription that this Event Source is attached to. :param type: Type of event for which an event subscription will trigger @@ -3300,7 +3429,7 @@ self, subscription_id: str, ) -> EventSourceList: - """List the types for which this event subscription will trigger + """List the types for which this event subscription will trigger :param subscription_id: The unique identifier for the Event Subscription that this Event Source is attached to. @@ -3319,7 +3448,7 @@ subscription_id: str, type: str, ) -> EventSource: - """Update the type for which this event subscription will trigger + """Update the type for which this event subscription will trigger :param subscription_id: The unique identifier for the Event Subscription that this Event Source is attached to. :param type: Type of event for which an event subscription will trigger @@ -3337,7 +3466,7 @@
    [docs]class IPPoliciesClient(object): - """IP Policies are reusable groups of CIDR ranges with an ``allow`` or ``deny`` + """IP Policies are reusable groups of CIDR ranges with an ``allow`` or ``deny`` action. They can be attached to endpoints via the Endpoint Configuration IP Policy module. They can also be used with IP Restrictions to control source IP ranges that can start tunnel sessions and connect to the API and dashboard.""" @@ -3350,7 +3479,7 @@ description: str = "", metadata: str = "", ) -> IPPolicy: - """Create a new IP policy. It will not apply to any traffic until you associate to a traffic source via an endpoint configuration or IP restriction. + """Create a new IP policy. It will not apply to any traffic until you associate to a traffic source via an endpoint configuration or IP restriction. :param description: human-readable description of the source IPs of this IP policy. optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this IP policy. optional, max 4096 bytes. @@ -3369,7 +3498,7 @@ self, id: str, ): - """Delete an IP policy. If the IP policy is referenced by another object for the purposes of traffic restriction it will be treated as if the IP policy remains but has zero rules. + """Delete an IP policy. If the IP policy is referenced by another object for the purposes of traffic restriction it will be treated as if the IP policy remains but has zero rules. :param id: a resource identifier @@ -3386,7 +3515,7 @@ self, id: str, ) -> IPPolicy: - """Get detailed information about an IP policy by ID. + """Get detailed information about an IP policy by ID. :param id: a resource identifier @@ -3405,7 +3534,7 @@ before_id: str = None, limit: str = None, ) -> IPPolicyList: - """List all IP policies on this account + """List all IP policies on this account :param before_id: :param limit: @@ -3426,7 +3555,7 @@ description: str = None, metadata: str = None, ) -> IPPolicy: - """Update attributes of an IP policy by ID + """Update attributes of an IP policy by ID :param id: :param description: human-readable description of the source IPs of this IP policy. optional, max 255 bytes. @@ -3447,7 +3576,7 @@
    [docs]class IPPolicyRulesClient(object): - """IP Policy Rules are the IPv4 or IPv6 CIDRs entries that + """IP Policy Rules are the IPv4 or IPv6 CIDRs entries that make up an IP Policy.""" def __init__(self, client): @@ -3461,7 +3590,7 @@ description: str = "", metadata: str = "", ) -> IPPolicyRule: - """Create a new IP policy rule attached to an IP Policy. + """Create a new IP policy rule attached to an IP Policy. :param description: human-readable description of the source IPs of this IP rule. optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this IP policy rule. optional, max 4096 bytes. @@ -3486,7 +3615,7 @@ self, id: str, ): - """Delete an IP policy rule. + """Delete an IP policy rule. :param id: a resource identifier @@ -3503,7 +3632,7 @@ self, id: str, ) -> IPPolicyRule: - """Get detailed information about an IP policy rule by ID. + """Get detailed information about an IP policy rule by ID. :param id: a resource identifier @@ -3522,7 +3651,7 @@ before_id: str = None, limit: str = None, ) -> IPPolicyRuleList: - """List all IP policy rules on this account + """List all IP policy rules on this account :param before_id: :param limit: @@ -3544,7 +3673,7 @@ metadata: str = None, cidr: str = None, ) -> IPPolicyRule: - """Update attributes of an IP policy rule by ID + """Update attributes of an IP policy rule by ID :param id: :param description: human-readable description of the source IPs of this IP rule. optional, max 255 bytes. @@ -3567,7 +3696,7 @@
    [docs]class IPRestrictionsClient(object): - """An IP restriction is a restriction placed on the CIDRs that are allowed to + """An IP restriction is a restriction placed on the CIDRs that are allowed to initiate traffic to a specific aspect of your ngrok account. An IP restriction has a type which defines the ingress it applies to. IP restrictions can be used to enforce the source IPs that can make API @@ -3585,7 +3714,7 @@ metadata: str = "", enforced: bool = False, ) -> IPRestriction: - """Create a new IP restriction + """Create a new IP restriction :param description: human-readable description of this IP restriction. optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this IP restriction. optional, max 4096 bytes. @@ -3610,7 +3739,7 @@ self, id: str, ): - """Delete an IP restriction + """Delete an IP restriction :param id: a resource identifier @@ -3627,7 +3756,7 @@ self, id: str, ) -> IPRestriction: - """Get detailed information about an IP restriction + """Get detailed information about an IP restriction :param id: a resource identifier @@ -3646,7 +3775,7 @@ before_id: str = None, limit: str = None, ) -> IPRestrictionList: - """List all IP restrictions on this account + """List all IP restrictions on this account :param before_id: :param limit: @@ -3669,7 +3798,7 @@ enforced: bool = None, ip_policy_ids: Sequence[str] = [], ) -> IPRestriction: - """Update attributes of an IP restriction by ID + """Update attributes of an IP restriction by ID :param id: :param description: human-readable description of this IP restriction. optional, max 255 bytes. @@ -3694,7 +3823,7 @@
    [docs]class ReservedAddrsClient(object): - """Reserved Addresses are TCP addresses that can be used to listen for traffic. + """Reserved Addresses are TCP addresses that can be used to listen for traffic. TCP address hostnames and ports are assigned by ngrok, they cannot be chosen.""" @@ -3707,7 +3836,7 @@ metadata: str = "", region: str = "", ) -> ReservedAddr: - """Create a new reserved address. + """Create a new reserved address. :param description: human-readable description of what this reserved address will be used for :param metadata: arbitrary user-defined machine-readable data of this reserved address. Optional, max 4096 bytes. @@ -3728,7 +3857,7 @@ self, id: str, ): - """Delete a reserved address. + """Delete a reserved address. :param id: a resource identifier @@ -3745,7 +3874,7 @@ self, id: str, ) -> ReservedAddr: - """Get the details of a reserved address. + """Get the details of a reserved address. :param id: a resource identifier @@ -3764,7 +3893,7 @@ before_id: str = None, limit: str = None, ) -> ReservedAddrList: - """List all reserved addresses on this account. + """List all reserved addresses on this account. :param before_id: :param limit: @@ -3785,7 +3914,7 @@ description: str = None, metadata: str = None, ) -> ReservedAddr: - """Update the attributes of a reserved address. + """Update the attributes of a reserved address. :param id: :param description: human-readable description of what this reserved address will be used for @@ -3806,7 +3935,7 @@
    [docs]class ReservedDomainsClient(object): - """Reserved Domains are hostnames that you can listen for traffic on. Domains + """Reserved Domains are hostnames that you can listen for traffic on. Domains can be used to listen for http, https or tls traffic. You may use a domain that you own by creating a CNAME record specified in the returned resource. This CNAME record points traffic for that domain to ngrok's edge servers.""" @@ -3816,16 +3945,18 @@
    [docs] def create( self, - name: str, + name: str = "", + domain: str = "", region: str = "", description: str = "", metadata: str = "", certificate_id: str = None, certificate_management_policy: ReservedDomainCertPolicy = None, ) -> ReservedDomain: - """Create a new reserved domain. + """Create a new reserved domain. :param name: the domain name to reserve. It may be a full domain name like app.example.com. If the name does not contain a '.' it will reserve that subdomain on ngrok.io. + :param domain: hostname of the reserved domain :param region: reserve the domain in this geographic ngrok datacenter. Optional, default is us. (au, eu, ap, us, jp, in, sa) :param description: human-readable description of what this reserved domain will be used for :param metadata: arbitrary user-defined machine-readable data of this reserved domain. Optional, max 4096 bytes. @@ -3837,6 +3968,7 @@ path = "/reserved_domains" body_arg = dict( name=name, + domain=domain, region=region, description=description, metadata=metadata, @@ -3850,7 +3982,7 @@ self, id: str, ): - """Delete a reserved domain. + """Delete a reserved domain. :param id: a resource identifier @@ -3867,7 +3999,7 @@ self, id: str, ) -> ReservedDomain: - """Get the details of a reserved domain. + """Get the details of a reserved domain. :param id: a resource identifier @@ -3886,7 +4018,7 @@ before_id: str = None, limit: str = None, ) -> ReservedDomainList: - """List all reserved domains on this account. + """List all reserved domains on this account. :param before_id: :param limit: @@ -3909,7 +4041,7 @@ certificate_id: str = None, certificate_management_policy: ReservedDomainCertPolicy = None, ) -> ReservedDomain: - """Update the attributes of a reserved domain. + """Update the attributes of a reserved domain. :param id: :param description: human-readable description of what this reserved domain will be used for @@ -3936,7 +4068,7 @@ self, id: str, ): - """Detach the certificate management policy attached to a reserved domain. + """Detach the certificate management policy attached to a reserved domain. :param id: a resource identifier @@ -3953,7 +4085,7 @@ self, id: str, ): - """Detach the certificate attached to a reserved domain. + """Detach the certificate attached to a reserved domain. :param id: a resource identifier @@ -3968,7 +4100,7 @@
    [docs]class SSHCertificateAuthoritiesClient(object): - """An SSH Certificate Authority is a pair of an SSH Certificate and its private + """An SSH Certificate Authority is a pair of an SSH Certificate and its private key that can be used to sign other SSH host and user certificates.""" def __init__(self, client): @@ -3982,7 +4114,7 @@ elliptic_curve: str = "", key_size: int = 0, ) -> SSHCertificateAuthority: - """Create a new SSH Certificate Authority + """Create a new SSH Certificate Authority :param description: human-readable description of this SSH Certificate Authority. optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this SSH Certificate Authority. optional, max 4096 bytes. @@ -4007,7 +4139,7 @@ self, id: str, ): - """Delete an SSH Certificate Authority + """Delete an SSH Certificate Authority :param id: a resource identifier @@ -4024,7 +4156,7 @@ self, id: str, ) -> SSHCertificateAuthority: - """Get detailed information about an SSH Certficate Authority + """Get detailed information about an SSH Certficate Authority :param id: a resource identifier @@ -4043,7 +4175,7 @@ before_id: str = None, limit: str = None, ) -> SSHCertificateAuthorityList: - """List all SSH Certificate Authorities on this account + """List all SSH Certificate Authorities on this account :param before_id: :param limit: @@ -4064,7 +4196,7 @@ description: str = None, metadata: str = None, ) -> SSHCertificateAuthority: - """Update an SSH Certificate Authority + """Update an SSH Certificate Authority :param id: :param description: human-readable description of this SSH Certificate Authority. optional, max 255 bytes. @@ -4085,7 +4217,7 @@
    [docs]class SSHCredentialsClient(object): - """SSH Credentials are SSH public keys that can be used to start SSH tunnels + """SSH Credentials are SSH public keys that can be used to start SSH tunnels via the ngrok SSH tunnel gateway.""" def __init__(self, client): @@ -4097,13 +4229,15 @@ description: str = "", metadata: str = "", acl: Sequence[str] = [], + owner_id: str = None, ) -> SSHCredential: - """Create a new ssh_credential from an uploaded public SSH key. This ssh credential can be used to start new tunnels via ngrok's SSH gateway. + """Create a new ssh_credential from an uploaded public SSH key. This ssh credential can be used to start new tunnels via ngrok's SSH gateway. :param description: human-readable description of who or what will use the ssh credential to authenticate. Optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this ssh credential. Optional, max 4096 bytes. - :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. + :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of ``bind:*=example`` which will allow ``x=example``, ``y=example``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. :param public_key: the PEM-encoded public key of the SSH keypair that will be used to authenticate + :param owner_id: If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot. https://ngrok.com/docs/api#api-ssh-credentials-create """ @@ -4113,6 +4247,7 @@ metadata=metadata, acl=acl, public_key=public_key, + owner_id=owner_id, ) result = self._client.http_client.post(path, body_arg) return SSHCredential(self._client, result)
    @@ -4121,7 +4256,7 @@ self, id: str, ): - """Delete an ssh_credential by ID + """Delete an ssh_credential by ID :param id: a resource identifier @@ -4138,7 +4273,7 @@ self, id: str, ) -> SSHCredential: - """Get detailed information about an ssh_credential + """Get detailed information about an ssh_credential :param id: a resource identifier @@ -4157,7 +4292,7 @@ before_id: str = None, limit: str = None, ) -> SSHCredentialList: - """List all ssh credentials on this account + """List all ssh credentials on this account :param before_id: :param limit: @@ -4179,12 +4314,12 @@ metadata: str = None, acl: Sequence[str] = None, ) -> SSHCredential: - """Update attributes of an ssh_credential by ID + """Update attributes of an ssh_credential by ID :param id: :param description: human-readable description of who or what will use the ssh credential to authenticate. Optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this ssh credential. Optional, max 4096 bytes. - :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. + :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of ``bind:*=example`` which will allow ``x=example``, ``y=example``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. https://ngrok.com/docs/api#api-ssh-credentials-update """ @@ -4202,7 +4337,7 @@
    [docs]class SSHHostCertificatesClient(object): - """SSH Host Certificates along with the corresponding private key allows an SSH + """SSH Host Certificates along with the corresponding private key allows an SSH server to assert its authenticity to connecting SSH clients who trust the SSH Certificate Authority that was used to sign the certificate.""" @@ -4219,7 +4354,7 @@ description: str = "", metadata: str = "", ) -> SSHHostCertificate: - """Create a new SSH Host Certificate + """Create a new SSH Host Certificate :param ssh_certificate_authority_id: the ssh certificate authority that is used to sign this ssh host certificate :param public_key: a public key in OpenSSH Authorized Keys format that this certificate signs @@ -4248,7 +4383,7 @@ self, id: str, ): - """Delete an SSH Host Certificate + """Delete an SSH Host Certificate :param id: a resource identifier @@ -4265,7 +4400,7 @@ self, id: str, ) -> SSHHostCertificate: - """Get detailed information about an SSH Host Certficate + """Get detailed information about an SSH Host Certficate :param id: a resource identifier @@ -4284,7 +4419,7 @@ before_id: str = None, limit: str = None, ) -> SSHHostCertificateList: - """List all SSH Host Certificates issued on this account + """List all SSH Host Certificates issued on this account :param before_id: :param limit: @@ -4305,7 +4440,7 @@ description: str = None, metadata: str = None, ) -> SSHHostCertificate: - """Update an SSH Host Certificate + """Update an SSH Host Certificate :param id: :param description: human-readable description of this SSH Host Certificate. optional, max 255 bytes. @@ -4326,7 +4461,7 @@
    [docs]class SSHUserCertificatesClient(object): - """SSH User Certificates are presented by SSH clients when connecting to an SSH + """SSH User Certificates are presented by SSH clients when connecting to an SSH server to authenticate their connection. The SSH server must trust the SSH Certificate Authority used to sign the certificate.""" @@ -4345,13 +4480,13 @@ description: str = "", metadata: str = "", ) -> SSHUserCertificate: - """Create a new SSH User Certificate + """Create a new SSH User Certificate :param ssh_certificate_authority_id: the ssh certificate authority that is used to sign this ssh user certificate :param public_key: a public key in OpenSSH Authorized Keys format that this certificate signs :param principals: the list of principals included in the ssh user certificate. This is the list of usernames that the certificate holder may sign in as on a machine authorizing the signing certificate authority. Dangerously, if no principals are specified, this certificate may be used to log in as any user. - :param critical_options: A map of critical options included in the certificate. Only two critical options are currently defined by OpenSSH: ``force-command`` and ``source-address``. See `the OpenSSH certificate protocol spec` <https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.certkeys>`_ for additional details. - :param extensions: A map of extensions included in the certificate. Extensions are additional metadata that can be interpreted by the SSH server for any purpose. These can be used to permit or deny the ability to open a terminal, do port forwarding, x11 forwarding, and more. If unspecified, the certificate will include limited permissions with the following extension map: ``{"permit-pty": "", "permit-user-rc": ""}`` OpenSSH understands a number of predefined extensions. See `the OpenSSH certificate protocol spec` <https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.certkeys>`_ for additional details. + :param critical_options: A map of critical options included in the certificate. Only two critical options are currently defined by OpenSSH: ``force-command`` and ``source-address``. See `the OpenSSH certificate protocol spec <https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.certkeys>`_ for additional details. + :param extensions: A map of extensions included in the certificate. Extensions are additional metadata that can be interpreted by the SSH server for any purpose. These can be used to permit or deny the ability to open a terminal, do port forwarding, x11 forwarding, and more. If unspecified, the certificate will include limited permissions with the following extension map: ``{"permit-pty": "", "permit-user-rc": ""}`` OpenSSH understands a number of predefined extensions. See `the OpenSSH certificate protocol spec <https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.certkeys>`_ for additional details. :param valid_after: The time when the user certificate becomes valid, in RFC 3339 format. Defaults to the current time if unspecified. :param valid_until: The time when this host certificate becomes invalid, in RFC 3339 format. If unspecified, a default value of 24 hours will be used. The OpenSSH certificates RFC calls this ``valid_before``. :param description: human-readable description of this SSH User Certificate. optional, max 255 bytes. @@ -4378,7 +4513,7 @@ self, id: str, ): - """Delete an SSH User Certificate + """Delete an SSH User Certificate :param id: a resource identifier @@ -4395,7 +4530,7 @@ self, id: str, ) -> SSHUserCertificate: - """Get detailed information about an SSH User Certficate + """Get detailed information about an SSH User Certficate :param id: a resource identifier @@ -4414,7 +4549,7 @@ before_id: str = None, limit: str = None, ) -> SSHUserCertificateList: - """List all SSH User Certificates issued on this account + """List all SSH User Certificates issued on this account :param before_id: :param limit: @@ -4435,7 +4570,7 @@ description: str = None, metadata: str = None, ) -> SSHUserCertificate: - """Update an SSH User Certificate + """Update an SSH User Certificate :param id: :param description: human-readable description of this SSH User Certificate. optional, max 255 bytes. @@ -4456,7 +4591,7 @@
    [docs]class TLSCertificatesClient(object): - """TLS Certificates are pairs of x509 certificates and their matching private + """TLS Certificates are pairs of x509 certificates and their matching private key that can be used to terminate TLS traffic. TLS certificates are unused until they are attached to a Domain. TLS Certificates may also be provisioned by ngrok automatically for domains on which you have enabled @@ -4472,12 +4607,12 @@ description: str = "", metadata: str = "", ) -> TLSCertificate: - """Upload a new TLS certificate + """Upload a new TLS certificate :param description: human-readable description of this TLS certificate. optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this TLS certificate. optional, max 4096 bytes. - :param certificate_pem: chain of PEM-encoded certificates, leaf first. See `Certificate Bundles` <https://ngrok.com/docs/api#tls-certificates-pem>`_. - :param private_key_pem: private key for the TLS certificate, PEM-encoded. See `Private Keys` <https://ngrok.com/docs/ngrok-link#tls-certificates-key>`_. + :param certificate_pem: chain of PEM-encoded certificates, leaf first. See `Certificate Bundles <https://ngrok.com/docs/api#tls-certificates-pem>`_. + :param private_key_pem: private key for the TLS certificate, PEM-encoded. See `Private Keys <https://ngrok.com/docs/ngrok-link#tls-certificates-key>`_. https://ngrok.com/docs/api#api-tls-certificates-create """ @@ -4495,7 +4630,7 @@ self, id: str, ): - """Delete a TLS certificate + """Delete a TLS certificate :param id: a resource identifier @@ -4512,7 +4647,7 @@ self, id: str, ) -> TLSCertificate: - """Get detailed information about a TLS certificate + """Get detailed information about a TLS certificate :param id: a resource identifier @@ -4531,7 +4666,7 @@ before_id: str = None, limit: str = None, ) -> TLSCertificateList: - """List all TLS certificates on this account + """List all TLS certificates on this account :param before_id: :param limit: @@ -4552,7 +4687,7 @@ description: str = None, metadata: str = None, ) -> TLSCertificate: - """Update attributes of a TLS Certificate by ID + """Update attributes of a TLS Certificate by ID :param id: :param description: human-readable description of this TLS certificate. optional, max 255 bytes. @@ -4573,7 +4708,7 @@
    [docs]class TunnelSessionsClient(object): - """Tunnel Sessions represent instances of ngrok agents or SSH reverse tunnel + """Tunnel Sessions represent instances of ngrok agents or SSH reverse tunnel sessions that are running and connected to the ngrok service. Each tunnel session can include one or more Tunnels.""" @@ -4585,7 +4720,7 @@ before_id: str = None, limit: str = None, ) -> TunnelSessionList: - """List all online tunnel sessions running on this account. + """List all online tunnel sessions running on this account. :param before_id: :param limit: @@ -4604,7 +4739,7 @@ self, id: str, ) -> TunnelSession: - """Get the detailed status of a tunnel session by ID + """Get the detailed status of a tunnel session by ID :param id: a resource identifier @@ -4622,7 +4757,7 @@ self, id: str, ): - """Issues a command instructing the ngrok agent to restart. The agent restarts itself by calling exec() on platforms that support it. This operation is notably not supported on Windows. When an agent restarts, it reconnects with a new tunnel session ID. + """Issues a command instructing the ngrok agent to restart. The agent restarts itself by calling exec() on platforms that support it. This operation is notably not supported on Windows. When an agent restarts, it reconnects with a new tunnel session ID. :param id: a resource identifier @@ -4639,7 +4774,7 @@ self, id: str, ): - """Issues a command instructing the ngrok agent that started this tunnel session to exit. + """Issues a command instructing the ngrok agent that started this tunnel session to exit. :param id: a resource identifier @@ -4656,7 +4791,7 @@ self, id: str, ): - """Issues a command instructing the ngrok agent to update itself to the latest version. After this call completes successfully, the ngrok agent will be in the update process. A caller should wait some amount of time to allow the update to complete (at least 10 seconds) before making a call to the Restart endpoint to request that the agent restart itself to start using the new code. This call will never update an ngrok agent to a new major version which could cause breaking compatibility issues. If you wish to update to a new major version, that must be done manually. Still, please be aware that updating your ngrok agent could break your integration. This call will fail in any of the following circumstances: there is no update available the ngrok agent's configuration disabled update checks the agent is currently in process of updating the agent has already successfully updated but has not yet been restarted + """Issues a command instructing the ngrok agent to update itself to the latest version. After this call completes successfully, the ngrok agent will be in the update process. A caller should wait some amount of time to allow the update to complete (at least 10 seconds) before making a call to the Restart endpoint to request that the agent restart itself to start using the new code. This call will never update an ngrok agent to a new major version which could cause breaking compatibility issues. If you wish to update to a new major version, that must be done manually. Still, please be aware that updating your ngrok agent could break your integration. This call will fail in any of the following circumstances: there is no update available the ngrok agent's configuration disabled update checks the agent is currently in process of updating the agent has already successfully updated but has not yet been restarted :param id: @@ -4671,7 +4806,7 @@
    [docs]class TunnelsClient(object): - """Tunnels provide endpoints to access services exposed by a running ngrok + """Tunnels provide endpoints to access services exposed by a running ngrok agent tunnel session or an SSH reverse tunnel session.""" def __init__(self, client): @@ -4682,7 +4817,7 @@ before_id: str = None, limit: str = None, ) -> TunnelList: - """List all online tunnels currently running on the account. + """List all online tunnels currently running on the account. :param before_id: :param limit: @@ -4701,7 +4836,7 @@ self, id: str, ) -> Tunnel: - """Get the status of a tunnel by ID + """Get the status of a tunnel by ID :param id: a resource identifier diff --git a/docs/_sources/application_sessions.rst.txt b/docs/_sources/application_sessions.rst.txt new file mode 100644 index 0000000..fd3ac2d --- /dev/null +++ b/docs/_sources/application_sessions.rst.txt @@ -0,0 +1,9 @@ +Application Sessions +===================================== + +Do not construct this object directly, instead access the +:attr:`~ngrok.Client.application_sessions` property of an :class:`ngrok.Client` object. + +.. automodule:: ngrok.services + :members: ApplicationSessionsClient + :undoc-members: ApplicationSessionsClient diff --git a/docs/_sources/application_users.rst.txt b/docs/_sources/application_users.rst.txt new file mode 100644 index 0000000..7aa4ca6 --- /dev/null +++ b/docs/_sources/application_users.rst.txt @@ -0,0 +1,9 @@ +Application Users +===================================== + +Do not construct this object directly, instead access the +:attr:`~ngrok.Client.application_users` property of an :class:`ngrok.Client` object. + +.. automodule:: ngrok.services + :members: ApplicationUsersClient + :undoc-members: ApplicationUsersClient diff --git a/docs/_sources/index.rst.txt b/docs/_sources/index.rst.txt index 699c4c0..35697fc 100644 --- a/docs/_sources/index.rst.txt +++ b/docs/_sources/index.rst.txt @@ -123,6 +123,8 @@ API Reference abuse_reports agent_ingresses api_keys + application_sessions + application_users failover_backends http_response_backends tunnel_group_backends diff --git a/docs/_static/pygments_dark.css b/docs/_static/pygments_dark.css index f47d24a..bb27289 100644 --- a/docs/_static/pygments_dark.css +++ b/docs/_static/pygments_dark.css @@ -5,21 +5,21 @@ td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5 span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #404040 } .highlight { background: #202020; color: #d0d0d0 } -.highlight .c { color: #999999; font-style: italic } /* Comment */ +.highlight .c { color: #ababab; font-style: italic } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .esc { color: #d0d0d0 } /* Escape */ .highlight .g { color: #d0d0d0 } /* Generic */ -.highlight .k { color: #6ab825; font-weight: bold } /* Keyword */ +.highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ .highlight .l { color: #d0d0d0 } /* Literal */ .highlight .n { color: #d0d0d0 } /* Name */ .highlight .o { color: #d0d0d0 } /* Operator */ .highlight .x { color: #d0d0d0 } /* Other */ .highlight .p { color: #d0d0d0 } /* Punctuation */ -.highlight .ch { color: #999999; font-style: italic } /* Comment.Hashbang */ -.highlight .cm { color: #999999; font-style: italic } /* Comment.Multiline */ +.highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ .highlight .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */ -.highlight .cpf { color: #999999; font-style: italic } /* Comment.PreprocFile */ -.highlight .c1 { color: #999999; font-style: italic } /* Comment.Single */ +.highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ .highlight .gd { color: #d22323 } /* Generic.Deleted */ .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ @@ -31,36 +31,37 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ .highlight .gt { color: #d22323 } /* Generic.Traceback */ -.highlight .kc { color: #6ab825; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #6ab825; font-weight: bold } /* Keyword.Declaration */ -.highlight .kn { color: #6ab825; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #6ab825 } /* Keyword.Pseudo */ -.highlight .kr { color: #6ab825; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #6ab825; font-weight: bold } /* Keyword.Type */ +.highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ +.highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ .highlight .ld { color: #d0d0d0 } /* Literal.Date */ -.highlight .m { color: #3677a9 } /* Literal.Number */ +.highlight .m { color: #51b2fd } /* Literal.Number */ .highlight .s { color: #ed9d13 } /* Literal.String */ .highlight .na { color: #bbbbbb } /* Name.Attribute */ -.highlight .nb { color: #24909d } /* Name.Builtin */ -.highlight .nc { color: #447fcf; text-decoration: underline } /* Name.Class */ +.highlight .nb { color: #2fbccd } /* Name.Builtin */ +.highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ .highlight .no { color: #40ffff } /* Name.Constant */ .highlight .nd { color: #ffa500 } /* Name.Decorator */ .highlight .ni { color: #d0d0d0 } /* Name.Entity */ .highlight .ne { color: #bbbbbb } /* Name.Exception */ -.highlight .nf { color: #447fcf } /* Name.Function */ +.highlight .nf { color: #71adff } /* Name.Function */ .highlight .nl { color: #d0d0d0 } /* Name.Label */ -.highlight .nn { color: #447fcf; text-decoration: underline } /* Name.Namespace */ +.highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ .highlight .nx { color: #d0d0d0 } /* Name.Other */ .highlight .py { color: #d0d0d0 } /* Name.Property */ -.highlight .nt { color: #6ab825; font-weight: bold } /* Name.Tag */ +.highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #40ffff } /* Name.Variable */ -.highlight .ow { color: #6ab825; font-weight: bold } /* Operator.Word */ +.highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ .highlight .w { color: #666666 } /* Text.Whitespace */ -.highlight .mb { color: #3677a9 } /* Literal.Number.Bin */ -.highlight .mf { color: #3677a9 } /* Literal.Number.Float */ -.highlight .mh { color: #3677a9 } /* Literal.Number.Hex */ -.highlight .mi { color: #3677a9 } /* Literal.Number.Integer */ -.highlight .mo { color: #3677a9 } /* Literal.Number.Oct */ +.highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ +.highlight .mf { color: #51b2fd } /* Literal.Number.Float */ +.highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ +.highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ +.highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ @@ -74,10 +75,10 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ -.highlight .bp { color: #24909d } /* Name.Builtin.Pseudo */ -.highlight .fm { color: #447fcf } /* Name.Function.Magic */ +.highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #71adff } /* Name.Function.Magic */ .highlight .vc { color: #40ffff } /* Name.Variable.Class */ .highlight .vg { color: #40ffff } /* Name.Variable.Global */ .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ -.highlight .il { color: #3677a9 } /* Literal.Number.Integer.Long */ \ No newline at end of file +.highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/abuse_reports.html b/docs/abuse_reports.html index 27e0397..7e6853d 100644 --- a/docs/abuse_reports.html +++ b/docs/abuse_reports.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/agent_ingresses.html b/docs/agent_ingresses.html index 9e24e7b..a89c0a6 100644 --- a/docs/agent_ingresses.html +++ b/docs/agent_ingresses.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/api_keys.html b/docs/api_keys.html index 916d397..009da40 100644 --- a/docs/api_keys.html +++ b/docs/api_keys.html @@ -2,7 +2,7 @@ - + API Keys - ngrok-api documentation @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • @@ -184,20 +186,21 @@
    class ngrok.services.APIKeysClient(client)[source]
    -

    API Keys are used to authenticate to the ngrok -API <https://ngrok.com/docs/api#authentication>`_. You may use the API itself +

    API Keys are used to authenticate to the ngrok +API. You may use the API itself to provision and manage API Keys but you’ll need to provision your first API -key from the API Keys page <https://dashboard.ngrok.com/api/keys>`_ on your +key from the API Keys page on your ngrok.com dashboard.

    -create(description='', metadata='')[source]
    +create(description='', metadata='', owner_id=None)[source]

    Create a new API key. The generated API key can be used to authenticate to the ngrok API.

    Parameters
    • description (str) – human-readable description of what uses the API key to authenticate. optional, max 255 bytes.

    • metadata (str) – arbitrary user-defined data of this API key. optional, max 4096 bytes

    • +
    • owner_id (Optional[str]) – If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot.

    @@ -281,12 +284,12 @@ ngrok.com dashboard.

    +
    +property owner_id
    +

    If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot.

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    property token

    the bearer token that can be placed into the Authorization header to authenticate request to the ngrok API. This value is only available one time, on the API response from key creation. Otherwise it is null.

    @@ -573,6 +585,334 @@
    +
    +class ngrok.datatypes.ApplicationSession(client, props)[source]
    +
    +
    +property application_user
    +

    application user this session is associated with

    +
    +
    Return type
    +

    Ref

    +
    +
    +
    +
    +
    +property browser_session
    +

    browser session details of the application session

    +
    +
    Return type
    +

    BrowserSession

    +
    +
    +
    +
    +
    +property created_at
    +

    timestamp when the user was created in RFC 3339 format

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +delete()[source]
    +
    +
    +
    +property edge
    +

    edge this session is associated with, null if the endpoint is agent-initiated

    +
    +
    Return type
    +

    Ref

    +
    +
    +
    +
    +
    +property endpoint
    +

    ephemeral endpoint this session is associated with

    +
    +
    Return type
    +

    Ref

    +
    +
    +
    +
    +
    +property expires_at
    +

    timestamp when session expires in RFC 3339 format

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property id
    +

    unique application session resource identifier

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property last_active
    +

    timestamp when the user was last active in RFC 3339 format

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property public_url
    +

    URL of the hostport served by this endpoint

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property route
    +

    route this session is associated with, null if the endpoint is agent-initiated

    +
    +
    Return type
    +

    Ref

    +
    +
    +
    +
    +
    +property uri
    +

    URI of the application session API resource

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +
    +class ngrok.datatypes.ApplicationSessionList(client, props)[source]
    +
    +
    +property application_sessions
    +

    list of all application sessions on this account

    +
    +
    Return type
    +

    Sequence[ApplicationSession]

    +
    +
    +
    +
    +
    +property next_page_uri
    +

    URI of the next page, or null if there is no next page

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property uri
    +

    URI of the application session list API resource

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +
    +class ngrok.datatypes.ApplicationUser(client, props)[source]
    +
    +
    +property created_at
    +

    timestamp when the user was created in RFC 3339 format

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +delete()[source]
    +
    +
    +
    +property email
    +

    user email

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property id
    +

    unique application user resource identifier

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property identity_provider
    +

    identity provider that the user authenticated with

    +
    +
    Return type
    +

    IdentityProvider

    +
    +
    +
    +
    +
    +property last_active
    +

    timestamp when the user was last active in RFC 3339 format

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property last_login
    +

    timestamp when the user last signed-in in RFC 3339 format

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property name
    +

    user common name

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property provider_user_id
    +

    unique user identifier

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property uri
    +

    URI of the application user API resource

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property username
    +

    user username

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +
    +class ngrok.datatypes.ApplicationUserList(client, props)[source]
    +
    +
    +property application_users
    +

    list of all application users on this account

    +
    +
    Return type
    +

    Sequence[ApplicationUser]

    +
    +
    +
    +
    +
    +property next_page_uri
    +

    URI of the next page, or null if there is no next page

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property uri
    +

    URI of the application user list API resource

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +
    +class ngrok.datatypes.BrowserSession(client, props)[source]
    +
    +
    +property ip_address
    +

    IP address

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property location
    +

    IP geolocation data

    +
    +
    Return type
    +

    Location

    +
    +
    +
    +
    +
    +property user_agent
    +

    HTTP User-Agent data

    +
    +
    Return type
    +

    UserAgent

    +
    +
    +
    +
    +
    class ngrok.datatypes.CertificateAuthority(client, props)[source]
    @@ -734,7 +1074,7 @@
    property acl
    -

    optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the bind rule. The bind rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule bind:example.ngrok.io. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of bind:*.example.com which will allow x.example.com, y.example.com, *.example.com, etc. A rule of '*' is equivalent to no acl at all and will explicitly permit all actions.

    +

    optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the bind rule. The bind rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule bind:example.ngrok.io. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of bind:*.example.com which will allow x.example.com, y.example.com, *.example.com, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of bind:*=example which will allow x=example, y=example, etc. A rule of '*' is equivalent to no acl at all and will explicitly permit all actions.

    Return type

    Sequence[str]

    @@ -786,6 +1126,16 @@
    +
    +property owner_id
    +

    If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot.

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    property token

    the credential’s authtoken that can be used to authenticate an ngrok agent. This value is only available one time, on the API response from credential creation, otherwise it is null.

    @@ -1075,7 +1425,7 @@

    Integer number of seconds after which the circuit is tripped to wait before re-evaluating upstream health

    Return type
    -

    int

    +

    timedelta

    @@ -1282,7 +1632,7 @@

    Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.

    Return type
    -

    int

    +

    timedelta

    @@ -1308,6 +1658,55 @@
    +
    +class ngrok.datatypes.EndpointOAuthAmazon(client, props)[source]
    +
    +
    +property client_id
    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property client_secret
    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property email_addresses
    +
    +
    Return type
    +

    Sequence[str]

    +
    +
    +
    +
    +
    +property email_domains
    +
    +
    Return type
    +

    Sequence[str]

    +
    +
    +
    +
    +
    +property scopes
    +
    +
    Return type
    +

    Sequence[str]

    +
    +
    +
    +
    +
    class ngrok.datatypes.EndpointOAuthFacebook(client, props)[source]
    @@ -1436,6 +1835,55 @@
    +
    +class ngrok.datatypes.EndpointOAuthGitLab(client, props)[source]
    +
    +
    +property client_id
    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property client_secret
    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property email_addresses
    +
    +
    Return type
    +

    Sequence[str]

    +
    +
    +
    +
    +
    +property email_domains
    +
    +
    Return type
    +

    Sequence[str]

    +
    +
    +
    +
    +
    +property scopes
    +
    +
    Return type
    +

    Sequence[str]

    +
    +
    +
    +
    +
    class ngrok.datatypes.EndpointOAuthGoogle(client, props)[source]
    @@ -1490,6 +1938,55 @@
    +
    +class ngrok.datatypes.EndpointOAuthLinkedIn(client, props)[source]
    +
    +
    +property client_id
    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property client_secret
    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property email_addresses
    +
    +
    Return type
    +

    Sequence[str]

    +
    +
    +
    +
    +
    +property email_domains
    +
    +
    Return type
    +

    Sequence[str]

    +
    +
    +
    +
    +
    +property scopes
    +
    +
    Return type
    +

    Sequence[str]

    +
    +
    +
    +
    +
    class ngrok.datatypes.EndpointOAuthMicrosoft(client, props)[source]
    @@ -1547,6 +2044,16 @@
    class ngrok.datatypes.EndpointOAuthProvider(client, props)[source]
    +
    +property amazon
    +

    configuration for using amazon as the identity provider

    +
    +
    Return type
    +

    EndpointOAuthAmazon

    +
    +
    +
    +
    property facebook

    configuration for using facebook as the identity provider

    @@ -1567,6 +2074,16 @@
    +
    +property gitlab
    +

    configuration for using gitlab as the identity provider

    +
    +
    Return type
    +

    EndpointOAuthGitLab

    +
    +
    +
    +
    property google

    configuration for using google as the identity provider

    @@ -1577,6 +2094,16 @@
    +
    +property linkedin
    +

    configuration for using linkedin as the identity provider

    +
    +
    Return type
    +

    EndpointOAuthLinkedIn

    +
    +
    +
    +
    property microsoft

    configuration for using microsoft as the identity provider

    @@ -1586,6 +2113,65 @@
    +
    +
    +property twitch
    +

    configuration for using twitch as the identity provider

    +
    +
    Return type
    +

    EndpointOAuthTwitch

    +
    +
    +
    + +
    +
    +class ngrok.datatypes.EndpointOAuthTwitch(client, props)[source]
    +
    +
    +property client_id
    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property client_secret
    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property email_addresses
    +
    +
    Return type
    +

    Sequence[str]

    +
    +
    +
    +
    +
    +property email_domains
    +
    +
    Return type
    +

    Sequence[str]

    +
    +
    +
    +
    +
    +property scopes
    +
    +
    Return type
    +

    Sequence[str]

    +
    +
    +
    @@ -1656,7 +2242,7 @@

    Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.

    Return type
    -

    int

    +

    timedelta

    @@ -1848,7 +2434,7 @@

    Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.

    Return type
    -

    int

    +

    timedelta

    @@ -1982,7 +2568,7 @@

    Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.

    Return type
    -

    int

    +

    timedelta

    @@ -2081,7 +2667,7 @@
    property provider
    -

    a string indicating which webhook provider will be sending webhooks to this endpoint. Value must be one of the supported providers: SLACK, SNS, STRIPE, GITHUB, TWILIO, SHOPIFY, GITLAB, INTERCOM, SENDGRID, XERO, PAGERDUTY.

    +

    a string indicating which webhook provider will be sending webhooks to this endpoint. Value must be one of the supported providers defined at https://ngrok.com/docs/cloud-edge/modules/webhook

    Return type

    str

    @@ -3414,6 +4000,74 @@
    +
    +class ngrok.datatypes.IdentityProvider(client, props)[source]
    +
    +
    +property name
    +

    name of the identity provider (e.g. Google)

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property url
    +

    URL of the identity provider (e.g. https://accounts.google.com)

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +
    +class ngrok.datatypes.Location(client, props)[source]
    +
    +
    +property country_code
    +

    ISO country code

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property lat_long_radius_km
    +

    accuracy radius of the geographical coordinates

    +
    +
    Return type
    +

    int

    +
    +
    +
    +
    +
    +property latitude
    +

    geographical latitude

    +
    +
    Return type
    +

    float

    +
    +
    +
    +
    +
    +property longitude
    +

    geographical longitude

    +
    +
    Return type
    +

    float

    +
    +
    +
    +
    +
    class ngrok.datatypes.Ref(client, props)[source]
    @@ -3925,7 +4579,7 @@
    property acl
    -

    optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the bind rule. The bind rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule bind:example.ngrok.io. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of bind:*.example.com which will allow x.example.com, y.example.com, *.example.com, etc. A rule of '*' is equivalent to no acl at all and will explicitly permit all actions.

    +

    optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the bind rule. The bind rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule bind:example.ngrok.io. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of bind:*.example.com which will allow x.example.com, y.example.com, *.example.com, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of bind:*=example which will allow x=example, y=example, etc. A rule of '*' is equivalent to no acl at all and will explicitly permit all actions.

    Return type

    Sequence[str]

    @@ -3977,6 +4631,16 @@
    +
    +property owner_id
    +

    If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot.

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    property public_key

    the PEM-encoded public key of the SSH keypair that will be used to authenticate

    @@ -4227,7 +4891,7 @@
    property critical_options
    -

    A map of critical options included in the certificate. Only two critical options are currently defined by OpenSSH: force-command and source-address. See the OpenSSH certificate protocol spec <https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.certkeys>`_ for additional details.

    +

    A map of critical options included in the certificate. Only two critical options are currently defined by OpenSSH: force-command and source-address. See the OpenSSH certificate protocol spec for additional details.

    Return type

    Mapping[str, str]

    @@ -4251,7 +4915,7 @@
    property extensions
    -

    A map of extensions included in the certificate. Extensions are additional metadata that can be interpreted by the SSH server for any purpose. These can be used to permit or deny the ability to open a terminal, do port forwarding, x11 forwarding, and more. If unspecified, the certificate will include limited permissions with the following extension map: {"permit-pty": "", "permit-user-rc": ""} OpenSSH understands a number of predefined extensions. See the OpenSSH certificate protocol spec <https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.certkeys>`_ for additional details.

    +

    A map of extensions included in the certificate. Extensions are additional metadata that can be interpreted by the SSH server for any purpose. These can be used to permit or deny the ability to open a terminal, do port forwarding, x11 forwarding, and more. If unspecified, the certificate will include limited permissions with the following extension map: {"permit-pty": "", "permit-user-rc": ""} OpenSSH understands a number of predefined extensions. See the OpenSSH certificate protocol spec for additional details.

    Return type

    Mapping[str, str]

    @@ -4518,7 +5182,7 @@
    property certificate_pem
    -

    chain of PEM-encoded certificates, leaf first. See Certificate Bundles <https://ngrok.com/docs/api#tls-certificates-pem>`_.

    +

    chain of PEM-encoded certificates, leaf first. See Certificate Bundles.

    Return type

    str

    @@ -4991,7 +5655,7 @@
    property metadata
    -

    user-supplied metadata for the tunnel defined in the ngrok configuration file. See the tunnel metadata configuration option <https://ngrok.com/docs#tunnel-definitions-metadata>`_ In API version 0, this value was instead pulled from the top-level metadata configuration option <https://ngrok.com/docs#config_metadata>`_.

    +

    user-supplied metadata for the tunnel defined in the ngrok configuration file. See the tunnel metadata configuration option In API version 0, this value was instead pulled from the top-level metadata configuration option.

    Return type

    str

    @@ -5338,6 +6002,70 @@
    +
    +class ngrok.datatypes.UserAgent(client, props)[source]
    +
    +
    +property browser_name
    +

    browser name (e.g. Chrome)

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property browser_version
    +

    browser version (e.g. 102)

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property device_type
    +

    type of device (e.g. Desktop)

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property os_name
    +

    operating system name (e.g. MacOS)

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property os_version
    +

    operating system version (e.g. 10.15.7)

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    +property raw
    +

    raw User-Agent request header

    +
    +
    Return type
    +

    str

    +
    +
    +
    +
    +
    class ngrok.datatypes.WeightedBackend(client, props)[source]
    diff --git a/docs/edge_route_backend_module.html b/docs/edge_route_backend_module.html index 5b7fa4a..c8547f1 100644 --- a/docs/edge_route_backend_module.html +++ b/docs/edge_route_backend_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/edge_route_circuit_breaker_module.html b/docs/edge_route_circuit_breaker_module.html index 69c1df8..a80e2d5 100644 --- a/docs/edge_route_circuit_breaker_module.html +++ b/docs/edge_route_circuit_breaker_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/edge_route_compression_module.html b/docs/edge_route_compression_module.html index 74e1846..8aa455c 100644 --- a/docs/edge_route_compression_module.html +++ b/docs/edge_route_compression_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/edge_route_ip_restriction_module.html b/docs/edge_route_ip_restriction_module.html index d4af095..e1327e9 100644 --- a/docs/edge_route_ip_restriction_module.html +++ b/docs/edge_route_ip_restriction_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/edge_route_o_auth_module.html b/docs/edge_route_o_auth_module.html index b86e3b0..f834c36 100644 --- a/docs/edge_route_o_auth_module.html +++ b/docs/edge_route_o_auth_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/edge_route_oidc_module.html b/docs/edge_route_oidc_module.html index a139a27..51993e7 100644 --- a/docs/edge_route_oidc_module.html +++ b/docs/edge_route_oidc_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/edge_route_request_headers_module.html b/docs/edge_route_request_headers_module.html index 556156f..bc25465 100644 --- a/docs/edge_route_request_headers_module.html +++ b/docs/edge_route_request_headers_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/edge_route_response_headers_module.html b/docs/edge_route_response_headers_module.html index 9619cc7..33dfcba 100644 --- a/docs/edge_route_response_headers_module.html +++ b/docs/edge_route_response_headers_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/edge_route_saml_module.html b/docs/edge_route_saml_module.html index d3dedfe..ec599cf 100644 --- a/docs/edge_route_saml_module.html +++ b/docs/edge_route_saml_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/edge_route_webhook_verification_module.html b/docs/edge_route_webhook_verification_module.html index e769934..d8cbc08 100644 --- a/docs/edge_route_webhook_verification_module.html +++ b/docs/edge_route_webhook_verification_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/edge_route_websocket_tcp_converter_module.html b/docs/edge_route_websocket_tcp_converter_module.html index 8496e66..9172810 100644 --- a/docs/edge_route_websocket_tcp_converter_module.html +++ b/docs/edge_route_websocket_tcp_converter_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/edges_https.html b/docs/edges_https.html index ee8f54e..e5699b9 100644 --- a/docs/edges_https.html +++ b/docs/edges_https.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/edges_https_routes.html b/docs/edges_https_routes.html index 87aaa4a..0b86e0c 100644 --- a/docs/edges_https_routes.html +++ b/docs/edges_https_routes.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/edges_tcp.html b/docs/edges_tcp.html index 06de46b..8c29bb6 100644 --- a/docs/edges_tcp.html +++ b/docs/edges_tcp.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/edges_tls.html b/docs/edges_tls.html index 6619b03..6be326b 100644 --- a/docs/edges_tls.html +++ b/docs/edges_tls.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/endpoints.html b/docs/endpoints.html index 8f16b09..79216ae 100644 --- a/docs/endpoints.html +++ b/docs/endpoints.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/errors.html b/docs/errors.html index 087095f..b98376c 100644 --- a/docs/errors.html +++ b/docs/errors.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/event_destinations.html b/docs/event_destinations.html index 3a10e4d..d4670cf 100644 --- a/docs/event_destinations.html +++ b/docs/event_destinations.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • @@ -187,7 +189,7 @@
    create(metadata='', description='', format='', target=None)[source]
    -

    Create a new Event Destination. It will not apply to anything until it is associated with an Event Stream, and that Event Stream is associated with an Endpoint Config.

    +

    Create a new Event Destination. It will not apply to anything until it is associated with an Event Subscription.

    Parameters
    - +
    Previous
    -
    API Keys
    +
    Application Users
    diff --git a/docs/genindex.html b/docs/genindex.html index 0e53ce8..f9b091f 100644 --- a/docs/genindex.html +++ b/docs/genindex.html @@ -117,6 +117,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • @@ -227,8 +229,8 @@
  • (ngrok.datatypes.EndpointSAMLMutate property)
  • - - + @@ -355,26 +393,42 @@
  • Client (class in ngrok)
  • -
  • client_id() (ngrok.datatypes.EndpointOAuthFacebook property) +
  • client_id() (ngrok.datatypes.EndpointOAuthAmazon property)
  • -
  • client_secret() (ngrok.datatypes.EndpointOAuthFacebook property) +
  • client_secret() (ngrok.datatypes.EndpointOAuthAmazon property)
  • +
  • country_code() (ngrok.datatypes.Location property) +
  • create() (ngrok.services.AbuseReportsClient method)
  • msg() (ngrok.datatypes.ReservedDomainCertJob property) @@ -1522,6 +1668,12 @@

    N

    @@ -1687,6 +1855,8 @@
  • -
  • public_url() (ngrok.datatypes.Endpoint property) +
  • public_url() (ngrok.datatypes.ApplicationSession property)
  • @@ -1713,6 +1885,8 @@

    R

    + -
    diff --git a/docs/http_response_backends.html b/docs/http_response_backends.html index ca58bd8..05e5512 100644 --- a/docs/http_response_backends.html +++ b/docs/http_response_backends.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/https_edge_mutual_tls_module.html b/docs/https_edge_mutual_tls_module.html index 2ae1e04..0ea6dda 100644 --- a/docs/https_edge_mutual_tls_module.html +++ b/docs/https_edge_mutual_tls_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/https_edge_tls_termination_module.html b/docs/https_edge_tls_termination_module.html index 2b580b7..c1c013a 100644 --- a/docs/https_edge_tls_termination_module.html +++ b/docs/https_edge_tls_termination_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/index.html b/docs/index.html index 0efd9a6..deb0d64 100644 --- a/docs/index.html +++ b/docs/index.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • @@ -292,6 +294,8 @@ section on Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/ip_policies.html b/docs/ip_policies.html index cbb3abd..829ef33 100644 --- a/docs/ip_policies.html +++ b/docs/ip_policies.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/ip_policy_rules.html b/docs/ip_policy_rules.html index ae79ce2..3976d3c 100644 --- a/docs/ip_policy_rules.html +++ b/docs/ip_policy_rules.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/ip_restrictions.html b/docs/ip_restrictions.html index 997f16e..f92f432 100644 --- a/docs/ip_restrictions.html +++ b/docs/ip_restrictions.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/objects.inv b/docs/objects.inv index 89f55fbbe2f8bfa32c7d9259833b92403a6c13f9..bc05fbe881fcd6ed39ce1bfbbaeed72212193b6b 100644 GIT binary patch delta 6603 zcmV;+88qhfFQGJ$d4EfD+&GfQ@AWAvV)yEb+3VcYa`#x<@{GdLOdlC67A>*OB5O&O zWc8HkNxHS@8|k-E%W`~_IcCPO?!Ch&gFlp zA3y!~{?o3K4<2sIBCk66d{(AyyZ@hk*8id&x1T$t$7`D>O@Dr=o38D(GQW$29wqSEm4pEN{BvyHuAa z=~YNHMOTE>PS)fn@&83y1_C_-{r}~^0 zAsXBEC1JaE4?)~p3cl2BrxzhmTsC}AyenH&@>*4S34|;qxJBSs*%8R+@}F7WySsQ) z?;Wg15A`K)R4gn`2A>xCXWji)U#nAqo>SVT-TP&zsDH7?ntt_kTJzs;9`1h6-}Uax zlJyJ8=qXGj8b)Wl+jhVyFY_*kg{Pnc5-gi+7Zf6?{1Ftd-zw2QVC`Kkx=B#>dJ#XN zHGXXhO!B^HJIKYP;K3Qbgo#)A&n~%$0aU^&KlJv0Jl=@d9s24@svn%Rpvps2mpLGN zYxWpnrGM6h59wQ*q?s5@v~u`~IJ?Vhb5SLoh6R}4hI$EmGbzC)jEf*|AsYId3@-z?hme96U8fD}KDP-T`UNhIq+Q|79=(?hhkjvS@_Tpw%kB zP4CpFY3K`Sq8ty`G2o!WMBqaUgVT@vSqPx5>3`yIW78p3n{;XOoOdkO5FbR(awJTB z4uzt?VT^$Q0)Qru3~4O!13jICka%Mpn}#svX`e^+0Tx<04#1g8;+N@gZ0a}pZQ9Od zWD*%c%Y}iV%LU2FrWlxE5-JAj=cN!17N?$opy)z`Z_2S`SG>lks>}5#eiF^Ei~wuu zYkw3sh|-XeNJm1}XO?j^F96a^9_imh#KNjgO2>&UJ&7GydP*)j?ve{(wcUXrKMK3| z2Qk?(k9^%38e`6Mxe?bH5-O3c8&a7H)<$mC&hg3USENIV&D8UDmNOfuy+qq zIEmNBO%_1-RhumesE$#L(Jm(hHsL;rBhzM+uv~~4*Z3encq^Jj(Uv>`#Ft`M$h;ROvx;%-G+a?ozLyAX7 zOF?x#C&#O()9@ul53#AsvZ$Vux1u`LZ;_y#7@%F`4$f->OLyt|757Aq8)kXWxb(B|FH#R+~*UktZVjet$21@=!4<=TKDr3YfH8SDf?u+VObj^k;Dv-8{GNRJ2+h zE)fBuZAHIXU!PxiKy>ZUpxm6(zu>-CBOKIm1I7TAfT`WGF@XKL@3;np$1oQOZUv)& zZB}2HMf)wy@?)*e{-O398Ide%<09B}LdLYJ1&v|X2^qn%|0udI*MB3&u8I)JswOOg zO$T61iyFun_8fq9^PE=2U&Q%D5E#up4qcv}*`WKB>t})x&(Abi96yu5$bL2>Bl(#G z#&COc#*3^+vtf_zzta)ElKl0NZYqT~pB3abNMX>3FjA>O1 z8pEy=GJ<8l7Fkob^?&z{W7-K4$+iwJf^lbNOzYaz80MXs5$yY*eX6169T|so`eb95 z=kQ(oVBpi9i|$1YQlqfSG!|>>2KlVAZ}vr``akOppO5R_iZ0_#D?CjI)KL{7QV=p> z5hBn4j2V6mWQ^D|0GWa3?(;2bMj;x(ej0^oxSkYcwo#I}lYfnp5pk}u$F=R1F_R|| z(Pk?pEaqgT1o*D4mh<5If$kor#M`9vS>|yu3vK;)?S3&a&A=_ z6kc7KD0XF;I9_c%-h90Wt4N9-(z2}IM1;H~MOAc#+yTQW%0ZMuu0qvSl8KkRp8I2- z&1;e6oQ+8et$&uZ{>o2@ct&Th@Yzh>u zi|KK(`UeFYUXbmVa&LWcN<`(KQ{MYU?6P`ZqvCSX7SEO3mZL8a14m^Hb}N8oE>GDB zt8(j*wG2K3Vn?%)8Z+>WYxS|hPn@NBjT9+}jC*4ug@2L}7d4;^(3oLmKt_uR121A^ zc)EXl%A50$of2$wCWPyK7ESykc@;w=hAAv!H~c$i?Cv#@H{GwpHg$IGDOB7#9GDSm z@{j!ZB4X8l(y};lJjUU0U)Tk5cayk8-Z#JCwYA({`*izoTUWvm9Xx+ZvfwI|31dIc zDQZK@WPgcs&WzY7>_iuVfzNe0EHH@Mn1XF4{D6rKQi-J47-Wy9#Xz>b5{R|5%P5w& zAC@AboX0*ZG*VSc5<48D$@2=1+If~fP|roJmODrk^fdLqq1B}% z4_R4XPj6|Ly~r7umQjeq_oB&P>Ne*veiT*S7Mx<-PA_ynybo40Ca0geiB_tEsA@F> zgd`x=u)k?lj=knc;J)C*5y86<9~JLO+lemW%zVM$XMe!nZvb##Z^Ym)^;=q$wWt{E zY-6t_O<%48aPV&1CSjenOM$y=8x`Kg+61(NwK-Ty3x^WkMOX-+XC(-+e2?FiQa}Ln z<>~2RTua4TCqXzI>(hILk}z5*MZ;PtO@do0g?pJ7>A9%zhEGw@#!s6@;j=);DlI67PfzTgjPP&ru27O9shP=F2t1}nhFc2O~ z26;wX0OQ6aD<11EZQ@?V7Yt&Di5bNKd>a#mBQ??sqe*`(N~SWLB*!_a4TokXHsO%? zK~RC1k#L0Y!=WPecTg5wtMLKGrHV}0Ie!JV-&2ePnc=oU+^DZGH8PE0Gm2BjM2y?9 z7=vbmriM6?aBX@nnFwa5G(fn4`0%Ed@#V$`wb_l|DBi}^_e7?+%k;JU5Gt6RY09RA z$I%IaMNmx~j-7K(s1q!T#)Aofx#%n&?wq46Fly38IhnK!4r|P0kQnmcuE9sTb$`)A znsGd^M`XpR;Q`o;G zra#dj#y4}E8dN))EUWS99JKYB3`XOAE5amj9TjTI zmi*$y_YjcTm~9*a8E$|AGXvP-(0^S^4g@%ea<5&86Hxw9?2y&hs%ze%b%F^}rt-$B z>N#oBQ*mvRA7>7#=&qcyh;l%LZ~6DYN)!@6z>-pc!wR3zo7enwGo&aFD(5VEKvJ9= z0KE4yFj(hhA>h8t;2<{C#L=$8fMCh%4FuDvfS$q@=f!o0)(k)NX(C!Sj(<_4&(oz4 zK zZv%)I;3fz=#Em5AUK0y~N6G=fjgNK^OcuMN8HjD~vjG zD3?g(`T9TWW32KCr>XKczRxg*Br_n+phV+M!xAvn6oCW^_W1ZE!d;{u3ZobF5wY&j zPlNkKA2Pge^O4Zz?&G1IrjIw=wIzxfi-=8Gduh>H0}wzKNW4h01b=SZmn714A4_V$ zQlr;x8nVcZno_e2)78Pq5%D%n7uQD# z{HjkEh?VL~-FCO;ltWl8Spd%b1x4e82^$8-3Kzr)7&Z-RsWyZ$OtDdnC}g9=H&c}r z7tFsM7$+jxFkdJAo_|C!2ORYrP>fc6c$JA{uq)!dw5td`C7*`HW&*+v&=ga;i9Bzh z`$`*$jg|7>;(L=7uq^;HU^_HUz;N*gVQ(acPo< zJr-!?nk27j>mYdw13EvbLy$7uKjNc6Q~1D4#%$B@R&9d7#%)9JHg1yoA=*j2m>d~h z+Z3_6Nd(%y1%HqiT|}s9bzw%5)#r0vCCKha3mC16;P7N(s=C7lD+K45f3F*E1#uUX zEu0t(6yh_fx}J~hcWkf6Kl4n~S1IaCo(_M_dzWYK;v}qDitN<@`-mf;m}q2vUY?Rpp`kB9suEcWMyNhvfR8xEPVXrOior zUkws~#(%2>%k-F+=xf7GR*8$@3jD&uEGv$J{6i*? z#S#{}08SU^!oc2;0^uE_OG8_U0pYY51H@}R21>b8j6#8(7Xd;8xK2U3G!nuL@D7gG zS<+0H1lLlmS5e(Q#|L>8@HmIj;5ry&526C94u8Gl$V6qvCQY1!hO0^b!jtC(sF6~) zJb6w>Ju9Bn-&Su?pJe8>zwO@! zVluv?l2U*FYc&cnm+BG%F4p2QkvQ2|P=UvDmK5Srfha1UFj`c;ZNR8-$Cy#+L?8?1&wmF7 z2|t)vOpPy1E5RMc1`rE>PdUsjH`Asa&zihpJvM*@x;~u_#x!y3_0F_ThHC(QBKH zsk^}9>0LMU2kT$9_6I9pH#u5>w!hSkwr!jAmy&LlrzY?qj>p!)9Li?F5NGxdq7ajJ zVVvGm+C@VtZwQ60SPg_On|~05F4z+!E}LZ&R5n_VRYYstDC;*u0K;470Svl|0|1`p z5ljUBEx9ZOU z48NTLme;xfi?%5M@>miedF{82bv;h|NBsuW9}4Cz7?a2K8P97o}hUoN_>w=m3ye^92{BDZzmRxm>NZ;2+j^Y+> zi9_*}FMos@!hgX(LXGVwAECo>o{vyMcoeE;>HLp%qgW8f>pCdU=OZYObOsbgTOFnO z%)5 z3^e5wF}S2t!~lDoVmo@cE@I_4;dmRx)`N0>DrLQhbbs4`5z*8{9Ejg^%xPkWoy=KN zv1owEs=U^StY^_Qfx3*G;Y5J6^Q?!FsJO@^QugE#9kcOpPVi&$h?o~b+!F4FMA4g@ zwU_F%P9!>IsYqzDO=0+L;cjFHx7YA+_d%+>)`+ZU(KL{*)s@u=zkQK#3B72QNGiP6 zh{RvCLVvK1Z7Zo0KXBP^Rmq}3qAT;7Cc36YBZX>nvLjQ&1C?#`Sw6MCwZV%d#|e?p zl&K@39m7WAxulV3HMxJ8hIx7ZFla_$69+h^A23L(t`aqx;G68s0t>q4IRS(Gu_IkDgx+n`L)cvJdJJwDXND1wqZXfp3 zaeBQ>!|7gIt9}++!yC-ek$X5sDIIT z+BoUBpH4>Z@}{ZH{!#rhJlFqQf2hAF%6d$UGsXvw7$7)uq_qw4ut!^v#=vtUZ(G^Nf+C0sub*|Wf ztkr2hn*Jn4oI7pjwDGL9p;~sV<2LM_wMmzf)A#RAvhVwT_wUZy5o*ahn?xds_>cD26|skRF&?c;$RUSMKZdW$zCNOu^*}FB*(85G3|w8XQxA))DQx%eOb z8Y zo8NA+uVX;^Gl%4{E}R%BF};> zHVC~Zby)pNL4WDOZJlR<#gtN_eiNr8J)LSq?o^%AJVayDye4ed?jVSJE5X;QY0V-8 zipxk-gW_$`ppw_J6h$I~R1;=kEx1MCR~3)dbK++vI(L_knnBum^iW+y-8ID|KUsWQ z=pR-4TXii@0eVhpo3`(lzM_VXWBk?AcT9i3dAR#synma$h$HJ4QqfbINH&btdbjO> zlPE+hVBs<7fCR@T+Xbaas(u8;+e-FxpzQS`e?qJ5TIZPLecrT?k0`;zY#0zGUW%V> za*+d(gjIg%?f-bZk-<0g)wNVNx@bU^hq@{RAbV?v{IF6R!iV%nlcbp(4K!*PmjG>L z&TE9Ml7H5~0?coHy@b7)lIp57N$c>Yr-shox{-6J=1GzhEe(q5nalJn8V&?7rXdYS zKZDW8AFr%;Kw7gUUU1ZZ>CJ%q!$24<8lg03wW@EtJN=0l`a*^%$HPqwI4ZCa_}IYW zbVGL*0%&WdINaDwNZBN9TEB>v4g8CKqvzQ5r^gA#qrk@u1*vL-M3Ei1H*~RgJu^P5Kh< zVI(&^7Ll09r9wj-2`ei(zI<*)9gTJr&s81APnzrTPm#4rR-Ml>kRrW4$;F~6jfxXG zfPd)f!)%)6K(joC zJlLoW0LKH725bp?*H*$wyasBs0K%{RQcPfV3}TE%H6pO@kWpN%J;B22`*fK4fB@kQ zaTGS})_GUNjN7E_COEQSZDu#F01i)g2A{!Fx z^?KU0%OgL*uL%rcO;OJloKOmD@M@75^0Hd5Y4LRb2-e3aAM0a$4rV&g2x2+4Lm}Um z<&&-g=3D<0Se>?H59+Ow>{Vpn6My-esNd3pRhUCoRo`=w$ng7||Ky=!RL&tU)2z+k zl-=6=EUIhEk$*MLi zf=zp1Op98`820ReRsE8d`G1I=x*#x`dmLJko|&MkdMO0U&pJXZKeJ#l{7eI*`k9H0 z;%6Ed!7aY#SzR^NbIUR42#I9V883oaCuU5`y3`oPotP2q`(O+jQ1cFq!?Q7XV3+9d zlDDtA!-~KfgA$*0Hk$;5yMOz9i`KUkjnIe;3bW~Sq$uNlMdA+o6(i!Pzr!`nl`*DP zh-lvp3KsLTLGgGoC1HhIa)aU;EJJ{xI2-o`@n*2xdCWl50Q#i!7|F>Z5v$2sk?XUfYF?Q`~RNOl3nGtI8 z4{>~zvFcxGk)JpoGvjbycn;*Q>&%I~Z+^*ZDz(w&>Gt8aDu1ORT6q45WWiOaQc`@L zl3;|E$r0!5-gHse#%KZqZ;zg_z##5oa<-Z9t)4DOpLAnmklhvz1KEH=Al4GQpjh6{ z6pDy)9=p6VNL6V`Y@4bf&nq};=SliNW!?cWy!ZGfE=9_*Ll0n>!^k8A6~mC{MsAD6 z2;B~c7rR{;FMlFfG%$u+3|0`gNUR27g5V}$K;Q=MFjn(r!C-zYpCM7u)7bxpR+pAM zWJPs7{YcyFRn5ROj6xiq^IE)Cjo>i8=cQCW`Yp|iN>&VZ z%EpnV(>DSfyxVq3Sf@Rwz+JYB3h!cF0@}g49PDuEj1t~OI0&F;B?z&6kKdJ2KmhaQ z>FHruOT}6zK{y<%(|d%HFj^=@!&)g#f?Fzudz}{Pxv21lPf^guPqB2Ss3faSQK}w` zCnPCKYm-t65`T|!%s8MKckqrS#e$TWh> z$WIv)F>J?T44N&P9^yp8HR-uvBAA_058(#l!w^OMC)Z#-z5*CHq#5)MDnQH{kyBW=W z5MR8<2jN9&`Xdcue6z=?LA7JZvKpVsL0g~AU^G7yB+72@^@&Hxx$>Nj#suLl*`y#} z5jKJAs8CaOZ#{??;6?~L z#D5JWD4(FDIPTa=))XR^AemG1v^~o{7r>Bb$bdj@SlSp$7soVV~x=#%+!LII!*m& zb&OR$=`^MI!S@-)kYobH8I%~j#an(cB!5t_$Hy-bE^zWt7`>p6h;@g48r(1Xkl}rs zkAyaN9}n#`eZ2mT1K=`F9}%0N^wOfW1|Wbeka&?~3B2|CZ>Acs)aV^WmMn5jkqzL* zB<^KJE`t?+I9C?g@|@T(QFsx7dx4R|U^*$-<|E!eG{<%A8^0WB4#Y~OE{(mlCw~jV zYRLg`W*#USr-8dLxRuXAoTl#5p!V)U7y}F!#fTp+N`CE>S$@I%dj{h~Bp2rEUXcuC z1RjohGf<3HeRxv|Kd>7yy|k+gJq4eJ#byG+4$u@+xry2rZu&|SiH()=|K*n=D_}bS zX271&I01VOljGeiEs_d5B~2jVK7U{i;`9M7t-I^DiS&+81al#b4#h<=IusYh>QH7d zPKV;cB6lb*9_~GlCQ{MAdL zXF3LPyssDtSTvuc;SfF`;4@ps{(7$Kui`4SOum$_+_g(|r2vOh*~ADG9V@>e6y#Gz zOTnKq_uM2H0|6fGus>z)ndvVEKn~X)^Hb)Ymq25bhtp>a1ZMJ!0e=IBPxzba9!+~; zNU|g4^i5TOxid@%Qif|;iqIVmS_sY$)QbLa(qP$3H019p(I=KzZVupdfpZwx8&V*= zW1Q2_R$@UoEye=zT7Qp)((V+aP+;dpfY1PLQjji-bG`hGHZJ!&OyV~D1YI}^8(aBsT!UMM(f;W|3p;0^g0?cT)MBbtT}1WNUX$X{Niov}fYBMo;ME`J9fS-B)^ST(1>V=5OF z9-&+U8e?1zHg1_w*ggj|O@a{1_xKH+0&d3i7whV`s7@-U(qHyJdSWuXqn6Tt|1=jq z+&tX4AL4XYgVhfoQTeVbM1{{>BPyM6m05tn1q(eX; z%JL9sW@3mkwNy1dP2U3WMQ82bP~XnA0TC3f7~umHE?DLRw5^y6 z*Qjq?2r->~M?(x%tH%2Pm5b*40DY?l1a&^%e7)abHgy*U%v`Y#kG)_B9(bk3gW!MY z3poB|+`qA*(y41ZVyRrQ$%m?5FxiLdU9l)vw|~A5<>~g}cDM~?n~kY^RO0DfH}nVV zU$*uKD_=J`T7agz5QnyHlXMrlZI-7d@F0%I*1;UgX2Foz>>WfQChx*Hou@R5hSJ^; z3R|%n2wgTI2wkuzNL)6{Ca7w(9;?XKxKY+`gaC%O&I1^96$b!3%_V@~waGf;-W$o< zqJP;ayI_j#48JM1Gd!l)4)B>`JHc;?B}Tugp9)sPpSB9mD3$SRL z0w9ki0g~5#+gR7*xI@oxK=Yws-hwfCTz|h|d0dZ?c~GChc~rmgH*tSU^P-X;KK)uQ z;Q-J56V490%`D3JY$joNHq$ja8#psKn@AXYJ5!D0hgn9yxz!MUno(pxDZ9sm6Alm$ z?s`Hz^2{aTp$Xpr;N6+nuifEhIiU5;VNF-oC(}XbwTY8uyw9Ss)ljyLt%I6);(zIp z8lI-J;v3B3oGy=`XvIJupm4!dAE0f;Xn`90`$5V5pvIMwo8_r!3ULT4LLApP5M&k( zAqo-s0yy0jt_xP`ubU0QEEx;IE!Ygf`AmnfycR@Y3x-_B8QXDaYnm6125~&*#Cfzm zaUNk%97b6br_myx)`Zq{C^&pMIll%*n} z$u@=Iw}rcb9o$~S!`%m|@>(OZo<-9@x>i?KNBs6h!X@;gRU)bIS|bvF(F(yjwymU& z{J>?uRV9lCiLT6Rn&_GqjTEYFma&u?9_S2!FY2lFtqoozIZlX#rhiNw2|Y7xB<_3& z5eZC;4vveEAkLq^CTj;}f~n6C~on(AZHIwG)Xt4lnZ->w^ZUQ=!q^w@5zw8vO} zaVJF~QG8Fz!ObixB(a%9EMha=nr8!N#$Xc(_gr9Fnf&%md-~g{%J!eA6o30JG2p(> z47hVr##ypNHo1M5ihpiD=AzpTc@Zr^GgspN=HYIyax3mUs}82*(!#{vya~`)>eyx4 zkxh)QLoL<)duPmvTTePu<@^423}dc+H|Fg$1?^;>`_IFF?z}mpOzGvsQu}V#*S@>w zr#rs3A2Rjok;`s1%aKRdLQ15$&OY7M29@#&=#{eKWTrw0jr73u{lNWL#^L;+^|W=Ua6cYG+=;rbYWvadm;Sl#-{wQzH7U+xvP&NxoSkN~ z$n;saeRt$$Z=RRiS;wm84D-BIFW#Tj+7V}R2>IEOoqvI1{$V#e@?nzb^C0`-K*`Vt zHaj^2$;*@YY1iNItCqS`|J>2X2u!652Mszmo8rucGd z+#X#EQx>K|rOB8Q8MICn+mnqt?FO!&S9ec+`J?kYoMb!p;YNFRxdU_=QpMsD&Q=&Mt5@@zh#c7g6kbpx1(2lD{7ME_hZCiwhYfeyJV?E&h5~ zkM%3F`je7*oL`x1CbcZZ_)(Q7!jqGimKN{q=J0XcO_NR?qI;#yoMp|Z4U}O%Za3VB dH5ik#o^N)u`43Zqo*dZ^vnx|+{|iAbuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/reserved_addrs.html b/docs/reserved_addrs.html index fccc132..fa21aff 100644 --- a/docs/reserved_addrs.html +++ b/docs/reserved_addrs.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/reserved_domains.html b/docs/reserved_domains.html index daa13cf..d4665ba 100644 --- a/docs/reserved_domains.html +++ b/docs/reserved_domains.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • @@ -190,12 +192,13 @@ that you own by creating a CNAME record specified in the returned resource. This CNAME record points traffic for that domain to ngrok’s edge servers.

    -create(name, region='', description='', metadata='', certificate_id=None, certificate_management_policy=None)[source]
    +create(name='', domain='', region='', description='', metadata='', certificate_id=None, certificate_management_policy=None)[source]

    Create a new reserved domain.

    Parameters
    • name (str) – the domain name to reserve. It may be a full domain name like app.example.com. If the name does not contain a ‘.’ it will reserve that subdomain on ngrok.io.

    • +
    • domain (str) – hostname of the reserved domain

    • region (str) – reserve the domain in this geographic ngrok datacenter. Optional, default is us. (au, eu, ap, us, jp, in, sa)

    • description (str) – human-readable description of what this reserved domain will be used for

    • metadata (str) – arbitrary user-defined machine-readable data of this reserved domain. Optional, max 4096 bytes.

    • diff --git a/docs/search.html b/docs/search.html index d383687..3034647 100644 --- a/docs/search.html +++ b/docs/search.html @@ -116,6 +116,8 @@
    • Abuse Reports
    • Agent Ingresses
    • API Keys
    • +
    • Application Sessions
    • +
    • Application Users
    • Failover Backends
    • HTTP Response Backends
    • Tunnel Group Backends
    • diff --git a/docs/searchindex.js b/docs/searchindex.js index 604fa49..bbb565f 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["abuse_reports","agent_ingresses","api_keys","certificate_authorities","client","credentials","datatypes","edge_route_backend_module","edge_route_circuit_breaker_module","edge_route_compression_module","edge_route_ip_restriction_module","edge_route_o_auth_module","edge_route_oidc_module","edge_route_request_headers_module","edge_route_response_headers_module","edge_route_saml_module","edge_route_webhook_verification_module","edge_route_websocket_tcp_converter_module","edges_https","edges_https_routes","edges_tcp","edges_tls","endpoints","errors","event_destinations","event_sources","event_subscriptions","failover_backends","http_response_backends","https_edge_mutual_tls_module","https_edge_tls_termination_module","index","ip_policies","ip_policy_rules","ip_restrictions","reserved_addrs","reserved_domains","ssh_certificate_authorities","ssh_credentials","ssh_host_certificates","ssh_user_certificates","tcp_edge_backend_module","tcp_edge_ip_restriction_module","tls_certificates","tls_edge_backend_module","tls_edge_ip_restriction_module","tls_edge_mutual_tls_module","tls_edge_tls_termination_module","tunnel_group_backends","tunnel_sessions","tunnels","weighted_backends"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["abuse_reports.rst","agent_ingresses.rst","api_keys.rst","certificate_authorities.rst","client.rst","credentials.rst","datatypes.rst","edge_route_backend_module.rst","edge_route_circuit_breaker_module.rst","edge_route_compression_module.rst","edge_route_ip_restriction_module.rst","edge_route_o_auth_module.rst","edge_route_oidc_module.rst","edge_route_request_headers_module.rst","edge_route_response_headers_module.rst","edge_route_saml_module.rst","edge_route_webhook_verification_module.rst","edge_route_websocket_tcp_converter_module.rst","edges_https.rst","edges_https_routes.rst","edges_tcp.rst","edges_tls.rst","endpoints.rst","errors.rst","event_destinations.rst","event_sources.rst","event_subscriptions.rst","failover_backends.rst","http_response_backends.rst","https_edge_mutual_tls_module.rst","https_edge_tls_termination_module.rst","index.rst","ip_policies.rst","ip_policy_rules.rst","ip_restrictions.rst","reserved_addrs.rst","reserved_domains.rst","ssh_certificate_authorities.rst","ssh_credentials.rst","ssh_host_certificates.rst","ssh_user_certificates.rst","tcp_edge_backend_module.rst","tcp_edge_ip_restriction_module.rst","tls_certificates.rst","tls_edge_backend_module.rst","tls_edge_ip_restriction_module.rst","tls_edge_mutual_tls_module.rst","tls_edge_tls_termination_module.rst","tunnel_group_backends.rst","tunnel_sessions.rst","tunnels.rst","weighted_backends.rst"],objects:{"":{ngrok:[23,0,0,"-"]},"ngrok.Client":{abuse_reports:[4,2,1,""],agent_ingresses:[4,2,1,""],api_keys:[4,2,1,""],backends:[4,2,1,""],certificate_authorities:[4,2,1,""],credentials:[4,2,1,""],edge_modules:[4,2,1,""],edges:[4,2,1,""],endpoints:[4,2,1,""],event_destinations:[4,2,1,""],event_sources:[4,2,1,""],event_subscriptions:[4,2,1,""],ip_policies:[4,2,1,""],ip_policy_rules:[4,2,1,""],ip_restrictions:[4,2,1,""],reserved_addrs:[4,2,1,""],reserved_domains:[4,2,1,""],ssh_certificate_authorities:[4,2,1,""],ssh_credentials:[4,2,1,""],ssh_host_certificates:[4,2,1,""],ssh_user_certificates:[4,2,1,""],tls_certificates:[4,2,1,""],tunnel_sessions:[4,2,1,""],tunnels:[4,2,1,""]},"ngrok.Error":{operation_id:[23,2,1,""]},"ngrok.datatypes":{APIKey:[6,1,1,""],APIKeyList:[6,1,1,""],AWSAuth:[6,1,1,""],AWSCredentials:[6,1,1,""],AWSRole:[6,1,1,""],AbuseReport:[6,1,1,""],AbuseReportHostname:[6,1,1,""],AgentIngress:[6,1,1,""],AgentIngressList:[6,1,1,""],CertificateAuthority:[6,1,1,""],CertificateAuthorityList:[6,1,1,""],Credential:[6,1,1,""],CredentialList:[6,1,1,""],Endpoint:[6,1,1,""],EndpointBackend:[6,1,1,""],EndpointBackendMutate:[6,1,1,""],EndpointCircuitBreaker:[6,1,1,""],EndpointCompression:[6,1,1,""],EndpointIPPolicy:[6,1,1,""],EndpointIPPolicyMutate:[6,1,1,""],EndpointList:[6,1,1,""],EndpointMutualTLS:[6,1,1,""],EndpointMutualTLSMutate:[6,1,1,""],EndpointOAuth:[6,1,1,""],EndpointOAuthFacebook:[6,1,1,""],EndpointOAuthGitHub:[6,1,1,""],EndpointOAuthGoogle:[6,1,1,""],EndpointOAuthMicrosoft:[6,1,1,""],EndpointOAuthProvider:[6,1,1,""],EndpointOIDC:[6,1,1,""],EndpointRequestHeaders:[6,1,1,""],EndpointResponseHeaders:[6,1,1,""],EndpointSAML:[6,1,1,""],EndpointSAMLMutate:[6,1,1,""],EndpointTLSTermination:[6,1,1,""],EndpointTLSTerminationAtEdge:[6,1,1,""],EndpointWebhookValidation:[6,1,1,""],EndpointWebsocketTCPConverter:[6,1,1,""],EventDestination:[6,1,1,""],EventDestinationList:[6,1,1,""],EventSource:[6,1,1,""],EventSourceList:[6,1,1,""],EventSourceReplace:[6,1,1,""],EventSubscription:[6,1,1,""],EventSubscriptionList:[6,1,1,""],EventTarget:[6,1,1,""],EventTargetCloudwatchLogs:[6,1,1,""],EventTargetFirehose:[6,1,1,""],EventTargetKinesis:[6,1,1,""],FailoverBackend:[6,1,1,""],FailoverBackendList:[6,1,1,""],HTTPResponseBackend:[6,1,1,""],HTTPResponseBackendList:[6,1,1,""],HTTPSEdge:[6,1,1,""],HTTPSEdgeList:[6,1,1,""],HTTPSEdgeRoute:[6,1,1,""],IPPolicy:[6,1,1,""],IPPolicyList:[6,1,1,""],IPPolicyRule:[6,1,1,""],IPPolicyRuleList:[6,1,1,""],IPRestriction:[6,1,1,""],IPRestrictionList:[6,1,1,""],Ref:[6,1,1,""],ReservedAddr:[6,1,1,""],ReservedAddrList:[6,1,1,""],ReservedDomain:[6,1,1,""],ReservedDomainCertJob:[6,1,1,""],ReservedDomainCertPolicy:[6,1,1,""],ReservedDomainCertStatus:[6,1,1,""],ReservedDomainList:[6,1,1,""],SSHCertificateAuthority:[6,1,1,""],SSHCertificateAuthorityList:[6,1,1,""],SSHCredential:[6,1,1,""],SSHCredentialList:[6,1,1,""],SSHHostCertificate:[6,1,1,""],SSHHostCertificateList:[6,1,1,""],SSHUserCertificate:[6,1,1,""],SSHUserCertificateList:[6,1,1,""],TCPEdge:[6,1,1,""],TCPEdgeList:[6,1,1,""],TLSCertificate:[6,1,1,""],TLSCertificateList:[6,1,1,""],TLSCertificateSANs:[6,1,1,""],TLSEdge:[6,1,1,""],TLSEdgeList:[6,1,1,""],Tunnel:[6,1,1,""],TunnelGroupBackend:[6,1,1,""],TunnelGroupBackendList:[6,1,1,""],TunnelList:[6,1,1,""],TunnelSession:[6,1,1,""],TunnelSessionList:[6,1,1,""],WeightedBackend:[6,1,1,""],WeightedBackendList:[6,1,1,""]},"ngrok.datatypes.APIKey":{"delete":[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],id:[6,2,1,""],metadata:[6,2,1,""],token:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.APIKeyList":{keys:[6,2,1,""],next_page_uri:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.AWSAuth":{creds:[6,2,1,""],role:[6,2,1,""]},"ngrok.datatypes.AWSCredentials":{aws_access_key_id:[6,2,1,""],aws_secret_access_key:[6,2,1,""]},"ngrok.datatypes.AWSRole":{role_arn:[6,2,1,""]},"ngrok.datatypes.AbuseReport":{created_at:[6,2,1,""],hostnames:[6,2,1,""],id:[6,2,1,""],metadata:[6,2,1,""],status:[6,2,1,""],uri:[6,2,1,""],urls:[6,2,1,""]},"ngrok.datatypes.AbuseReportHostname":{hostname:[6,2,1,""],status:[6,2,1,""]},"ngrok.datatypes.AgentIngress":{"delete":[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],domain:[6,2,1,""],id:[6,2,1,""],metadata:[6,2,1,""],ns_targets:[6,2,1,""],region_domains:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.AgentIngressList":{ingresses:[6,2,1,""],next_page_uri:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.CertificateAuthority":{"delete":[6,2,1,""],ca_pem:[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],extended_key_usages:[6,2,1,""],id:[6,2,1,""],key_usages:[6,2,1,""],metadata:[6,2,1,""],not_after:[6,2,1,""],not_before:[6,2,1,""],subject_common_name:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.CertificateAuthorityList":{certificate_authorities:[6,2,1,""],next_page_uri:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.Credential":{"delete":[6,2,1,""],acl:[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],id:[6,2,1,""],metadata:[6,2,1,""],token:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.CredentialList":{credentials:[6,2,1,""],next_page_uri:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.Endpoint":{created_at:[6,2,1,""],domain:[6,2,1,""],edge:[6,2,1,""],hostport:[6,2,1,""],id:[6,2,1,""],metadata:[6,2,1,""],proto:[6,2,1,""],public_url:[6,2,1,""],region:[6,2,1,""],tcp_addr:[6,2,1,""],tunnel:[6,2,1,""],type:[6,2,1,""],updated_at:[6,2,1,""]},"ngrok.datatypes.EndpointBackend":{backend:[6,2,1,""],enabled:[6,2,1,""]},"ngrok.datatypes.EndpointBackendMutate":{backend_id:[6,2,1,""],enabled:[6,2,1,""]},"ngrok.datatypes.EndpointCircuitBreaker":{enabled:[6,2,1,""],error_threshold_percentage:[6,2,1,""],num_buckets:[6,2,1,""],rolling_window:[6,2,1,""],tripped_duration:[6,2,1,""],volume_threshold:[6,2,1,""]},"ngrok.datatypes.EndpointCompression":{enabled:[6,2,1,""]},"ngrok.datatypes.EndpointIPPolicy":{enabled:[6,2,1,""],ip_policies:[6,2,1,""]},"ngrok.datatypes.EndpointIPPolicyMutate":{enabled:[6,2,1,""],ip_policy_ids:[6,2,1,""]},"ngrok.datatypes.EndpointList":{endpoints:[6,2,1,""],next_page_uri:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.EndpointMutualTLS":{certificate_authorities:[6,2,1,""],enabled:[6,2,1,""]},"ngrok.datatypes.EndpointMutualTLSMutate":{certificate_authority_ids:[6,2,1,""],enabled:[6,2,1,""]},"ngrok.datatypes.EndpointOAuth":{auth_check_interval:[6,2,1,""],cookie_prefix:[6,2,1,""],enabled:[6,2,1,""],inactivity_timeout:[6,2,1,""],maximum_duration:[6,2,1,""],options_passthrough:[6,2,1,""],provider:[6,2,1,""]},"ngrok.datatypes.EndpointOAuthFacebook":{client_id:[6,2,1,""],client_secret:[6,2,1,""],email_addresses:[6,2,1,""],email_domains:[6,2,1,""],scopes:[6,2,1,""]},"ngrok.datatypes.EndpointOAuthGitHub":{client_id:[6,2,1,""],client_secret:[6,2,1,""],email_addresses:[6,2,1,""],email_domains:[6,2,1,""],organizations:[6,2,1,""],scopes:[6,2,1,""],teams:[6,2,1,""]},"ngrok.datatypes.EndpointOAuthGoogle":{client_id:[6,2,1,""],client_secret:[6,2,1,""],email_addresses:[6,2,1,""],email_domains:[6,2,1,""],scopes:[6,2,1,""]},"ngrok.datatypes.EndpointOAuthMicrosoft":{client_id:[6,2,1,""],client_secret:[6,2,1,""],email_addresses:[6,2,1,""],email_domains:[6,2,1,""],scopes:[6,2,1,""]},"ngrok.datatypes.EndpointOAuthProvider":{facebook:[6,2,1,""],github:[6,2,1,""],google:[6,2,1,""],microsoft:[6,2,1,""]},"ngrok.datatypes.EndpointOIDC":{client_id:[6,2,1,""],client_secret:[6,2,1,""],cookie_prefix:[6,2,1,""],enabled:[6,2,1,""],inactivity_timeout:[6,2,1,""],issuer:[6,2,1,""],maximum_duration:[6,2,1,""],options_passthrough:[6,2,1,""],scopes:[6,2,1,""]},"ngrok.datatypes.EndpointRequestHeaders":{add:[6,2,1,""],enabled:[6,2,1,""],remove:[6,2,1,""]},"ngrok.datatypes.EndpointResponseHeaders":{add:[6,2,1,""],enabled:[6,2,1,""],remove:[6,2,1,""]},"ngrok.datatypes.EndpointSAML":{allow_idp_initiated:[6,2,1,""],assertion_consumer_service_url:[6,2,1,""],authorized_groups:[6,2,1,""],cookie_prefix:[6,2,1,""],enabled:[6,2,1,""],entity_id:[6,2,1,""],force_authn:[6,2,1,""],idp_metadata:[6,2,1,""],inactivity_timeout:[6,2,1,""],maximum_duration:[6,2,1,""],metadata_url:[6,2,1,""],nameid_format:[6,2,1,""],options_passthrough:[6,2,1,""],request_signing_certificate_pem:[6,2,1,""],single_logout_url:[6,2,1,""]},"ngrok.datatypes.EndpointSAMLMutate":{allow_idp_initiated:[6,2,1,""],authorized_groups:[6,2,1,""],cookie_prefix:[6,2,1,""],enabled:[6,2,1,""],force_authn:[6,2,1,""],idp_metadata:[6,2,1,""],inactivity_timeout:[6,2,1,""],maximum_duration:[6,2,1,""],nameid_format:[6,2,1,""],options_passthrough:[6,2,1,""]},"ngrok.datatypes.EndpointTLSTermination":{enabled:[6,2,1,""],min_version:[6,2,1,""],terminate_at:[6,2,1,""]},"ngrok.datatypes.EndpointTLSTerminationAtEdge":{enabled:[6,2,1,""],min_version:[6,2,1,""]},"ngrok.datatypes.EndpointWebhookValidation":{enabled:[6,2,1,""],provider:[6,2,1,""],secret:[6,2,1,""]},"ngrok.datatypes.EndpointWebsocketTCPConverter":{enabled:[6,2,1,""]},"ngrok.datatypes.EventDestination":{"delete":[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],format:[6,2,1,""],id:[6,2,1,""],metadata:[6,2,1,""],target:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.EventDestinationList":{event_destinations:[6,2,1,""],next_page_uri:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.EventSource":{type:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.EventSourceList":{sources:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.EventSourceReplace":{type:[6,2,1,""]},"ngrok.datatypes.EventSubscription":{"delete":[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],destinations:[6,2,1,""],id:[6,2,1,""],metadata:[6,2,1,""],sources:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.EventSubscriptionList":{event_subscriptions:[6,2,1,""],next_page_uri:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.EventTarget":{cloudwatch_logs:[6,2,1,""],firehose:[6,2,1,""],kinesis:[6,2,1,""]},"ngrok.datatypes.EventTargetCloudwatchLogs":{auth:[6,2,1,""],log_group_arn:[6,2,1,""]},"ngrok.datatypes.EventTargetFirehose":{auth:[6,2,1,""],delivery_stream_arn:[6,2,1,""]},"ngrok.datatypes.EventTargetKinesis":{auth:[6,2,1,""],stream_arn:[6,2,1,""]},"ngrok.datatypes.FailoverBackend":{"delete":[6,2,1,""],backends:[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],id:[6,2,1,""],metadata:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.FailoverBackendList":{backends:[6,2,1,""],next_page_uri:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.HTTPResponseBackend":{"delete":[6,2,1,""],body:[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],headers:[6,2,1,""],id:[6,2,1,""],metadata:[6,2,1,""],status_code:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.HTTPResponseBackendList":{backends:[6,2,1,""],next_page_uri:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.HTTPSEdge":{"delete":[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],hostports:[6,2,1,""],id:[6,2,1,""],metadata:[6,2,1,""],mutual_tls:[6,2,1,""],routes:[6,2,1,""],tls_termination:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.HTTPSEdgeList":{https_edges:[6,2,1,""],next_page_uri:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.HTTPSEdgeRoute":{"delete":[6,2,1,""],backend:[6,2,1,""],circuit_breaker:[6,2,1,""],compression:[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],edge_id:[6,2,1,""],id:[6,2,1,""],ip_restriction:[6,2,1,""],match:[6,2,1,""],match_type:[6,2,1,""],metadata:[6,2,1,""],oauth:[6,2,1,""],oidc:[6,2,1,""],request_headers:[6,2,1,""],response_headers:[6,2,1,""],saml:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""],webhook_verification:[6,2,1,""],websocket_tcp_converter:[6,2,1,""]},"ngrok.datatypes.IPPolicy":{"delete":[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],id:[6,2,1,""],metadata:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.IPPolicyList":{ip_policies:[6,2,1,""],next_page_uri:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.IPPolicyRule":{"delete":[6,2,1,""],action:[6,2,1,""],cidr:[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],id:[6,2,1,""],ip_policy:[6,2,1,""],metadata:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.IPPolicyRuleList":{ip_policy_rules:[6,2,1,""],next_page_uri:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.IPRestriction":{"delete":[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],enforced:[6,2,1,""],id:[6,2,1,""],ip_policies:[6,2,1,""],metadata:[6,2,1,""],type:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.IPRestrictionList":{ip_restrictions:[6,2,1,""],next_page_uri:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.Ref":{id:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.ReservedAddr":{"delete":[6,2,1,""],addr:[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],id:[6,2,1,""],metadata:[6,2,1,""],region:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.ReservedAddrList":{next_page_uri:[6,2,1,""],reserved_addrs:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.ReservedDomain":{"delete":[6,2,1,""],acme_challenge_cname_target:[6,2,1,""],certificate:[6,2,1,""],certificate_management_policy:[6,2,1,""],certificate_management_status:[6,2,1,""],cname_target:[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],domain:[6,2,1,""],id:[6,2,1,""],metadata:[6,2,1,""],region:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.ReservedDomainCertJob":{error_code:[6,2,1,""],msg:[6,2,1,""],retries_at:[6,2,1,""],started_at:[6,2,1,""]},"ngrok.datatypes.ReservedDomainCertPolicy":{authority:[6,2,1,""],private_key_type:[6,2,1,""]},"ngrok.datatypes.ReservedDomainCertStatus":{provisioning_job:[6,2,1,""],renews_at:[6,2,1,""]},"ngrok.datatypes.ReservedDomainList":{next_page_uri:[6,2,1,""],reserved_domains:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.SSHCertificateAuthority":{"delete":[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],id:[6,2,1,""],key_type:[6,2,1,""],metadata:[6,2,1,""],public_key:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.SSHCertificateAuthorityList":{next_page_uri:[6,2,1,""],ssh_certificate_authorities:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.SSHCredential":{"delete":[6,2,1,""],acl:[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],id:[6,2,1,""],metadata:[6,2,1,""],public_key:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.SSHCredentialList":{next_page_uri:[6,2,1,""],ssh_credentials:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.SSHHostCertificate":{"delete":[6,2,1,""],certificate:[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],id:[6,2,1,""],key_type:[6,2,1,""],metadata:[6,2,1,""],principals:[6,2,1,""],public_key:[6,2,1,""],ssh_certificate_authority_id:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""],valid_after:[6,2,1,""],valid_until:[6,2,1,""]},"ngrok.datatypes.SSHHostCertificateList":{next_page_uri:[6,2,1,""],ssh_host_certificates:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.SSHUserCertificate":{"delete":[6,2,1,""],certificate:[6,2,1,""],created_at:[6,2,1,""],critical_options:[6,2,1,""],description:[6,2,1,""],extensions:[6,2,1,""],id:[6,2,1,""],key_type:[6,2,1,""],metadata:[6,2,1,""],principals:[6,2,1,""],public_key:[6,2,1,""],ssh_certificate_authority_id:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""],valid_after:[6,2,1,""],valid_until:[6,2,1,""]},"ngrok.datatypes.SSHUserCertificateList":{next_page_uri:[6,2,1,""],ssh_user_certificates:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.TCPEdge":{"delete":[6,2,1,""],backend:[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],hostports:[6,2,1,""],id:[6,2,1,""],ip_restriction:[6,2,1,""],metadata:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.TCPEdgeList":{next_page_uri:[6,2,1,""],tcp_edges:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.TLSCertificate":{"delete":[6,2,1,""],certificate_pem:[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],extended_key_usages:[6,2,1,""],id:[6,2,1,""],issued_at:[6,2,1,""],issuer_common_name:[6,2,1,""],key_usages:[6,2,1,""],metadata:[6,2,1,""],not_after:[6,2,1,""],not_before:[6,2,1,""],private_key_type:[6,2,1,""],serial_number:[6,2,1,""],subject_alternative_names:[6,2,1,""],subject_common_name:[6,2,1,""],subject_country:[6,2,1,""],subject_locality:[6,2,1,""],subject_organization:[6,2,1,""],subject_organizational_unit:[6,2,1,""],subject_province:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.TLSCertificateList":{next_page_uri:[6,2,1,""],tls_certificates:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.TLSCertificateSANs":{dns_names:[6,2,1,""],ips:[6,2,1,""]},"ngrok.datatypes.TLSEdge":{"delete":[6,2,1,""],backend:[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],hostports:[6,2,1,""],id:[6,2,1,""],ip_restriction:[6,2,1,""],metadata:[6,2,1,""],mutual_tls:[6,2,1,""],tls_termination:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.TLSEdgeList":{next_page_uri:[6,2,1,""],tls_edges:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.Tunnel":{backends:[6,2,1,""],endpoint:[6,2,1,""],forwards_to:[6,2,1,""],id:[6,2,1,""],labels:[6,2,1,""],metadata:[6,2,1,""],proto:[6,2,1,""],public_url:[6,2,1,""],region:[6,2,1,""],started_at:[6,2,1,""],tunnel_session:[6,2,1,""]},"ngrok.datatypes.TunnelGroupBackend":{"delete":[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],id:[6,2,1,""],labels:[6,2,1,""],metadata:[6,2,1,""],tunnels:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.TunnelGroupBackendList":{backends:[6,2,1,""],next_page_uri:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.TunnelList":{next_page_uri:[6,2,1,""],tunnels:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.TunnelSession":{agent_version:[6,2,1,""],credential:[6,2,1,""],id:[6,2,1,""],ip:[6,2,1,""],metadata:[6,2,1,""],os:[6,2,1,""],region:[6,2,1,""],started_at:[6,2,1,""],transport:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.TunnelSessionList":{next_page_uri:[6,2,1,""],tunnel_sessions:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.WeightedBackend":{"delete":[6,2,1,""],backends:[6,2,1,""],created_at:[6,2,1,""],description:[6,2,1,""],id:[6,2,1,""],metadata:[6,2,1,""],update:[6,2,1,""],uri:[6,2,1,""]},"ngrok.datatypes.WeightedBackendList":{backends:[6,2,1,""],next_page_uri:[6,2,1,""],uri:[6,2,1,""]},"ngrok.services":{APIKeysClient:[2,1,1,""],AbuseReportsClient:[0,1,1,""],AgentIngressesClient:[1,1,1,""],CertificateAuthoritiesClient:[3,1,1,""],CredentialsClient:[5,1,1,""],EdgeRouteBackendModuleClient:[7,1,1,""],EdgeRouteCircuitBreakerModuleClient:[8,1,1,""],EdgeRouteCompressionModuleClient:[9,1,1,""],EdgeRouteIPRestrictionModuleClient:[10,1,1,""],EdgeRouteOAuthModuleClient:[11,1,1,""],EdgeRouteOIDCModuleClient:[12,1,1,""],EdgeRouteRequestHeadersModuleClient:[13,1,1,""],EdgeRouteResponseHeadersModuleClient:[14,1,1,""],EdgeRouteSAMLModuleClient:[15,1,1,""],EdgeRouteWebhookVerificationModuleClient:[16,1,1,""],EdgeRouteWebsocketTCPConverterModuleClient:[17,1,1,""],EdgesHTTPSClient:[18,1,1,""],EdgesHTTPSRoutesClient:[19,1,1,""],EdgesTCPClient:[20,1,1,""],EdgesTLSClient:[21,1,1,""],EndpointsClient:[22,1,1,""],EventDestinationsClient:[24,1,1,""],EventSourcesClient:[25,1,1,""],EventSubscriptionsClient:[26,1,1,""],FailoverBackendsClient:[27,1,1,""],HTTPResponseBackendsClient:[28,1,1,""],HTTPSEdgeMutualTLSModuleClient:[29,1,1,""],HTTPSEdgeTLSTerminationModuleClient:[30,1,1,""],IPPoliciesClient:[32,1,1,""],IPPolicyRulesClient:[33,1,1,""],IPRestrictionsClient:[34,1,1,""],ReservedAddrsClient:[35,1,1,""],ReservedDomainsClient:[36,1,1,""],SSHCertificateAuthoritiesClient:[37,1,1,""],SSHCredentialsClient:[38,1,1,""],SSHHostCertificatesClient:[39,1,1,""],SSHUserCertificatesClient:[40,1,1,""],TCPEdgeBackendModuleClient:[41,1,1,""],TCPEdgeIPRestrictionModuleClient:[42,1,1,""],TLSCertificatesClient:[43,1,1,""],TLSEdgeBackendModuleClient:[44,1,1,""],TLSEdgeIPRestrictionModuleClient:[45,1,1,""],TLSEdgeMutualTLSModuleClient:[46,1,1,""],TLSEdgeTLSTerminationModuleClient:[47,1,1,""],TunnelGroupBackendsClient:[48,1,1,""],TunnelSessionsClient:[49,1,1,""],TunnelsClient:[50,1,1,""],WeightedBackendsClient:[51,1,1,""]},"ngrok.services.APIKeysClient":{"delete":[2,2,1,""],create:[2,2,1,""],get:[2,2,1,""],list:[2,2,1,""],update:[2,2,1,""]},"ngrok.services.AbuseReportsClient":{create:[0,2,1,""],get:[0,2,1,""]},"ngrok.services.AgentIngressesClient":{"delete":[1,2,1,""],create:[1,2,1,""],get:[1,2,1,""],list:[1,2,1,""],update:[1,2,1,""]},"ngrok.services.CertificateAuthoritiesClient":{"delete":[3,2,1,""],create:[3,2,1,""],get:[3,2,1,""],list:[3,2,1,""],update:[3,2,1,""]},"ngrok.services.CredentialsClient":{"delete":[5,2,1,""],create:[5,2,1,""],get:[5,2,1,""],list:[5,2,1,""],update:[5,2,1,""]},"ngrok.services.EdgeRouteBackendModuleClient":{"delete":[7,2,1,""],get:[7,2,1,""],replace:[7,2,1,""]},"ngrok.services.EdgeRouteCircuitBreakerModuleClient":{"delete":[8,2,1,""],get:[8,2,1,""],replace:[8,2,1,""]},"ngrok.services.EdgeRouteCompressionModuleClient":{"delete":[9,2,1,""],get:[9,2,1,""],replace:[9,2,1,""]},"ngrok.services.EdgeRouteIPRestrictionModuleClient":{"delete":[10,2,1,""],get:[10,2,1,""],replace:[10,2,1,""]},"ngrok.services.EdgeRouteOAuthModuleClient":{"delete":[11,2,1,""],get:[11,2,1,""],replace:[11,2,1,""]},"ngrok.services.EdgeRouteOIDCModuleClient":{"delete":[12,2,1,""],get:[12,2,1,""],replace:[12,2,1,""]},"ngrok.services.EdgeRouteRequestHeadersModuleClient":{"delete":[13,2,1,""],get:[13,2,1,""],replace:[13,2,1,""]},"ngrok.services.EdgeRouteResponseHeadersModuleClient":{"delete":[14,2,1,""],get:[14,2,1,""],replace:[14,2,1,""]},"ngrok.services.EdgeRouteSAMLModuleClient":{"delete":[15,2,1,""],get:[15,2,1,""],replace:[15,2,1,""]},"ngrok.services.EdgeRouteWebhookVerificationModuleClient":{"delete":[16,2,1,""],get:[16,2,1,""],replace:[16,2,1,""]},"ngrok.services.EdgeRouteWebsocketTCPConverterModuleClient":{"delete":[17,2,1,""],get:[17,2,1,""],replace:[17,2,1,""]},"ngrok.services.EdgesHTTPSClient":{"delete":[18,2,1,""],create:[18,2,1,""],get:[18,2,1,""],list:[18,2,1,""],update:[18,2,1,""]},"ngrok.services.EdgesHTTPSRoutesClient":{"delete":[19,2,1,""],create:[19,2,1,""],get:[19,2,1,""],update:[19,2,1,""]},"ngrok.services.EdgesTCPClient":{"delete":[20,2,1,""],create:[20,2,1,""],get:[20,2,1,""],list:[20,2,1,""],update:[20,2,1,""]},"ngrok.services.EdgesTLSClient":{"delete":[21,2,1,""],create:[21,2,1,""],get:[21,2,1,""],list:[21,2,1,""],update:[21,2,1,""]},"ngrok.services.EndpointsClient":{get:[22,2,1,""],list:[22,2,1,""]},"ngrok.services.EventDestinationsClient":{"delete":[24,2,1,""],create:[24,2,1,""],get:[24,2,1,""],list:[24,2,1,""],update:[24,2,1,""]},"ngrok.services.EventSourcesClient":{"delete":[25,2,1,""],create:[25,2,1,""],get:[25,2,1,""],list:[25,2,1,""],update:[25,2,1,""]},"ngrok.services.EventSubscriptionsClient":{"delete":[26,2,1,""],create:[26,2,1,""],get:[26,2,1,""],list:[26,2,1,""],update:[26,2,1,""]},"ngrok.services.FailoverBackendsClient":{"delete":[27,2,1,""],create:[27,2,1,""],get:[27,2,1,""],list:[27,2,1,""],update:[27,2,1,""]},"ngrok.services.HTTPResponseBackendsClient":{"delete":[28,2,1,""],create:[28,2,1,""],get:[28,2,1,""],list:[28,2,1,""],update:[28,2,1,""]},"ngrok.services.HTTPSEdgeMutualTLSModuleClient":{"delete":[29,2,1,""],get:[29,2,1,""],replace:[29,2,1,""]},"ngrok.services.HTTPSEdgeTLSTerminationModuleClient":{"delete":[30,2,1,""],get:[30,2,1,""],replace:[30,2,1,""]},"ngrok.services.IPPoliciesClient":{"delete":[32,2,1,""],create:[32,2,1,""],get:[32,2,1,""],list:[32,2,1,""],update:[32,2,1,""]},"ngrok.services.IPPolicyRulesClient":{"delete":[33,2,1,""],create:[33,2,1,""],get:[33,2,1,""],list:[33,2,1,""],update:[33,2,1,""]},"ngrok.services.IPRestrictionsClient":{"delete":[34,2,1,""],create:[34,2,1,""],get:[34,2,1,""],list:[34,2,1,""],update:[34,2,1,""]},"ngrok.services.ReservedAddrsClient":{"delete":[35,2,1,""],create:[35,2,1,""],get:[35,2,1,""],list:[35,2,1,""],update:[35,2,1,""]},"ngrok.services.ReservedDomainsClient":{"delete":[36,2,1,""],create:[36,2,1,""],delete_certificate:[36,2,1,""],delete_certificate_management_policy:[36,2,1,""],get:[36,2,1,""],list:[36,2,1,""],update:[36,2,1,""]},"ngrok.services.SSHCertificateAuthoritiesClient":{"delete":[37,2,1,""],create:[37,2,1,""],get:[37,2,1,""],list:[37,2,1,""],update:[37,2,1,""]},"ngrok.services.SSHCredentialsClient":{"delete":[38,2,1,""],create:[38,2,1,""],get:[38,2,1,""],list:[38,2,1,""],update:[38,2,1,""]},"ngrok.services.SSHHostCertificatesClient":{"delete":[39,2,1,""],create:[39,2,1,""],get:[39,2,1,""],list:[39,2,1,""],update:[39,2,1,""]},"ngrok.services.SSHUserCertificatesClient":{"delete":[40,2,1,""],create:[40,2,1,""],get:[40,2,1,""],list:[40,2,1,""],update:[40,2,1,""]},"ngrok.services.TCPEdgeBackendModuleClient":{"delete":[41,2,1,""],get:[41,2,1,""],replace:[41,2,1,""]},"ngrok.services.TCPEdgeIPRestrictionModuleClient":{"delete":[42,2,1,""],get:[42,2,1,""],replace:[42,2,1,""]},"ngrok.services.TLSCertificatesClient":{"delete":[43,2,1,""],create:[43,2,1,""],get:[43,2,1,""],list:[43,2,1,""],update:[43,2,1,""]},"ngrok.services.TLSEdgeBackendModuleClient":{"delete":[44,2,1,""],get:[44,2,1,""],replace:[44,2,1,""]},"ngrok.services.TLSEdgeIPRestrictionModuleClient":{"delete":[45,2,1,""],get:[45,2,1,""],replace:[45,2,1,""]},"ngrok.services.TLSEdgeMutualTLSModuleClient":{"delete":[46,2,1,""],get:[46,2,1,""],replace:[46,2,1,""]},"ngrok.services.TLSEdgeTLSTerminationModuleClient":{"delete":[47,2,1,""],get:[47,2,1,""],replace:[47,2,1,""]},"ngrok.services.TunnelGroupBackendsClient":{"delete":[48,2,1,""],create:[48,2,1,""],get:[48,2,1,""],list:[48,2,1,""],update:[48,2,1,""]},"ngrok.services.TunnelSessionsClient":{get:[49,2,1,""],list:[49,2,1,""],restart:[49,2,1,""],stop:[49,2,1,""],update:[49,2,1,""]},"ngrok.services.TunnelsClient":{get:[50,2,1,""],list:[50,2,1,""]},"ngrok.services.WeightedBackendsClient":{"delete":[51,2,1,""],create:[51,2,1,""],get:[51,2,1,""],list:[51,2,1,""],update:[51,2,1,""]},ngrok:{Client:[4,1,1,""],Error:[23,3,1,""],NotFoundError:[23,3,1,""],datatypes:[6,0,0,"-"],services:[51,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","exception","Python exception"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:exception"},terms:{"100":6,"10000":[6,51],"128":6,"2048":37,"255":[1,2,3,5,6,18,19,20,21,24,26,32,33,34,37,38,39,40,43],"3339":[6,39,40],"404":23,"4096":[0,1,2,3,5,6,18,19,20,21,24,26,32,33,34,35,36,37,38,39,40,43],"509":6,"abstract":31,"break":49,"byte":[0,1,2,3,5,6,18,19,20,21,24,32,33,34,35,36,37,38,39,40,43],"catch":23,"char":[6,26],"class":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"default":[6,35,36,39,40],"float":6,"import":[4,31],"int":[6,23,28,37,51],"long":6,"new":[0,1,2,3,5,24,27,32,33,34,35,36,37,38,39,40,43,48,49,51],"null":[6,19,24,36],"public":[4,6,34,38,39,40],"return":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"true":[6,34],"try":[23,31],AWS:6,CAs:6,DNS:6,For:[5,6,38],IDs:26,IPs:[4,6,32,33,34],One:6,SNS:6,TLS:[3,4,6,31,36],That:31,The:[1,2,4,5,6,23,24,25,31,38,39,40,49,51],Then:4,There:[18,19,20,21],These:[6,40],__iter__:31,_acm:6,abil:[6,40],abl:6,about:[0,3,5,6,23,24,27,32,33,34,37,38,39,40,43,48,51],abus:[4,6,31],abuse_report:[0,4],abusereport:[0,6],abusereporthostnam:6,abusereportscli:[0,4],accept:[6,24],access:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],account:[0,1,2,3,4,5,6,18,20,21,22,24,26,27,32,33,34,35,36,37,38,39,40,43,48,49,50,51],acl:[5,6,38],acme_challenge_cname_target:6,action:[4,5,6,23,31,32,33,38],activ:[4,6,22],adapt:[6,19],add:[4,5,6,25],addit:[6,23,25,31,40],addr:[6,35],address:[1,4,5,6,31,38,39,40],advertis:6,after:[6,31,49],against:[6,23],agent:[4,5,6,31,34,49,50],agent_ingress:[1,4],agent_vers:6,agentingress:[1,6],agentingressescli:[1,4],agentingresslist:[1,6],all:[1,2,3,4,5,6,18,20,21,22,23,24,27,31,32,33,34,35,36,37,38,39,40,43,48,49,50,51],allow:[0,4,5,6,23,31,32,33,34,38,39,49],allow_idp_initi:6,along:[4,39],alreadi:[6,49],also:[4,6,32,43],altern:6,alwai:6,amazon:6,among:[48,51],amount:[6,49],ani:[6,23,31,32,40,49],anoth:32,anyth:24,api:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],api_kei:[2,4],apikei:[2,6],apikeylist:[2,6],apikeyscli:[2,4],app:[6,36,48],appli:[4,6,24,32,33,34],applic:[6,31],arbitrari:[0,1,2,3,5,6,18,19,20,21,23,24,26,27,28,32,33,34,35,36,37,38,39,40,43,48,51],arn:6,arrai:6,ask:6,aspect:[4,34],assert:[4,6,39],assertion_consumer_service_url:6,assign:[4,6,23,35,51],associ:[4,6,22,24,32],assum:6,attach:[3,4,6,25,32,33,34,36,43],attempt:27,attribut:[1,2,3,5,24,32,33,34,35,36,38,43],audienc:6,auth:[6,11],auth_check_interv:6,authent:[2,4,5,6,38,39,40],author:[0,4,5,6,31,39,40],authorized_group:6,authtoken:[4,5,6],autom:[4,43],automat:[4,6,36,43],avail:[0,5,6,49],awai:31,awar:49,aws_access_key_id:6,aws_secret_access_kei:6,awsauth:6,awscredenti:6,awsrol:6,back:6,backend:[4,6,19,20,21,22,31],backend_id:6,balanc:[48,51],ban:6,bar:[6,48],base:[1,6,51],base_url:4,bearer:6,becaus:[6,23],becom:[6,39,40],been:[3,4,6,49],befor:[6,49],before_id:[1,2,3,5,18,20,21,22,24,26,27,28,32,33,34,35,36,37,38,39,40,43,48,49,50,51],behalf:6,behavior:27,being:6,belong:6,best:23,between:6,bind:[5,6,38],blob:[6,40],block:23,blog:[6,19],bodi:[6,28],bool:[6,34],both:[6,33],breaker:[6,19,31],bucket:6,bundl:[6,43],ca_pem:[3,6],cach:6,calcul:51,call:[5,6,31,39,40,49],caller:[5,6,23,38,49],can:[1,2,4,5,6,27,31,32,34,35,36,37,38,40,43,49],cannot:[4,35],caus:49,caveat:6,cert:6,certfic:[3,37,39,40],certif:[4,6,31,36],certificate_author:[3,4,6],certificate_authority_id:6,certificate_id:36,certificate_management_polici:[6,36],certificate_management_statu:6,certificate_pem:[6,43],certificateauthor:[3,6],certificateauthoritiescli:[3,4],certificateauthoritylist:[3,6],certifici:6,certkei:[6,40],chain:[6,43],challeng:6,check:[6,23,49],child:[6,27,51],choos:6,chosen:[4,6,35],cidr:[4,6,31,32,33,34],circuit:[6,19,31],circuit_break:[6,19],circumst:49,client:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],client_id:6,client_secret:6,cloudwatch:6,cloudwatch_log:[6,24],cname:[4,6,36],cname_target:6,code:[6,23,28,31,49],com:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],command:[4,5,6,40,49],common:[5,6,23,38],compat:49,complet:[18,19,20,21,49],compress:[6,19,31],concaten:6,condit:[6,23],config:[4,5,24],config_metadata:6,configur:[1,4,5,6,18,19,20,21,32,36,49],connect:[1,4,5,6,27,32,34,36,39,40,49],consid:[6,39],construct:[0,1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],consult:[23,31],consum:6,contact:0,contain:[0,6,24,26,36],content:[0,6,28],control:[4,6,32],convert:31,cooki:6,cookie_prefix:6,cor:6,correct:6,correspond:[4,39],could:[23,49],countri:6,cr_1kyyuneyn6xhhlqymblrj5nxkoz:31,creat:[0,1,2,3,4,5,6,18,19,20,21,23,24,25,26,27,28,31,32,33,34,35,36,37,38,39,40,43,48,51],created_at:6,creation:6,cred:[4,6,31],credenti:[4,6,31],credentiallist:[5,6],credentialscli:[4,5],critic:[6,40],critical_opt:[6,40],current:[6,24,34,39,40,49,50],curv:37,custom:[6,26],danger:[6,39,40],dashboard:[2,4,6,31,32,34],data:[0,1,2,3,5,6,18,19,20,21,24,27,28,32,33,34,35,36,37,38,39,40,43,48,51],datacent:[6,35,36],datatyp:31,defin:[0,1,2,3,4,5,6,18,19,20,21,22,24,27,28,32,33,34,35,36,37,38,39,40,43,48,51],definit:6,deleg:6,delet:[1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,51],delete_certif:36,delete_certificate_management_polici:36,deliv:6,deliveri:6,delivery_stream_arn:6,deni:[4,6,32,33,40],deposit:6,describ:6,descript:[1,2,3,5,6,18,19,20,21,24,26,27,28,32,33,34,35,36,37,38,39,40,43,48,51],destin:[6,26,31],destination_id:26,detach:36,detail:[0,1,2,3,5,6,23,24,25,27,31,32,33,34,35,36,37,38,39,40,43,48,49,51],direct:6,directli:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],disabl:[6,36,49],disallow:6,discoveri:6,disk:6,distinguish:23,divid:51,dns_error:6,dns_name:6,doc:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],document:23,doe:[6,36],domain:[1,4,5,6,31,38,43],done:49,down:[0,4],download:6,dump:31,durat:6,dure:6,dynam:6,each:[4,18,19,20,21,49,51],easier:23,ecdsa:[6,37],ed25519:[6,37],edg:[4,6,22,23,31,36],edge_id:[6,7,8,9,10,11,12,13,14,15,16,17,19],edge_modul:4,edge_route_backend_modul:7,edge_route_circuit_breaker_modul:8,edge_route_compression_modul:9,edge_route_ip_restriction_modul:10,edge_route_o_auth_modul:11,edge_route_oidc_modul:12,edge_route_request_headers_modul:13,edge_route_response_headers_modul:14,edge_route_saml_modul:15,edge_route_webhook_verification_modul:16,edge_route_websocket_tcp_converter_modul:17,edgeroutebackendmodulecli:7,edgeroutecircuitbreakermodulecli:8,edgeroutecompressionmodulecli:9,edgerouteiprestrictionmodulecli:10,edgerouteoauthmodulecli:11,edgerouteoidcmodulecli:12,edgerouterequestheadersmodulecli:13,edgerouteresponseheadersmodulecli:14,edgeroutesamlmodulecli:15,edgeroutewebhookverificationmodulecli:16,edgeroutewebsockettcpconvertermodulecli:17,edges_http:18,edges_https_rout:19,edges_tcp:20,edges_tl:21,edgeshttpscli:18,edgeshttpsroutescli:19,edgestcpcli:20,edgestlscli:21,either:[6,33],ellipt:37,elliptic_curv:37,els:23,email:6,email_address:6,email_domain:6,enabl:[4,6,43],encapsul:[6,23,24],encod:[6,38,43],endpoint:[4,6,24,31,32,34,49,50],endpointbackend:[6,7,41,44],endpointbackendmut:[6,7,19,20,21,41,44],endpointcircuitbreak:[6,8,19],endpointcompress:[6,9,19],endpointippolici:[6,10,42,45],endpointippolicymut:[6,10,19,20,21,42,45],endpointlist:[6,22],endpointmutualtl:[6,29,46],endpointmutualtlsmut:[6,18,21,29,46],endpointoauth:[6,11,19],endpointoauthfacebook:6,endpointoauthgithub:6,endpointoauthgoogl:6,endpointoauthmicrosoft:6,endpointoauthprovid:6,endpointoidc:[6,12,19],endpointrequesthead:[6,13,19],endpointresponsehead:[6,14,19],endpointsaml:[6,15],endpointsamlmut:[6,15,19],endpointscli:[4,22],endpointtlstermin:[6,21,30,47],endpointtlsterminationatedg:[6,18,30],endpointwebhookvalid:[6,16,19],endpointwebsockettcpconvert:[6,17,19],enforc:[4,6,34],ensur:23,entiti:6,entity_id:6,entitydescriptor:6,entri:[4,33],enumer:6,ephemer:6,equival:[5,6,38],err_ngrok_7104:23,error:6,error_cod:[6,23,31],error_threshold_percentag:6,establish:27,etc:[5,6,38],evalu:6,even:6,event:[6,31],event_destin:[4,6,24],event_sourc:[4,25],event_subscript:[4,6,26],eventdestin:[6,24],eventdestinationlist:[6,24],eventdestinationscli:[4,24],eventsourc:[6,25],eventsourcelist:[6,25],eventsourcereplac:[6,26],eventsourcescli:[4,25],eventsubscript:[6,26],eventsubscriptionlist:[6,26],eventsubscriptionscli:[4,26],eventtarget:[6,24],eventtargetcloudwatchlog:6,eventtargetfirehos:6,eventtargetkinesi:6,exact_path:[6,19],exactli:[6,24],exampl:[5,6,19,36,38],exceed:6,except:[6,31],exclus:36,exec:49,exist:[18,19,20,21],exit:49,expect:6,explain:23,explicitli:[5,6,38],expos:[4,50],express:6,extend:6,extended_key_usag:6,extens:[6,40],face:[4,34],facebook:6,fail:[6,23,31,49],failov:[6,31],failover_backend:27,failoverbackend:[6,27],failoverbackendlist:[6,27],failoverbackendscli:27,fals:[6,34],fetch:31,field:23,file:[4,5,6],firehos:[6,24],first:[2,4,6,23,27,31,43],fix:[6,28],flow:6,follow:[6,24,40,49],foo:[6,48],forc:[6,40],force_authn:6,form:6,format:[6,24,39,40],forward:[6,40],forwards_to:6,four:[6,34],from:[2,4,6,31,38],full:[6,36],futur:[5,39],gatewai:[4,38],gener:[1,2,5,6,37],geograph:[6,35,36],get:[0,1,2,3,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],giraff:31,github:[6,40],gitlab:6,given:[6,25],googl:6,group:[4,6,31,32],guarante:[6,23],handshak:6,happen:23,has:[3,4,6,32,34,49],have:[4,5,6,38,43],header:[6,19,28,31],health:6,help:6,helper:31,highli:6,holder:[6,40],host:[0,4,6,31,37,40],hostcertif:6,hostnam:[4,6,35,36,39],hostport:[4,6,18,20,21,22,23],hour:40,how:[6,24],howev:[18,19,20,21],http:[0,1,2,3,4,5,6,20,21,22,23,24,25,26,27,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],http_response_backend:28,http_status_cod:[23,31],httpresponsebackend:[6,28],httpresponsebackendlist:[6,28],httpresponsebackendscli:28,https_edg:6,https_edge_mutual_tls_modul:29,https_edge_tls_termination_modul:30,httpsedg:[6,18],httpsedgelist:[6,18],httpsedgemutualtlsmodulecli:29,httpsedgerout:[6,19],httpsedgetlsterminationmodulecli:30,human:[1,2,3,5,6,18,19,20,21,23,24,26,27,28,32,33,34,35,36,37,38,39,40,43,48,51],ident:6,identifi:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],idp:6,idp_metadata:6,ids:[6,27,51],ignor:6,implement:[6,31],inact:6,inactivity_timeout:6,includ:[3,4,5,6,23,38,39,40,49],increas:6,indic:[6,23],industri:6,inform:[3,5,6,24,26,27,31,32,33,34,37,38,39,40,43,48,51],ingress:[4,6,31,34],initi:[4,6,34],inject:6,instal:[4,5],instanc:[4,49],instead:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],instruct:49,integ:6,integr:49,intend:[6,26],intercom:6,internal_error:6,interpret:[6,40],introspect:23,invalid:[6,39,40],invok:[23,31],ip_polici:[4,6,23,31,32],ip_policy_id:[6,31,33,34],ip_policy_rul:[4,6,31,33],ip_restrict:[4,6,19,20,21,34],ippolici:[6,32],ippoliciescli:[4,32],ippolicylist:[6,32],ippolicyrul:[6,33],ippolicyrulelist:[6,33],ippolicyrulescli:[4,33],iprestrict:[6,34],iprestrictionlist:[6,34],iprestrictionscli:[4,34],ips:6,ipv4:[4,6,33],ipv6:[4,6,33],isn:6,issu:[6,34,39,40,49],issued_at:6,issuer:6,issuer_common_nam:6,its:[4,6,37,39,51],itself:[2,4,31,49],job:6,json:[6,24,31],kei:[3,4,6,31,37,38,39,40,43],key_siz:37,key_typ:6,key_usag:6,keypair:[6,38],kind:23,kinesi:[6,24],label:[6,48],latest:49,lead:[5,6,38],leaf:[6,43],least:49,leav:[6,24],letsencrypt:6,level:6,librari:[4,31],like:[6,24,31,36],limit:[1,2,3,5,6,18,20,21,22,24,26,27,28,32,33,34,35,36,37,38,39,40,43,48,49,50,51],link:43,list:[0,1,2,3,4,5,6,18,20,21,22,23,24,25,26,27,28,31,32,33,34,35,36,37,38,39,40,43,48,49,50,51],listen:[4,35,36],local:6,locat:6,log:[4,6,34,40],log_group_arn:6,login:6,logout:6,longer:6,low:6,machin:[1,3,5,6,18,19,20,21,24,26,27,28,32,33,34,35,36,37,38,39,40,43,48,51],mai:[2,4,5,6,23,36,38,40,43],major:49,make:[4,6,23,33,34,49],manag:[2,4,6,36],mani:6,manual:49,map:[6,28,40,48,51],master:[6,40],match:[4,5,6,19,38,43,48],match_typ:[6,19],max:[0,1,2,3,5,6,18,19,20,21,24,26,32,33,34,35,36,37,38,39,40,43],maximum:6,maximum_dur:6,member:6,messag:[6,23,31],metadata:[0,1,2,3,5,6,18,19,20,21,24,26,27,28,31,32,33,34,35,36,37,38,39,40,43,48,51],metadata_url:6,method:23,metric:6,microsoft:6,min_vers:6,minimum:6,modifi:[18,19,20,21],modul:[3,4,6,18,19,20,21,31,32],more:[4,6,40,49],most:6,msg:6,mtl:[3,4],multipl:[5,6,38],must:[4,5,6,24,40,49],mutual:[3,4,31,36],mutual_tl:[6,18,21],nake:23,name:[1,6,36],nameid:6,nameid_format:6,necessari:[6,31],need:[2,4,5,6,31],network:[6,23],never:49,next:[6,27],next_page_uri:6,ngrok:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],non:6,none:[1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],not_aft:6,not_befor:6,notabl:49,notat:[6,33],notfounderror:23,ns_target:6,num_bucket:6,number:[6,40],oasi:6,oauth:[6,19,31],object:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],offici:31,offlin:27,oidc:[6,19,31],one:[4,6,24,27,31,37,39,49],onli:[0,3,4,5,6,22,24,34,38,40],onlin:[6,31,48,49,50],open:[5,6,38,40],openid:6,openssh:[6,39,40],oper:[6,23,49],operation_id:23,operationid:23,option:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],options_passthrough:6,order:[6,27],org:6,organ:6,organiz:6,other:[3,4,6,23,37],otherwis:6,our:[0,23],out:6,output:[6,24],over:6,own:[1,2,4,6,36],packag:31,page:[2,4,6],pagerduti:6,pair:[4,6,37,43],paramet:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],pars:6,partially_process:6,pass:6,path_prefix:[6,19],pem:[3,6,38,43],pend:6,percentag:[6,51],period:6,perman:6,permiss:[6,40],permit:[5,6,38,40],persist:6,pip:31,place:[4,6,34],platform:49,pleas:49,point:[4,6,23,36],polici:[4,6,31,34,36],port:[4,6,23,35,40],portabl:[6,40],portion:6,predefin:[6,40],prefer:6,prefix:6,present:[3,4,6,40],princip:[6,39,40],print:[4,31],privat:[3,4,6,37,39,43],private_key_pem:43,private_key_typ:[6,37],process:[6,49],prompt:6,prop:6,properti:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],proportion:51,proto:6,protocol:[6,40],provid:[4,6,22,50],provinc:6,provis:[2,4,6,43],provisioning_job:6,pty:[6,40],pub:6,public_kei:[6,38,39,40],public_url:6,pull:6,purpos:[6,32,40],python:31,qualifi:6,queri:[4,22],rais:23,rang:[4,6,32,33],raw:[3,6],readabl:[1,2,3,5,6,18,19,20,21,23,24,26,27,28,32,33,34,35,36,37,38,39,40,43,48,51],reauthent:6,recent:6,recheck:6,recommend:6,reconnect:49,record:[4,6,36],redirect:6,ref:6,refer:6,referenc:[6,24,27,32,51],refresh:6,region:[1,6,35,36],region_domain:6,relat:6,relayst:6,reli:6,remain:32,remov:[6,25],renew:6,renews_at:6,replac:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,29,30,41,42,44,45,46,47],report:[4,6,31],repres:[4,49],request:[0,4,6,19,23,31,34,49],request_head:[6,19],request_signing_certificate_pem:6,requir:6,reserv:[4,6,31],reserved_addr:[4,6,35],reserved_domain:[4,6,36],reservedaddr:[6,35],reservedaddrlist:[6,35],reservedaddrscli:[4,35],reserveddomain:[6,36],reserveddomaincertjob:6,reserveddomaincertpolici:[6,36],reserveddomaincertstatu:6,reserveddomainlist:[6,36],reserveddomainscli:[4,36],resourc:[0,1,2,3,4,5,6,18,20,21,22,24,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],respons:[0,5,6,19,23,31],response_head:[6,19],rest:[6,24],restart:49,restrict:[4,5,6,19,31,32,38],retain:6,retri:[6,23],retries_at:6,retriev:6,reusabl:[4,32],revers:[4,49,50],review:0,revok:6,rfc:[6,39,40],robustli:23,role:6,role_arn:6,roll:6,rolling_window:6,root:4,rout:[6,31],rsa:[6,37],rule:[4,5,6,31,32,38],run:[4,6,49,50],runtimeerror:23,safe:6,same:6,saml:[6,19,31],san:6,save:5,scope:6,second:[6,49],secret:6,section:31,secur:5,see:[6,40,43],selector:[6,19,48],send:[6,24],sendgrid:6,sent:[6,27],separ:23,sequenc:[0,5,6,18,20,21,26,27,34,38,39,40],serial:[6,24],serial_numb:6,serv:[4,6,18,20,21,22,39],server:[4,6,23,36,39,40],server_nam:31,servic:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],session:[4,5,6,31,32,50],set:[1,6,34],shopifi:6,should:[6,26,49],sign:[3,4,6,37,39,40],simpl:23,singl:[6,31],single_logout_url:6,size:37,slack:6,slug:6,some:[23,31,49],someth:23,sourc:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],spec:[6,40],specif:[4,6,23,31,34],specifi:[4,5,6,18,19,20,21,33,36,38,39,40],ssh:[4,6,31,49,50],ssh_certificate_author:[4,6,37],ssh_certificate_authority_id:[6,39,40],ssh_credenti:[4,6,38],ssh_host_certif:[4,6,39],ssh_user_certif:[4,6,40],sshcertificateauthor:[6,37],sshcertificateauthoritiescli:[4,37],sshcertificateauthoritylist:[6,37],sshcredenti:[6,38],sshcredentiallist:[6,38],sshcredentialscli:[4,38],sshd_config:6,sshhostcertif:[6,39],sshhostcertificatelist:[6,39],sshhostcertificatescli:[4,39],sshusercertif:[6,40],sshusercertificatelist:[6,40],sshusercertificatescli:[4,40],start:[4,5,6,32,34,38,49],started_at:6,state:6,statist:6,statu:[0,6,22,23,28,31,49,50],status:6,status_cod:[6,28],still:[6,24,49],stop:49,str:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],stream:[6,24],stream_arn:6,string:[6,23],stripe:6,subclass:23,subdomain:[6,36],subject:6,subject_alternative_nam:6,subject_common_nam:6,subject_countri:6,subject_loc:6,subject_organ:6,subject_organizational_unit:6,subject_provinc:6,submit:[0,4],subnet:31,subscript:[6,24,25,31],subscription_id:25,subset:6,success:27,successfulli:49,suffix:[5,6,38],sum:51,suppli:[6,26],support:[6,33,34,49],suspect:[0,6],system:[0,6,23],take:[0,4,6,23],taken:6,target:[6,24,36],tcp:[4,6,19,31,35],tcp_addr:6,tcp_edg:6,tcp_edge_backend_modul:41,tcp_edge_ip_restriction_modul:42,tcpedg:[6,20],tcpedgebackendmodulecli:41,tcpedgeiprestrictionmodulecli:42,tcpedgelist:[6,20],team:[0,6],temporari:6,term:[0,4,6],termin:[4,6,31,40,43],terminate_at:6,thei:[4,5,6,32,35,43],them:6,thi:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],threshold:6,through:6,thrown:23,thu:[3,4],time:[5,6,38,39,40,49],timestamp:6,tls:[4,6,21,29,30,36,43,44,45,46,47],tls_certif:[4,6,43],tls_edg:6,tls_edge_backend_modul:44,tls_edge_ip_restriction_modul:45,tls_edge_mutual_tls_modul:46,tls_edge_tls_termination_modul:47,tls_termin:[6,18,21],tlscertif:[6,43],tlscertificatelist:[6,43],tlscertificatesan:6,tlscertificatescli:[4,43],tlsedg:[6,21],tlsedgebackendmodulecli:44,tlsedgeiprestrictionmodulecli:45,tlsedgelist:[6,21],tlsedgemutualtlsmodulecli:46,tlsedgetlsterminationmodulecli:47,togeth:6,token:[5,6,38],top:6,trace:23,traffic:[4,6,27,31,32,34,35,36,39,43,48,51],transpar:31,transport:6,treat:32,trigger:[6,25,26],trip:6,tripped_dur:6,trust:[4,39,40],tunabl:6,tune:6,tunnel:[4,6,22,31,32,38],tunnel_group_backend:48,tunnel_sess:[4,6,49],tunnelgroup:[6,48],tunnelgroupbackend:[6,48],tunnelgroupbackendlist:[6,48],tunnelgroupbackendscli:48,tunnellist:[6,50],tunnelscli:[4,50],tunnelsess:[6,49],tunnelsessionlist:[6,49],tunnelsessionscli:[4,49],twilio:6,two:[6,40],type:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],unban:6,undefin:23,underli:6,understand:[6,40],unexpect:23,uniqu:[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,23,24,25,26],unit:6,unspecifi:[5,6,38,39,40],until:[4,24,27,32,43],unus:[4,43],updat:[1,2,3,5,6,18,19,20,21,24,25,26,27,28,31,32,33,34,35,36,37,38,39,40,43,48,49,51],updated_at:6,upload:[3,6,36,38,43],upstream:6,uri:6,url:[0,4,6,23],urn:6,use:[1,2,4,5,6,18,19,20,21,23,36,37,38],used:[1,2,3,4,5,6,18,19,20,21,22,26,32,34,35,36,37,38,39,40,43],user:[0,1,2,3,4,5,6,18,19,20,21,24,27,28,31,32,33,34,35,36,37,38,39,43,48,51],usernam:[6,40],uses:[2,6],using:[6,49],valid:[3,4,6,19,23,31,39,40],valid_aft:[6,39,40],valid_befor:[6,39,40],valid_until:[6,39,40],valu:[6,18,19,20,21,24,34,39,40],verif:[6,19,31],verifi:[3,4],version:[6,49],via:[1,4,18,19,20,21,32,38],violat:[0,4],visit:6,volum:6,volume_threshold:6,wai:[18,19,20,21],wait:[6,49],want:6,warn:[6,34],watch:[6,48],webhook:[6,19,31],webhook_verif:[6,19],websocket:[6,19,31],websocket_tcp_convert:[6,19],weight:[6,31],weighted_backend:51,weightedbackend:[6,51],weightedbackendlist:[6,51],weightedbackendscli:51,well:[6,31],what:[2,4,5,6,18,19,20,21,22,34,35,36,38],when:[4,6,23,24,31,37,39,40,49],whenev:6,where:[6,24],whether:6,which:[0,4,5,6,22,25,26,31,34,38,43,49],who:[4,5,6,38,39],why:[6,23],wildcard:[5,6,38],window:[6,49],wish:49,within:27,without:[23,31],work:31,would:[5,6,24,38],x11:[6,40],x509:[3,4,43],xero:6,xml:6,year:39,yet:49,yml:[4,5],you:[0,1,2,4,5,6,23,24,31,32,36,38,43,49],your:[2,4,5,6,24,31,34,38,49],yourself:5,zero:32},titles:["Abuse Reports","Agent Ingresses","API Keys","Certificate Authorities","Client","Tunnel Credentials","Datatypes","HTTPS Edge Route Backend Module","HTTPS Edge Route Circuit Breaker Module","HTTPS Edge Route Compression Module","HTTPS Edge Route IP Restriction Module","HTTPS Edge Route OAuth Module","HTTPS Edge Route OIDC Module","HTTPS Edge Route Request Headers Module","HTTPS Edge Route Response Headers Module","HTTPS Edge Route SAML Module","HTTPS Edge Route Webhook Verification Module","HTTPS Edge Route Websocket TCP Converter Module","HTTPS Edges","HTTPS Edge Routes","TCP Edges","TLS Edges","Endpoints","Errors","Event Destinations","Event Sources","Event Subscriptions","Failover Backends","HTTP Response Backends","HTTPS Edge Mutual TLS Module","HTTPS Edge TLS Termination Module","ngrok-api","IP Policies","IP Policy Rules","IP Restrictions","Reserved Addresses","Reserved Domains","SSH Certificate Authorities","SSH Credentials","SSH Host Certificates","SSH User Certificates","TCP Edge Backend Module","TCP Edge IP Restriction Module","TLS Certificates","TLS Edge Backend Module","TLS Edge IP Restriction Module","TLS Edge Mutual TLS Module","TLS Edge TLS Termination Module","Tunnel Group Backends","Tunnel Sessions","Tunnels","Weighted Backends"],titleterms:{"class":23,TLS:[21,29,30,43,44,45,46,47],abus:0,address:35,agent:1,api:[2,31],author:[3,37],automat:31,backend:[7,27,28,41,44,48,51],breaker:8,certif:[3,37,39,40,43],circuit:8,client:4,compress:9,convert:17,credenti:[5,38],datatyp:6,destin:24,domain:36,edg:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,29,30,41,42,44,45,46,47],endpoint:22,error:[23,31],event:[24,25,26],exampl:31,except:23,failov:27,get:31,group:48,handl:[23,31],header:[13,14],host:39,http:[7,8,9,10,11,12,13,14,15,16,17,18,19,28,29,30],ingress:1,instal:31,instanc:31,kei:2,method:31,modul:[7,8,9,10,11,12,13,14,15,16,17,29,30,41,42,44,45,46,47],mutual:[29,46],ngrok:31,oauth:11,oidc:12,page:31,polici:[32,33],quickstart:31,refer:31,report:0,request:13,reserv:[35,36],respons:[14,28],restrict:[10,34,42,45],rout:[7,8,9,10,11,12,13,14,15,16,17,19],rule:33,saml:15,servic:31,session:49,sourc:25,ssh:[37,38,39,40],start:31,subscript:26,tcp:[17,20,41,42],termin:[30,47],tunnel:[5,48,49,50],user:40,verif:16,webhook:16,websocket:17,weight:51}}) \ No newline at end of file +Search.setIndex({docnames:["abuse_reports","agent_ingresses","api_keys","application_sessions","application_users","certificate_authorities","client","credentials","datatypes","edge_route_backend_module","edge_route_circuit_breaker_module","edge_route_compression_module","edge_route_ip_restriction_module","edge_route_o_auth_module","edge_route_oidc_module","edge_route_request_headers_module","edge_route_response_headers_module","edge_route_saml_module","edge_route_webhook_verification_module","edge_route_websocket_tcp_converter_module","edges_https","edges_https_routes","edges_tcp","edges_tls","endpoints","errors","event_destinations","event_sources","event_subscriptions","failover_backends","http_response_backends","https_edge_mutual_tls_module","https_edge_tls_termination_module","index","ip_policies","ip_policy_rules","ip_restrictions","reserved_addrs","reserved_domains","ssh_certificate_authorities","ssh_credentials","ssh_host_certificates","ssh_user_certificates","tcp_edge_backend_module","tcp_edge_ip_restriction_module","tls_certificates","tls_edge_backend_module","tls_edge_ip_restriction_module","tls_edge_mutual_tls_module","tls_edge_tls_termination_module","tunnel_group_backends","tunnel_sessions","tunnels","weighted_backends"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["abuse_reports.rst","agent_ingresses.rst","api_keys.rst","application_sessions.rst","application_users.rst","certificate_authorities.rst","client.rst","credentials.rst","datatypes.rst","edge_route_backend_module.rst","edge_route_circuit_breaker_module.rst","edge_route_compression_module.rst","edge_route_ip_restriction_module.rst","edge_route_o_auth_module.rst","edge_route_oidc_module.rst","edge_route_request_headers_module.rst","edge_route_response_headers_module.rst","edge_route_saml_module.rst","edge_route_webhook_verification_module.rst","edge_route_websocket_tcp_converter_module.rst","edges_https.rst","edges_https_routes.rst","edges_tcp.rst","edges_tls.rst","endpoints.rst","errors.rst","event_destinations.rst","event_sources.rst","event_subscriptions.rst","failover_backends.rst","http_response_backends.rst","https_edge_mutual_tls_module.rst","https_edge_tls_termination_module.rst","index.rst","ip_policies.rst","ip_policy_rules.rst","ip_restrictions.rst","reserved_addrs.rst","reserved_domains.rst","ssh_certificate_authorities.rst","ssh_credentials.rst","ssh_host_certificates.rst","ssh_user_certificates.rst","tcp_edge_backend_module.rst","tcp_edge_ip_restriction_module.rst","tls_certificates.rst","tls_edge_backend_module.rst","tls_edge_ip_restriction_module.rst","tls_edge_mutual_tls_module.rst","tls_edge_tls_termination_module.rst","tunnel_group_backends.rst","tunnel_sessions.rst","tunnels.rst","weighted_backends.rst"],objects:{"":{ngrok:[25,0,0,"-"]},"ngrok.Client":{abuse_reports:[6,2,1,""],agent_ingresses:[6,2,1,""],api_keys:[6,2,1,""],application_sessions:[6,2,1,""],application_users:[6,2,1,""],backends:[6,2,1,""],certificate_authorities:[6,2,1,""],credentials:[6,2,1,""],edge_modules:[6,2,1,""],edges:[6,2,1,""],endpoints:[6,2,1,""],event_destinations:[6,2,1,""],event_sources:[6,2,1,""],event_subscriptions:[6,2,1,""],ip_policies:[6,2,1,""],ip_policy_rules:[6,2,1,""],ip_restrictions:[6,2,1,""],reserved_addrs:[6,2,1,""],reserved_domains:[6,2,1,""],ssh_certificate_authorities:[6,2,1,""],ssh_credentials:[6,2,1,""],ssh_host_certificates:[6,2,1,""],ssh_user_certificates:[6,2,1,""],tls_certificates:[6,2,1,""],tunnel_sessions:[6,2,1,""],tunnels:[6,2,1,""]},"ngrok.Error":{operation_id:[25,2,1,""]},"ngrok.datatypes":{APIKey:[8,1,1,""],APIKeyList:[8,1,1,""],AWSAuth:[8,1,1,""],AWSCredentials:[8,1,1,""],AWSRole:[8,1,1,""],AbuseReport:[8,1,1,""],AbuseReportHostname:[8,1,1,""],AgentIngress:[8,1,1,""],AgentIngressList:[8,1,1,""],ApplicationSession:[8,1,1,""],ApplicationSessionList:[8,1,1,""],ApplicationUser:[8,1,1,""],ApplicationUserList:[8,1,1,""],BrowserSession:[8,1,1,""],CertificateAuthority:[8,1,1,""],CertificateAuthorityList:[8,1,1,""],Credential:[8,1,1,""],CredentialList:[8,1,1,""],Endpoint:[8,1,1,""],EndpointBackend:[8,1,1,""],EndpointBackendMutate:[8,1,1,""],EndpointCircuitBreaker:[8,1,1,""],EndpointCompression:[8,1,1,""],EndpointIPPolicy:[8,1,1,""],EndpointIPPolicyMutate:[8,1,1,""],EndpointList:[8,1,1,""],EndpointMutualTLS:[8,1,1,""],EndpointMutualTLSMutate:[8,1,1,""],EndpointOAuth:[8,1,1,""],EndpointOAuthAmazon:[8,1,1,""],EndpointOAuthFacebook:[8,1,1,""],EndpointOAuthGitHub:[8,1,1,""],EndpointOAuthGitLab:[8,1,1,""],EndpointOAuthGoogle:[8,1,1,""],EndpointOAuthLinkedIn:[8,1,1,""],EndpointOAuthMicrosoft:[8,1,1,""],EndpointOAuthProvider:[8,1,1,""],EndpointOAuthTwitch:[8,1,1,""],EndpointOIDC:[8,1,1,""],EndpointRequestHeaders:[8,1,1,""],EndpointResponseHeaders:[8,1,1,""],EndpointSAML:[8,1,1,""],EndpointSAMLMutate:[8,1,1,""],EndpointTLSTermination:[8,1,1,""],EndpointTLSTerminationAtEdge:[8,1,1,""],EndpointWebhookValidation:[8,1,1,""],EndpointWebsocketTCPConverter:[8,1,1,""],EventDestination:[8,1,1,""],EventDestinationList:[8,1,1,""],EventSource:[8,1,1,""],EventSourceList:[8,1,1,""],EventSourceReplace:[8,1,1,""],EventSubscription:[8,1,1,""],EventSubscriptionList:[8,1,1,""],EventTarget:[8,1,1,""],EventTargetCloudwatchLogs:[8,1,1,""],EventTargetFirehose:[8,1,1,""],EventTargetKinesis:[8,1,1,""],FailoverBackend:[8,1,1,""],FailoverBackendList:[8,1,1,""],HTTPResponseBackend:[8,1,1,""],HTTPResponseBackendList:[8,1,1,""],HTTPSEdge:[8,1,1,""],HTTPSEdgeList:[8,1,1,""],HTTPSEdgeRoute:[8,1,1,""],IPPolicy:[8,1,1,""],IPPolicyList:[8,1,1,""],IPPolicyRule:[8,1,1,""],IPPolicyRuleList:[8,1,1,""],IPRestriction:[8,1,1,""],IPRestrictionList:[8,1,1,""],IdentityProvider:[8,1,1,""],Location:[8,1,1,""],Ref:[8,1,1,""],ReservedAddr:[8,1,1,""],ReservedAddrList:[8,1,1,""],ReservedDomain:[8,1,1,""],ReservedDomainCertJob:[8,1,1,""],ReservedDomainCertPolicy:[8,1,1,""],ReservedDomainCertStatus:[8,1,1,""],ReservedDomainList:[8,1,1,""],SSHCertificateAuthority:[8,1,1,""],SSHCertificateAuthorityList:[8,1,1,""],SSHCredential:[8,1,1,""],SSHCredentialList:[8,1,1,""],SSHHostCertificate:[8,1,1,""],SSHHostCertificateList:[8,1,1,""],SSHUserCertificate:[8,1,1,""],SSHUserCertificateList:[8,1,1,""],TCPEdge:[8,1,1,""],TCPEdgeList:[8,1,1,""],TLSCertificate:[8,1,1,""],TLSCertificateList:[8,1,1,""],TLSCertificateSANs:[8,1,1,""],TLSEdge:[8,1,1,""],TLSEdgeList:[8,1,1,""],Tunnel:[8,1,1,""],TunnelGroupBackend:[8,1,1,""],TunnelGroupBackendList:[8,1,1,""],TunnelList:[8,1,1,""],TunnelSession:[8,1,1,""],TunnelSessionList:[8,1,1,""],UserAgent:[8,1,1,""],WeightedBackend:[8,1,1,""],WeightedBackendList:[8,1,1,""]},"ngrok.datatypes.APIKey":{"delete":[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],id:[8,2,1,""],metadata:[8,2,1,""],owner_id:[8,2,1,""],token:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.APIKeyList":{keys:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.AWSAuth":{creds:[8,2,1,""],role:[8,2,1,""]},"ngrok.datatypes.AWSCredentials":{aws_access_key_id:[8,2,1,""],aws_secret_access_key:[8,2,1,""]},"ngrok.datatypes.AWSRole":{role_arn:[8,2,1,""]},"ngrok.datatypes.AbuseReport":{created_at:[8,2,1,""],hostnames:[8,2,1,""],id:[8,2,1,""],metadata:[8,2,1,""],status:[8,2,1,""],uri:[8,2,1,""],urls:[8,2,1,""]},"ngrok.datatypes.AbuseReportHostname":{hostname:[8,2,1,""],status:[8,2,1,""]},"ngrok.datatypes.AgentIngress":{"delete":[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],domain:[8,2,1,""],id:[8,2,1,""],metadata:[8,2,1,""],ns_targets:[8,2,1,""],region_domains:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.AgentIngressList":{ingresses:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.ApplicationSession":{"delete":[8,2,1,""],application_user:[8,2,1,""],browser_session:[8,2,1,""],created_at:[8,2,1,""],edge:[8,2,1,""],endpoint:[8,2,1,""],expires_at:[8,2,1,""],id:[8,2,1,""],last_active:[8,2,1,""],public_url:[8,2,1,""],route:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.ApplicationSessionList":{application_sessions:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.ApplicationUser":{"delete":[8,2,1,""],created_at:[8,2,1,""],email:[8,2,1,""],id:[8,2,1,""],identity_provider:[8,2,1,""],last_active:[8,2,1,""],last_login:[8,2,1,""],name:[8,2,1,""],provider_user_id:[8,2,1,""],uri:[8,2,1,""],username:[8,2,1,""]},"ngrok.datatypes.ApplicationUserList":{application_users:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.BrowserSession":{ip_address:[8,2,1,""],location:[8,2,1,""],user_agent:[8,2,1,""]},"ngrok.datatypes.CertificateAuthority":{"delete":[8,2,1,""],ca_pem:[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],extended_key_usages:[8,2,1,""],id:[8,2,1,""],key_usages:[8,2,1,""],metadata:[8,2,1,""],not_after:[8,2,1,""],not_before:[8,2,1,""],subject_common_name:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.CertificateAuthorityList":{certificate_authorities:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.Credential":{"delete":[8,2,1,""],acl:[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],id:[8,2,1,""],metadata:[8,2,1,""],owner_id:[8,2,1,""],token:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.CredentialList":{credentials:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.Endpoint":{created_at:[8,2,1,""],domain:[8,2,1,""],edge:[8,2,1,""],hostport:[8,2,1,""],id:[8,2,1,""],metadata:[8,2,1,""],proto:[8,2,1,""],public_url:[8,2,1,""],region:[8,2,1,""],tcp_addr:[8,2,1,""],tunnel:[8,2,1,""],type:[8,2,1,""],updated_at:[8,2,1,""]},"ngrok.datatypes.EndpointBackend":{backend:[8,2,1,""],enabled:[8,2,1,""]},"ngrok.datatypes.EndpointBackendMutate":{backend_id:[8,2,1,""],enabled:[8,2,1,""]},"ngrok.datatypes.EndpointCircuitBreaker":{enabled:[8,2,1,""],error_threshold_percentage:[8,2,1,""],num_buckets:[8,2,1,""],rolling_window:[8,2,1,""],tripped_duration:[8,2,1,""],volume_threshold:[8,2,1,""]},"ngrok.datatypes.EndpointCompression":{enabled:[8,2,1,""]},"ngrok.datatypes.EndpointIPPolicy":{enabled:[8,2,1,""],ip_policies:[8,2,1,""]},"ngrok.datatypes.EndpointIPPolicyMutate":{enabled:[8,2,1,""],ip_policy_ids:[8,2,1,""]},"ngrok.datatypes.EndpointList":{endpoints:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.EndpointMutualTLS":{certificate_authorities:[8,2,1,""],enabled:[8,2,1,""]},"ngrok.datatypes.EndpointMutualTLSMutate":{certificate_authority_ids:[8,2,1,""],enabled:[8,2,1,""]},"ngrok.datatypes.EndpointOAuth":{auth_check_interval:[8,2,1,""],cookie_prefix:[8,2,1,""],enabled:[8,2,1,""],inactivity_timeout:[8,2,1,""],maximum_duration:[8,2,1,""],options_passthrough:[8,2,1,""],provider:[8,2,1,""]},"ngrok.datatypes.EndpointOAuthAmazon":{client_id:[8,2,1,""],client_secret:[8,2,1,""],email_addresses:[8,2,1,""],email_domains:[8,2,1,""],scopes:[8,2,1,""]},"ngrok.datatypes.EndpointOAuthFacebook":{client_id:[8,2,1,""],client_secret:[8,2,1,""],email_addresses:[8,2,1,""],email_domains:[8,2,1,""],scopes:[8,2,1,""]},"ngrok.datatypes.EndpointOAuthGitHub":{client_id:[8,2,1,""],client_secret:[8,2,1,""],email_addresses:[8,2,1,""],email_domains:[8,2,1,""],organizations:[8,2,1,""],scopes:[8,2,1,""],teams:[8,2,1,""]},"ngrok.datatypes.EndpointOAuthGitLab":{client_id:[8,2,1,""],client_secret:[8,2,1,""],email_addresses:[8,2,1,""],email_domains:[8,2,1,""],scopes:[8,2,1,""]},"ngrok.datatypes.EndpointOAuthGoogle":{client_id:[8,2,1,""],client_secret:[8,2,1,""],email_addresses:[8,2,1,""],email_domains:[8,2,1,""],scopes:[8,2,1,""]},"ngrok.datatypes.EndpointOAuthLinkedIn":{client_id:[8,2,1,""],client_secret:[8,2,1,""],email_addresses:[8,2,1,""],email_domains:[8,2,1,""],scopes:[8,2,1,""]},"ngrok.datatypes.EndpointOAuthMicrosoft":{client_id:[8,2,1,""],client_secret:[8,2,1,""],email_addresses:[8,2,1,""],email_domains:[8,2,1,""],scopes:[8,2,1,""]},"ngrok.datatypes.EndpointOAuthProvider":{amazon:[8,2,1,""],facebook:[8,2,1,""],github:[8,2,1,""],gitlab:[8,2,1,""],google:[8,2,1,""],linkedin:[8,2,1,""],microsoft:[8,2,1,""],twitch:[8,2,1,""]},"ngrok.datatypes.EndpointOAuthTwitch":{client_id:[8,2,1,""],client_secret:[8,2,1,""],email_addresses:[8,2,1,""],email_domains:[8,2,1,""],scopes:[8,2,1,""]},"ngrok.datatypes.EndpointOIDC":{client_id:[8,2,1,""],client_secret:[8,2,1,""],cookie_prefix:[8,2,1,""],enabled:[8,2,1,""],inactivity_timeout:[8,2,1,""],issuer:[8,2,1,""],maximum_duration:[8,2,1,""],options_passthrough:[8,2,1,""],scopes:[8,2,1,""]},"ngrok.datatypes.EndpointRequestHeaders":{add:[8,2,1,""],enabled:[8,2,1,""],remove:[8,2,1,""]},"ngrok.datatypes.EndpointResponseHeaders":{add:[8,2,1,""],enabled:[8,2,1,""],remove:[8,2,1,""]},"ngrok.datatypes.EndpointSAML":{allow_idp_initiated:[8,2,1,""],assertion_consumer_service_url:[8,2,1,""],authorized_groups:[8,2,1,""],cookie_prefix:[8,2,1,""],enabled:[8,2,1,""],entity_id:[8,2,1,""],force_authn:[8,2,1,""],idp_metadata:[8,2,1,""],inactivity_timeout:[8,2,1,""],maximum_duration:[8,2,1,""],metadata_url:[8,2,1,""],nameid_format:[8,2,1,""],options_passthrough:[8,2,1,""],request_signing_certificate_pem:[8,2,1,""],single_logout_url:[8,2,1,""]},"ngrok.datatypes.EndpointSAMLMutate":{allow_idp_initiated:[8,2,1,""],authorized_groups:[8,2,1,""],cookie_prefix:[8,2,1,""],enabled:[8,2,1,""],force_authn:[8,2,1,""],idp_metadata:[8,2,1,""],inactivity_timeout:[8,2,1,""],maximum_duration:[8,2,1,""],nameid_format:[8,2,1,""],options_passthrough:[8,2,1,""]},"ngrok.datatypes.EndpointTLSTermination":{enabled:[8,2,1,""],min_version:[8,2,1,""],terminate_at:[8,2,1,""]},"ngrok.datatypes.EndpointTLSTerminationAtEdge":{enabled:[8,2,1,""],min_version:[8,2,1,""]},"ngrok.datatypes.EndpointWebhookValidation":{enabled:[8,2,1,""],provider:[8,2,1,""],secret:[8,2,1,""]},"ngrok.datatypes.EndpointWebsocketTCPConverter":{enabled:[8,2,1,""]},"ngrok.datatypes.EventDestination":{"delete":[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],format:[8,2,1,""],id:[8,2,1,""],metadata:[8,2,1,""],target:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.EventDestinationList":{event_destinations:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.EventSource":{type:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.EventSourceList":{sources:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.EventSourceReplace":{type:[8,2,1,""]},"ngrok.datatypes.EventSubscription":{"delete":[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],destinations:[8,2,1,""],id:[8,2,1,""],metadata:[8,2,1,""],sources:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.EventSubscriptionList":{event_subscriptions:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.EventTarget":{cloudwatch_logs:[8,2,1,""],firehose:[8,2,1,""],kinesis:[8,2,1,""]},"ngrok.datatypes.EventTargetCloudwatchLogs":{auth:[8,2,1,""],log_group_arn:[8,2,1,""]},"ngrok.datatypes.EventTargetFirehose":{auth:[8,2,1,""],delivery_stream_arn:[8,2,1,""]},"ngrok.datatypes.EventTargetKinesis":{auth:[8,2,1,""],stream_arn:[8,2,1,""]},"ngrok.datatypes.FailoverBackend":{"delete":[8,2,1,""],backends:[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],id:[8,2,1,""],metadata:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.FailoverBackendList":{backends:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.HTTPResponseBackend":{"delete":[8,2,1,""],body:[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],headers:[8,2,1,""],id:[8,2,1,""],metadata:[8,2,1,""],status_code:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.HTTPResponseBackendList":{backends:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.HTTPSEdge":{"delete":[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],hostports:[8,2,1,""],id:[8,2,1,""],metadata:[8,2,1,""],mutual_tls:[8,2,1,""],routes:[8,2,1,""],tls_termination:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.HTTPSEdgeList":{https_edges:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.HTTPSEdgeRoute":{"delete":[8,2,1,""],backend:[8,2,1,""],circuit_breaker:[8,2,1,""],compression:[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],edge_id:[8,2,1,""],id:[8,2,1,""],ip_restriction:[8,2,1,""],match:[8,2,1,""],match_type:[8,2,1,""],metadata:[8,2,1,""],oauth:[8,2,1,""],oidc:[8,2,1,""],request_headers:[8,2,1,""],response_headers:[8,2,1,""],saml:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""],webhook_verification:[8,2,1,""],websocket_tcp_converter:[8,2,1,""]},"ngrok.datatypes.IPPolicy":{"delete":[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],id:[8,2,1,""],metadata:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.IPPolicyList":{ip_policies:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.IPPolicyRule":{"delete":[8,2,1,""],action:[8,2,1,""],cidr:[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],id:[8,2,1,""],ip_policy:[8,2,1,""],metadata:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.IPPolicyRuleList":{ip_policy_rules:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.IPRestriction":{"delete":[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],enforced:[8,2,1,""],id:[8,2,1,""],ip_policies:[8,2,1,""],metadata:[8,2,1,""],type:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.IPRestrictionList":{ip_restrictions:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.IdentityProvider":{name:[8,2,1,""],url:[8,2,1,""]},"ngrok.datatypes.Location":{country_code:[8,2,1,""],lat_long_radius_km:[8,2,1,""],latitude:[8,2,1,""],longitude:[8,2,1,""]},"ngrok.datatypes.Ref":{id:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.ReservedAddr":{"delete":[8,2,1,""],addr:[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],id:[8,2,1,""],metadata:[8,2,1,""],region:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.ReservedAddrList":{next_page_uri:[8,2,1,""],reserved_addrs:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.ReservedDomain":{"delete":[8,2,1,""],acme_challenge_cname_target:[8,2,1,""],certificate:[8,2,1,""],certificate_management_policy:[8,2,1,""],certificate_management_status:[8,2,1,""],cname_target:[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],domain:[8,2,1,""],id:[8,2,1,""],metadata:[8,2,1,""],region:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.ReservedDomainCertJob":{error_code:[8,2,1,""],msg:[8,2,1,""],retries_at:[8,2,1,""],started_at:[8,2,1,""]},"ngrok.datatypes.ReservedDomainCertPolicy":{authority:[8,2,1,""],private_key_type:[8,2,1,""]},"ngrok.datatypes.ReservedDomainCertStatus":{provisioning_job:[8,2,1,""],renews_at:[8,2,1,""]},"ngrok.datatypes.ReservedDomainList":{next_page_uri:[8,2,1,""],reserved_domains:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.SSHCertificateAuthority":{"delete":[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],id:[8,2,1,""],key_type:[8,2,1,""],metadata:[8,2,1,""],public_key:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.SSHCertificateAuthorityList":{next_page_uri:[8,2,1,""],ssh_certificate_authorities:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.SSHCredential":{"delete":[8,2,1,""],acl:[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],id:[8,2,1,""],metadata:[8,2,1,""],owner_id:[8,2,1,""],public_key:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.SSHCredentialList":{next_page_uri:[8,2,1,""],ssh_credentials:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.SSHHostCertificate":{"delete":[8,2,1,""],certificate:[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],id:[8,2,1,""],key_type:[8,2,1,""],metadata:[8,2,1,""],principals:[8,2,1,""],public_key:[8,2,1,""],ssh_certificate_authority_id:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""],valid_after:[8,2,1,""],valid_until:[8,2,1,""]},"ngrok.datatypes.SSHHostCertificateList":{next_page_uri:[8,2,1,""],ssh_host_certificates:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.SSHUserCertificate":{"delete":[8,2,1,""],certificate:[8,2,1,""],created_at:[8,2,1,""],critical_options:[8,2,1,""],description:[8,2,1,""],extensions:[8,2,1,""],id:[8,2,1,""],key_type:[8,2,1,""],metadata:[8,2,1,""],principals:[8,2,1,""],public_key:[8,2,1,""],ssh_certificate_authority_id:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""],valid_after:[8,2,1,""],valid_until:[8,2,1,""]},"ngrok.datatypes.SSHUserCertificateList":{next_page_uri:[8,2,1,""],ssh_user_certificates:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.TCPEdge":{"delete":[8,2,1,""],backend:[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],hostports:[8,2,1,""],id:[8,2,1,""],ip_restriction:[8,2,1,""],metadata:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.TCPEdgeList":{next_page_uri:[8,2,1,""],tcp_edges:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.TLSCertificate":{"delete":[8,2,1,""],certificate_pem:[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],extended_key_usages:[8,2,1,""],id:[8,2,1,""],issued_at:[8,2,1,""],issuer_common_name:[8,2,1,""],key_usages:[8,2,1,""],metadata:[8,2,1,""],not_after:[8,2,1,""],not_before:[8,2,1,""],private_key_type:[8,2,1,""],serial_number:[8,2,1,""],subject_alternative_names:[8,2,1,""],subject_common_name:[8,2,1,""],subject_country:[8,2,1,""],subject_locality:[8,2,1,""],subject_organization:[8,2,1,""],subject_organizational_unit:[8,2,1,""],subject_province:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.TLSCertificateList":{next_page_uri:[8,2,1,""],tls_certificates:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.TLSCertificateSANs":{dns_names:[8,2,1,""],ips:[8,2,1,""]},"ngrok.datatypes.TLSEdge":{"delete":[8,2,1,""],backend:[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],hostports:[8,2,1,""],id:[8,2,1,""],ip_restriction:[8,2,1,""],metadata:[8,2,1,""],mutual_tls:[8,2,1,""],tls_termination:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.TLSEdgeList":{next_page_uri:[8,2,1,""],tls_edges:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.Tunnel":{backends:[8,2,1,""],endpoint:[8,2,1,""],forwards_to:[8,2,1,""],id:[8,2,1,""],labels:[8,2,1,""],metadata:[8,2,1,""],proto:[8,2,1,""],public_url:[8,2,1,""],region:[8,2,1,""],started_at:[8,2,1,""],tunnel_session:[8,2,1,""]},"ngrok.datatypes.TunnelGroupBackend":{"delete":[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],id:[8,2,1,""],labels:[8,2,1,""],metadata:[8,2,1,""],tunnels:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.TunnelGroupBackendList":{backends:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.TunnelList":{next_page_uri:[8,2,1,""],tunnels:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.TunnelSession":{agent_version:[8,2,1,""],credential:[8,2,1,""],id:[8,2,1,""],ip:[8,2,1,""],metadata:[8,2,1,""],os:[8,2,1,""],region:[8,2,1,""],started_at:[8,2,1,""],transport:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.TunnelSessionList":{next_page_uri:[8,2,1,""],tunnel_sessions:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.UserAgent":{browser_name:[8,2,1,""],browser_version:[8,2,1,""],device_type:[8,2,1,""],os_name:[8,2,1,""],os_version:[8,2,1,""],raw:[8,2,1,""]},"ngrok.datatypes.WeightedBackend":{"delete":[8,2,1,""],backends:[8,2,1,""],created_at:[8,2,1,""],description:[8,2,1,""],id:[8,2,1,""],metadata:[8,2,1,""],update:[8,2,1,""],uri:[8,2,1,""]},"ngrok.datatypes.WeightedBackendList":{backends:[8,2,1,""],next_page_uri:[8,2,1,""],uri:[8,2,1,""]},"ngrok.services":{APIKeysClient:[2,1,1,""],AbuseReportsClient:[0,1,1,""],AgentIngressesClient:[1,1,1,""],ApplicationSessionsClient:[3,1,1,""],ApplicationUsersClient:[4,1,1,""],CertificateAuthoritiesClient:[5,1,1,""],CredentialsClient:[7,1,1,""],EdgeRouteBackendModuleClient:[9,1,1,""],EdgeRouteCircuitBreakerModuleClient:[10,1,1,""],EdgeRouteCompressionModuleClient:[11,1,1,""],EdgeRouteIPRestrictionModuleClient:[12,1,1,""],EdgeRouteOAuthModuleClient:[13,1,1,""],EdgeRouteOIDCModuleClient:[14,1,1,""],EdgeRouteRequestHeadersModuleClient:[15,1,1,""],EdgeRouteResponseHeadersModuleClient:[16,1,1,""],EdgeRouteSAMLModuleClient:[17,1,1,""],EdgeRouteWebhookVerificationModuleClient:[18,1,1,""],EdgeRouteWebsocketTCPConverterModuleClient:[19,1,1,""],EdgesHTTPSClient:[20,1,1,""],EdgesHTTPSRoutesClient:[21,1,1,""],EdgesTCPClient:[22,1,1,""],EdgesTLSClient:[23,1,1,""],EndpointsClient:[24,1,1,""],EventDestinationsClient:[26,1,1,""],EventSourcesClient:[27,1,1,""],EventSubscriptionsClient:[28,1,1,""],FailoverBackendsClient:[29,1,1,""],HTTPResponseBackendsClient:[30,1,1,""],HTTPSEdgeMutualTLSModuleClient:[31,1,1,""],HTTPSEdgeTLSTerminationModuleClient:[32,1,1,""],IPPoliciesClient:[34,1,1,""],IPPolicyRulesClient:[35,1,1,""],IPRestrictionsClient:[36,1,1,""],ReservedAddrsClient:[37,1,1,""],ReservedDomainsClient:[38,1,1,""],SSHCertificateAuthoritiesClient:[39,1,1,""],SSHCredentialsClient:[40,1,1,""],SSHHostCertificatesClient:[41,1,1,""],SSHUserCertificatesClient:[42,1,1,""],TCPEdgeBackendModuleClient:[43,1,1,""],TCPEdgeIPRestrictionModuleClient:[44,1,1,""],TLSCertificatesClient:[45,1,1,""],TLSEdgeBackendModuleClient:[46,1,1,""],TLSEdgeIPRestrictionModuleClient:[47,1,1,""],TLSEdgeMutualTLSModuleClient:[48,1,1,""],TLSEdgeTLSTerminationModuleClient:[49,1,1,""],TunnelGroupBackendsClient:[50,1,1,""],TunnelSessionsClient:[51,1,1,""],TunnelsClient:[52,1,1,""],WeightedBackendsClient:[53,1,1,""]},"ngrok.services.APIKeysClient":{"delete":[2,2,1,""],create:[2,2,1,""],get:[2,2,1,""],list:[2,2,1,""],update:[2,2,1,""]},"ngrok.services.AbuseReportsClient":{create:[0,2,1,""],get:[0,2,1,""]},"ngrok.services.AgentIngressesClient":{"delete":[1,2,1,""],create:[1,2,1,""],get:[1,2,1,""],list:[1,2,1,""],update:[1,2,1,""]},"ngrok.services.ApplicationSessionsClient":{"delete":[3,2,1,""],get:[3,2,1,""],list:[3,2,1,""]},"ngrok.services.ApplicationUsersClient":{"delete":[4,2,1,""],get:[4,2,1,""],list:[4,2,1,""]},"ngrok.services.CertificateAuthoritiesClient":{"delete":[5,2,1,""],create:[5,2,1,""],get:[5,2,1,""],list:[5,2,1,""],update:[5,2,1,""]},"ngrok.services.CredentialsClient":{"delete":[7,2,1,""],create:[7,2,1,""],get:[7,2,1,""],list:[7,2,1,""],update:[7,2,1,""]},"ngrok.services.EdgeRouteBackendModuleClient":{"delete":[9,2,1,""],get:[9,2,1,""],replace:[9,2,1,""]},"ngrok.services.EdgeRouteCircuitBreakerModuleClient":{"delete":[10,2,1,""],get:[10,2,1,""],replace:[10,2,1,""]},"ngrok.services.EdgeRouteCompressionModuleClient":{"delete":[11,2,1,""],get:[11,2,1,""],replace:[11,2,1,""]},"ngrok.services.EdgeRouteIPRestrictionModuleClient":{"delete":[12,2,1,""],get:[12,2,1,""],replace:[12,2,1,""]},"ngrok.services.EdgeRouteOAuthModuleClient":{"delete":[13,2,1,""],get:[13,2,1,""],replace:[13,2,1,""]},"ngrok.services.EdgeRouteOIDCModuleClient":{"delete":[14,2,1,""],get:[14,2,1,""],replace:[14,2,1,""]},"ngrok.services.EdgeRouteRequestHeadersModuleClient":{"delete":[15,2,1,""],get:[15,2,1,""],replace:[15,2,1,""]},"ngrok.services.EdgeRouteResponseHeadersModuleClient":{"delete":[16,2,1,""],get:[16,2,1,""],replace:[16,2,1,""]},"ngrok.services.EdgeRouteSAMLModuleClient":{"delete":[17,2,1,""],get:[17,2,1,""],replace:[17,2,1,""]},"ngrok.services.EdgeRouteWebhookVerificationModuleClient":{"delete":[18,2,1,""],get:[18,2,1,""],replace:[18,2,1,""]},"ngrok.services.EdgeRouteWebsocketTCPConverterModuleClient":{"delete":[19,2,1,""],get:[19,2,1,""],replace:[19,2,1,""]},"ngrok.services.EdgesHTTPSClient":{"delete":[20,2,1,""],create:[20,2,1,""],get:[20,2,1,""],list:[20,2,1,""],update:[20,2,1,""]},"ngrok.services.EdgesHTTPSRoutesClient":{"delete":[21,2,1,""],create:[21,2,1,""],get:[21,2,1,""],update:[21,2,1,""]},"ngrok.services.EdgesTCPClient":{"delete":[22,2,1,""],create:[22,2,1,""],get:[22,2,1,""],list:[22,2,1,""],update:[22,2,1,""]},"ngrok.services.EdgesTLSClient":{"delete":[23,2,1,""],create:[23,2,1,""],get:[23,2,1,""],list:[23,2,1,""],update:[23,2,1,""]},"ngrok.services.EndpointsClient":{get:[24,2,1,""],list:[24,2,1,""]},"ngrok.services.EventDestinationsClient":{"delete":[26,2,1,""],create:[26,2,1,""],get:[26,2,1,""],list:[26,2,1,""],update:[26,2,1,""]},"ngrok.services.EventSourcesClient":{"delete":[27,2,1,""],create:[27,2,1,""],get:[27,2,1,""],list:[27,2,1,""],update:[27,2,1,""]},"ngrok.services.EventSubscriptionsClient":{"delete":[28,2,1,""],create:[28,2,1,""],get:[28,2,1,""],list:[28,2,1,""],update:[28,2,1,""]},"ngrok.services.FailoverBackendsClient":{"delete":[29,2,1,""],create:[29,2,1,""],get:[29,2,1,""],list:[29,2,1,""],update:[29,2,1,""]},"ngrok.services.HTTPResponseBackendsClient":{"delete":[30,2,1,""],create:[30,2,1,""],get:[30,2,1,""],list:[30,2,1,""],update:[30,2,1,""]},"ngrok.services.HTTPSEdgeMutualTLSModuleClient":{"delete":[31,2,1,""],get:[31,2,1,""],replace:[31,2,1,""]},"ngrok.services.HTTPSEdgeTLSTerminationModuleClient":{"delete":[32,2,1,""],get:[32,2,1,""],replace:[32,2,1,""]},"ngrok.services.IPPoliciesClient":{"delete":[34,2,1,""],create:[34,2,1,""],get:[34,2,1,""],list:[34,2,1,""],update:[34,2,1,""]},"ngrok.services.IPPolicyRulesClient":{"delete":[35,2,1,""],create:[35,2,1,""],get:[35,2,1,""],list:[35,2,1,""],update:[35,2,1,""]},"ngrok.services.IPRestrictionsClient":{"delete":[36,2,1,""],create:[36,2,1,""],get:[36,2,1,""],list:[36,2,1,""],update:[36,2,1,""]},"ngrok.services.ReservedAddrsClient":{"delete":[37,2,1,""],create:[37,2,1,""],get:[37,2,1,""],list:[37,2,1,""],update:[37,2,1,""]},"ngrok.services.ReservedDomainsClient":{"delete":[38,2,1,""],create:[38,2,1,""],delete_certificate:[38,2,1,""],delete_certificate_management_policy:[38,2,1,""],get:[38,2,1,""],list:[38,2,1,""],update:[38,2,1,""]},"ngrok.services.SSHCertificateAuthoritiesClient":{"delete":[39,2,1,""],create:[39,2,1,""],get:[39,2,1,""],list:[39,2,1,""],update:[39,2,1,""]},"ngrok.services.SSHCredentialsClient":{"delete":[40,2,1,""],create:[40,2,1,""],get:[40,2,1,""],list:[40,2,1,""],update:[40,2,1,""]},"ngrok.services.SSHHostCertificatesClient":{"delete":[41,2,1,""],create:[41,2,1,""],get:[41,2,1,""],list:[41,2,1,""],update:[41,2,1,""]},"ngrok.services.SSHUserCertificatesClient":{"delete":[42,2,1,""],create:[42,2,1,""],get:[42,2,1,""],list:[42,2,1,""],update:[42,2,1,""]},"ngrok.services.TCPEdgeBackendModuleClient":{"delete":[43,2,1,""],get:[43,2,1,""],replace:[43,2,1,""]},"ngrok.services.TCPEdgeIPRestrictionModuleClient":{"delete":[44,2,1,""],get:[44,2,1,""],replace:[44,2,1,""]},"ngrok.services.TLSCertificatesClient":{"delete":[45,2,1,""],create:[45,2,1,""],get:[45,2,1,""],list:[45,2,1,""],update:[45,2,1,""]},"ngrok.services.TLSEdgeBackendModuleClient":{"delete":[46,2,1,""],get:[46,2,1,""],replace:[46,2,1,""]},"ngrok.services.TLSEdgeIPRestrictionModuleClient":{"delete":[47,2,1,""],get:[47,2,1,""],replace:[47,2,1,""]},"ngrok.services.TLSEdgeMutualTLSModuleClient":{"delete":[48,2,1,""],get:[48,2,1,""],replace:[48,2,1,""]},"ngrok.services.TLSEdgeTLSTerminationModuleClient":{"delete":[49,2,1,""],get:[49,2,1,""],replace:[49,2,1,""]},"ngrok.services.TunnelGroupBackendsClient":{"delete":[50,2,1,""],create:[50,2,1,""],get:[50,2,1,""],list:[50,2,1,""],update:[50,2,1,""]},"ngrok.services.TunnelSessionsClient":{get:[51,2,1,""],list:[51,2,1,""],restart:[51,2,1,""],stop:[51,2,1,""],update:[51,2,1,""]},"ngrok.services.TunnelsClient":{get:[52,2,1,""],list:[52,2,1,""]},"ngrok.services.WeightedBackendsClient":{"delete":[53,2,1,""],create:[53,2,1,""],get:[53,2,1,""],list:[53,2,1,""],update:[53,2,1,""]},ngrok:{Client:[6,1,1,""],Error:[25,3,1,""],NotFoundError:[25,3,1,""],datatypes:[8,0,0,"-"],services:[53,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","exception","Python exception"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:exception"},terms:{"100":8,"10000":[8,53],"102":8,"128":8,"2048":39,"255":[1,2,5,7,8,20,21,22,23,26,28,34,35,36,39,40,41,42,45],"3339":[8,41,42],"404":25,"4096":[0,1,2,5,7,8,20,21,22,23,26,28,34,35,36,37,38,39,40,41,42,45],"509":8,"abstract":33,"break":51,"byte":[0,1,2,5,7,8,20,21,22,23,26,34,35,36,37,38,39,40,41,42,45],"catch":25,"char":[8,28],"class":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],"default":[2,7,8,37,38,40,41,42],"float":8,"import":[6,33],"int":[8,25,30,39,53],"long":8,"new":[0,1,2,5,7,26,29,34,35,36,37,38,39,40,41,42,45,50,51,53],"null":[8,21,26,38],"public":[6,8,36,40,41,42],"return":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],"true":[8,36],"try":[25,33],AWS:8,CAs:8,DNS:8,For:[7,8,40],IDs:28,IPs:[6,8,34,35,36],One:8,SNS:8,TLS:[5,6,8,33,38],That:33,The:[1,2,6,7,8,25,26,27,33,40,41,42,51,53],Then:6,There:[20,21,22,23],These:[8,42],__iter__:33,_acm:8,abil:[8,42],abl:8,about:[0,5,7,8,25,26,29,34,35,36,39,40,41,42,45,50,53],abus:[6,8,33],abuse_report:[0,6],abusereport:[0,8],abusereporthostnam:8,abusereportscli:[0,6],accept:[8,26],access:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],account:[0,1,2,3,4,5,6,7,8,20,22,23,24,26,28,29,34,35,36,37,38,39,40,41,42,45,50,51,52,53],accuraci:8,acl:[7,8,40],acme_challenge_cname_target:8,action:[6,7,8,25,33,34,35,40],activ:[6,8,24],adapt:[8,21],add:[6,7,8,27],addit:[8,25,27,33,42],addr:[8,37],address:[1,6,7,8,33,40,41,42],admin:[2,7,8,40],advertis:8,after:[8,33,51],against:[8,25],agent:[6,7,8,33,36,51,52],agent_ingress:[1,6],agent_vers:8,agentingress:[1,8],agentingressescli:[1,6],agentingresslist:[1,8],all:[1,2,3,4,5,6,7,8,20,22,23,24,25,26,29,33,34,35,36,37,38,39,40,41,42,45,50,51,52,53],allow:[0,6,7,8,25,33,34,35,36,40,41,51],allow_idp_initi:8,along:[6,41],alreadi:[8,51],also:[6,8,34,45],altern:8,alwai:8,amazon:8,among:[50,53],amount:[8,51],ani:[8,25,33,34,42,51],anoth:34,anyth:26,api:[0,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],api_kei:[2,6],apikei:[2,8],apikeylist:[2,8],apikeyscli:[2,6],app:[8,38,50],appli:[6,8,26,34,35,36],applic:[8,33],application_sess:[3,6,8],application_us:[4,6,8],applicationsess:[3,8],applicationsessionlist:[3,8],applicationsessionscli:[3,6],applicationus:[4,8],applicationuserlist:[4,8],applicationuserscli:[4,6],arbitrari:[0,1,2,5,7,8,20,21,22,23,25,26,28,29,30,34,35,36,37,38,39,40,41,42,45,50,53],arn:8,arrai:8,ask:8,aspect:[6,36],assert:[6,8,41],assertion_consumer_service_url:8,assign:[2,6,7,8,25,37,40,53],associ:[6,8,24,26,34],assum:8,attach:[5,6,8,27,34,35,36,38,45],attempt:29,attribut:[1,2,5,7,26,34,35,36,37,38,40,45],audienc:8,auth:[8,13],auth_check_interv:8,authent:[2,6,7,8,40,41,42],author:[0,6,7,8,33,41,42],authorized_group:8,authtoken:[6,7,8],autom:[6,45],automat:[6,8,38,45],avail:[0,7,8,51],awai:33,awar:51,aws_access_key_id:8,aws_secret_access_kei:8,awsauth:8,awscredenti:8,awsrol:8,back:8,backend:[6,8,21,22,23,24,33],backend_id:8,balanc:[50,53],ban:8,bar:[8,50],base:[1,8,53],base_url:6,bearer:8,becaus:[8,25],becom:[8,41,42],been:[5,6,8,51],befor:[8,51],before_id:[1,2,3,4,5,7,20,22,23,24,26,28,29,30,34,35,36,37,38,39,40,41,42,45,50,51,52,53],behalf:8,behavior:29,being:8,belong:8,best:25,between:8,bind:[7,8,40],block:25,blog:[8,21],bodi:[8,30],bool:[8,36],bot:[2,7,8,40],both:[8,35],breaker:[8,21,33],browser:8,browser_nam:8,browser_sess:8,browser_vers:8,browsersess:8,bucket:8,bundl:[8,45],ca_pem:[5,8],cach:8,calcul:53,call:[7,8,33,41,42,51],caller:[7,8,25,40,51],can:[1,2,6,7,8,29,33,34,36,37,38,39,40,42,45,51],cannot:[6,37],caus:51,caveat:8,cert:8,certfic:[5,39,41,42],certif:[6,8,33,38],certificate_author:[5,6,8],certificate_authority_id:8,certificate_id:38,certificate_management_polici:[8,38],certificate_management_statu:8,certificate_pem:[8,45],certificateauthor:[5,8],certificateauthoritiescli:[5,6],certificateauthoritylist:[5,8],certifici:8,chain:[8,45],challeng:8,check:[8,25,51],child:[8,29,53],choos:8,chosen:[6,8,37],chrome:8,cidr:[6,8,33,34,35,36],circuit:[8,21,33],circuit_break:[8,21],circumst:51,client:[0,1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],client_id:8,client_secret:8,cloud:8,cloudwatch:8,cloudwatch_log:[8,26],cname:[6,8,38],cname_target:8,code:[8,25,30,33,51],com:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],command:[6,7,8,42,51],common:[7,8,25,40],compat:51,complet:[20,21,22,23,51],compress:[8,21,33],concaten:8,condit:[8,25],config:[6,7],configur:[1,6,7,8,20,21,22,23,34,38,51],connect:[1,6,7,8,29,34,36,38,41,42,51],consid:[8,41],construct:[0,1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],consult:[25,33],consum:8,contact:0,contain:[0,8,26,28,38],content:[0,8,30],control:[6,8,34],convert:33,cooki:8,cookie_prefix:8,coordin:8,cor:8,correct:8,correspond:[6,41],could:[25,51],countri:8,country_cod:8,cr_1kyyuneyn6xhhlqymblrj5nxkoz:33,creat:[0,1,2,5,6,7,8,20,21,22,23,25,26,27,28,29,30,33,34,35,36,37,38,39,40,41,42,45,50,53],created_at:8,creation:[2,7,8,40],cred:[6,8,33],credenti:[2,6,8,33],credentiallist:[7,8],credentialscli:[6,7],critic:[8,42],critical_opt:[8,42],current:[8,26,36,41,42,51,52],curv:39,custom:[8,28],danger:[8,41,42],dashboard:[2,6,8,33,34,36],data:[0,1,2,5,7,8,20,21,22,23,26,29,30,34,35,36,37,38,39,40,41,42,45,50,53],datacent:[8,37,38],datatyp:33,defin:[0,1,2,5,6,7,8,20,21,22,23,24,26,29,30,34,35,36,37,38,39,40,41,42,45,50,53],deleg:8,delet:[1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,53],delete_certif:38,delete_certificate_management_polici:38,deliv:8,deliveri:8,delivery_stream_arn:8,deni:[6,8,34,35,42],deposit:8,describ:8,descript:[1,2,5,7,8,20,21,22,23,26,28,29,30,34,35,36,37,38,39,40,41,42,45,50,53],desktop:8,destin:[8,28,33],destination_id:28,detach:38,detail:[0,1,2,5,7,8,25,26,27,29,33,34,35,36,37,38,39,40,41,42,45,50,51,53],devic:8,device_typ:8,direct:8,directli:[0,1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],disabl:[8,38,51],disallow:8,discoveri:8,disk:8,distinguish:25,divid:53,dns_error:8,dns_name:8,doc:[0,1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],document:25,doe:[8,38],domain:[1,6,7,8,33,40,45],done:51,down:[0,6],download:8,dump:33,durat:8,dure:8,dynam:8,each:[6,20,21,22,23,51,53],easier:25,ecdsa:[8,39],ed25519:[8,39],edg:[6,8,24,25,33,38],edge_id:[8,9,10,11,12,13,14,15,16,17,18,19,21],edge_modul:6,edge_route_backend_modul:9,edge_route_circuit_breaker_modul:10,edge_route_compression_modul:11,edge_route_ip_restriction_modul:12,edge_route_o_auth_modul:13,edge_route_oidc_modul:14,edge_route_request_headers_modul:15,edge_route_response_headers_modul:16,edge_route_saml_modul:17,edge_route_webhook_verification_modul:18,edge_route_websocket_tcp_converter_modul:19,edgeroutebackendmodulecli:9,edgeroutecircuitbreakermodulecli:10,edgeroutecompressionmodulecli:11,edgerouteiprestrictionmodulecli:12,edgerouteoauthmodulecli:13,edgerouteoidcmodulecli:14,edgerouterequestheadersmodulecli:15,edgerouteresponseheadersmodulecli:16,edgeroutesamlmodulecli:17,edgeroutewebhookverificationmodulecli:18,edgeroutewebsockettcpconvertermodulecli:19,edges_http:20,edges_https_rout:21,edges_tcp:22,edges_tl:23,edgeshttpscli:20,edgeshttpsroutescli:21,edgestcpcli:22,edgestlscli:23,either:[8,35],ellipt:39,elliptic_curv:39,els:25,email:8,email_address:8,email_domain:8,enabl:[6,8,45],encapsul:[8,25,26],encod:[8,40,45],endpoint:[6,8,33,34,36,51,52],endpointbackend:[8,9,43,46],endpointbackendmut:[8,9,21,22,23,43,46],endpointcircuitbreak:[8,10,21],endpointcompress:[8,11,21],endpointippolici:[8,12,44,47],endpointippolicymut:[8,12,21,22,23,44,47],endpointlist:[8,24],endpointmutualtl:[8,31,48],endpointmutualtlsmut:[8,20,23,31,48],endpointoauth:[8,13,21],endpointoauthamazon:8,endpointoauthfacebook:8,endpointoauthgithub:8,endpointoauthgitlab:8,endpointoauthgoogl:8,endpointoauthlinkedin:8,endpointoauthmicrosoft:8,endpointoauthprovid:8,endpointoauthtwitch:8,endpointoidc:[8,14,21],endpointrequesthead:[8,15,21],endpointresponsehead:[8,16,21],endpointsaml:[8,17],endpointsamlmut:[8,17,21],endpointscli:[6,24],endpointtlstermin:[8,23,32,49],endpointtlsterminationatedg:[8,20,32],endpointwebhookvalid:[8,18,21],endpointwebsockettcpconvert:[8,19,21],enforc:[6,8,36],ensur:25,entiti:8,entity_id:8,entitydescriptor:8,entri:[6,35],enumer:8,ephemer:8,equival:[7,8,40],err_ngrok_7104:25,error:8,error_cod:[8,25,33],error_threshold_percentag:8,establish:29,etc:[7,8,40],evalu:8,even:8,event:[8,33],event_destin:[6,8,26],event_sourc:[6,27],event_subscript:[6,8,28],eventdestin:[8,26],eventdestinationlist:[8,26],eventdestinationscli:[6,26],eventsourc:[8,27],eventsourcelist:[8,27],eventsourcereplac:[8,28],eventsourcescli:[6,27],eventsubscript:[8,28],eventsubscriptionlist:[8,28],eventsubscriptionscli:[6,28],eventtarget:[8,26],eventtargetcloudwatchlog:8,eventtargetfirehos:8,eventtargetkinesi:8,exact_path:[8,21],exactli:[8,26],exampl:[7,8,21,38,40],exceed:8,except:[8,33],exclus:38,exec:51,exist:[20,21,22,23],exit:51,expect:8,expir:8,expires_at:8,explain:25,explicitli:[7,8,40],expos:[6,52],express:8,extend:8,extended_key_usag:8,extens:[8,42],face:[6,36],facebook:8,fail:[8,25,33,51],failov:[8,33],failover_backend:29,failoverbackend:[8,29],failoverbackendlist:[8,29],failoverbackendscli:29,fals:[8,36],fetch:33,field:25,file:[6,7,8],firehos:[8,26],first:[2,6,8,25,29,33,45],fix:[8,30],flow:8,follow:[8,26,42,51],foo:[8,50],forc:[8,42],force_authn:8,form:8,format:[8,26,41,42],forward:[8,42],forwards_to:8,four:[8,36],from:[2,6,8,33,40],full:[8,38],futur:[7,41],gatewai:[6,40],gener:[1,2,7,8,39],geograph:[8,37,38],geoloc:8,get:[0,1,2,3,4,5,7,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],giraff:33,github:8,gitlab:8,given:[8,27],googl:8,group:[6,8,33,34],guarante:[8,25],handshak:8,happen:25,has:[5,6,8,34,36,51],have:[6,7,8,40,45],header:[8,21,30,33],health:8,help:8,helper:33,highli:8,holder:[8,42],host:[0,6,8,33,39,42],hostcertif:8,hostnam:[6,8,37,38,41],hostport:[6,8,20,22,23,24,25],hour:42,how:[8,26],howev:[20,21,22,23],http:[0,1,2,3,4,5,6,7,8,22,23,24,25,26,27,28,29,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],http_response_backend:30,http_status_cod:[25,33],httpresponsebackend:[8,30],httpresponsebackendlist:[8,30],httpresponsebackendscli:30,https_edg:8,https_edge_mutual_tls_modul:31,https_edge_tls_termination_modul:32,httpsedg:[8,20],httpsedgelist:[8,20],httpsedgemutualtlsmodulecli:31,httpsedgerout:[8,21],httpsedgetlsterminationmodulecli:32,human:[1,2,5,7,8,20,21,22,23,25,26,28,29,30,34,35,36,37,38,39,40,41,42,45,50,53],ident:8,identifi:[0,1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],identity_provid:8,identityprovid:8,idp:8,idp_metadata:8,ids:[8,29,53],ignor:8,implement:[8,33],inact:8,inactivity_timeout:8,includ:[5,6,7,8,25,40,41,42,51],increas:8,indic:[8,25],industri:8,inform:[5,7,8,26,28,29,33,34,35,36,39,40,41,42,45,50,53],ingress:[6,8,33,36],initi:[6,8,36],inject:8,instal:[6,7],instanc:[6,51],instead:[0,1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],instruct:51,integ:8,integr:51,intend:[8,28],internal_error:8,interpret:[8,42],introspect:25,invalid:[8,41,42],invok:[25,33],ip_address:8,ip_polici:[6,8,25,33,34],ip_policy_id:[8,33,35,36],ip_policy_rul:[6,8,33,35],ip_restrict:[6,8,21,22,23,36],ippolici:[8,34],ippoliciescli:[6,34],ippolicylist:[8,34],ippolicyrul:[8,35],ippolicyrulelist:[8,35],ippolicyrulescli:[6,35],iprestrict:[8,36],iprestrictionlist:[8,36],iprestrictionscli:[6,36],ips:8,ipv4:[6,8,35],ipv6:[6,8,35],isn:8,iso:8,issu:[8,36,41,42,51],issued_at:8,issuer:8,issuer_common_nam:8,its:[6,8,39,41,53],itself:[2,6,33,51],job:8,json:[8,26,33],kei:[5,6,7,8,33,39,40,41,42,45],key_siz:39,key_typ:8,key_usag:8,keypair:[8,40],kind:25,kinesi:[8,26],label:[7,8,40,50],last:8,last_act:8,last_login:8,lat_long_radius_km:8,latest:51,latitud:8,lead:[7,8,40],leaf:[8,45],least:51,leav:[8,26],letsencrypt:8,level:8,librari:[6,33],like:[8,26,33,38],limit:[1,2,3,4,5,7,8,20,22,23,24,26,28,29,30,34,35,36,37,38,39,40,41,42,45,50,51,52,53],linkedin:8,list:[0,1,2,3,4,5,6,7,8,20,22,23,24,25,26,27,28,29,30,33,34,35,36,37,38,39,40,41,42,45,50,51,52,53],listen:[6,37,38],local:8,locat:8,log:[6,8,36,42],log_group_arn:8,login:8,logout:8,longer:8,longitud:8,low:8,machin:[1,5,7,8,20,21,22,23,26,28,29,30,34,35,36,37,38,39,40,41,42,45,50,53],maco:8,mai:[2,6,7,8,25,38,40,42,45],major:51,make:[6,8,25,35,36,51],manag:[2,6,8,38],mani:8,manual:51,map:[8,30,42,50,53],match:[6,7,8,21,40,45,50],match_typ:[8,21],max:[0,1,2,5,7,8,20,21,22,23,26,28,34,35,36,37,38,39,40,41,42,45],maximum:8,maximum_dur:8,member:8,messag:[8,25,33],metadata:[0,1,2,5,7,8,20,21,22,23,26,28,29,30,33,34,35,36,37,38,39,40,41,42,45,50,53],metadata_url:8,method:25,metric:8,microsoft:8,min_vers:8,minimum:8,modifi:[20,21,22,23],modul:[5,6,8,20,21,22,23,33,34],more:[6,8,42,51],most:8,msg:8,mtl:[5,6],multipl:[7,8,40],must:[6,7,8,26,42,51],mutual:[5,6,33,38],mutual_tl:[8,20,23],nake:25,name:[1,8,38],nameid:8,nameid_format:8,necessari:[8,33],need:[2,6,7,8,33],network:[8,25],never:51,next:[8,29],next_page_uri:8,ngrok:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],non:8,none:[1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],not_aft:8,not_befor:8,notabl:51,notat:[8,35],notfounderror:25,ns_target:8,num_bucket:8,number:[8,42],oasi:8,oauth:[8,21,33],object:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],offici:33,offlin:29,oidc:[8,21,33],one:[6,8,26,29,33,39,41,51],onli:[0,2,5,6,7,8,24,26,36,40,42],onlin:[8,33,50,51,52],open:[7,8,40,42],openid:8,openssh:[8,41,42],oper:[8,25,51],operation_id:25,operationid:25,option:[0,1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],options_passthrough:8,order:[8,29],org:8,organ:8,organiz:8,os_nam:8,os_vers:8,other:[2,5,6,7,8,25,39,40],otherwis:8,our:[0,25],out:8,output:[8,26],over:8,own:[1,2,6,8,38],owner:[2,7,8,40],owner_id:[2,7,8,40],ownership:[2,7,8,40],packag:33,page:[2,6,8],pair:[6,8,39,45],paramet:[0,1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],pars:8,partially_process:8,pass:8,path_prefix:[8,21],pem:[5,8,40,45],pend:8,percentag:[8,53],period:8,perman:8,permiss:[8,42],permit:[7,8,40,42],persist:8,pip:33,place:[6,8,36],platform:51,pleas:51,point:[6,8,25,38],polici:[6,8,33,36,38],port:[6,8,25,37,42],portion:8,predefin:[8,42],prefer:8,prefix:8,present:[5,6,8,42],princip:[8,41,42],print:[6,33],privat:[5,6,8,39,41,45],private_key_pem:45,private_key_typ:[8,39],process:[8,51],prompt:8,prop:8,properti:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],proportion:53,proto:8,protocol:[8,42],provid:[6,8,24,52],provider_user_id:8,provinc:8,provis:[2,6,8,45],provisioning_job:8,pty:[8,42],pub:8,public_kei:[8,40,41,42],public_url:8,pull:8,purpos:[8,34,42],python:33,qualifi:8,queri:[6,24],radiu:8,rais:25,rang:[6,8,34,35],raw:[5,8],readabl:[1,2,5,7,8,20,21,22,23,25,26,28,29,30,34,35,36,37,38,39,40,41,42,45,50,53],reauthent:8,recent:8,recheck:8,recommend:8,reconnect:51,record:[6,8,38],redirect:8,ref:8,refer:8,referenc:[8,26,29,34,53],refresh:8,region:[1,8,37,38],region_domain:8,relat:8,relayst:8,reli:8,remain:34,remov:[8,27],renew:8,renews_at:8,replac:[9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,31,32,43,44,46,47,48,49],report:[6,8,33],repres:[6,51],request:[0,6,8,21,25,33,36,51],request_head:[8,21],request_signing_certificate_pem:8,requir:8,reserv:[6,8,33],reserved_addr:[6,8,37],reserved_domain:[6,8,38],reservedaddr:[8,37],reservedaddrlist:[8,37],reservedaddrscli:[6,37],reserveddomain:[8,38],reserveddomaincertjob:8,reserveddomaincertpolici:[8,38],reserveddomaincertstatu:8,reserveddomainlist:[8,38],reserveddomainscli:[6,38],resourc:[0,1,2,3,4,5,6,7,8,20,22,23,24,26,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],respons:[0,7,8,21,25,33],response_head:[8,21],rest:[8,26],restart:51,restrict:[6,7,8,21,33,34,40],retain:8,retri:[8,25],retries_at:8,retriev:8,reusabl:[6,34],revers:[6,51,52],review:0,revok:8,rfc:[8,41,42],robustli:25,role:8,role_arn:8,roll:8,rolling_window:8,root:6,rout:[8,33],rsa:[8,39],rule:[6,7,8,33,34,40],run:[6,8,51,52],runtimeerror:25,safe:8,same:8,saml:[8,21,33],san:8,save:7,scope:8,second:[8,51],secret:8,section:33,secur:7,see:[8,42,45],selector:[8,21,50],send:[8,26],sent:[8,29],separ:25,sequenc:[0,7,8,20,22,23,28,29,36,40,41,42],serial:[8,26],serial_numb:8,serv:[6,8,20,22,23,24,41],server:[6,8,25,38,41,42],server_nam:33,servic:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],session:[6,7,8,33,34,52],set:[1,8,36],should:[8,28,51],sign:[5,6,8,39,41,42],simpl:25,singl:[8,33],single_logout_url:8,size:39,slug:8,some:[25,33,51],someth:25,sourc:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],spec:[8,42],specif:[6,8,25,33,36],specifi:[2,6,7,8,20,21,22,23,35,38,40,41,42],ssh:[6,8,33,51,52],ssh_certificate_author:[6,8,39],ssh_certificate_authority_id:[8,41,42],ssh_credenti:[6,8,40],ssh_host_certif:[6,8,41],ssh_user_certif:[6,8,42],sshcertificateauthor:[8,39],sshcertificateauthoritiescli:[6,39],sshcertificateauthoritylist:[8,39],sshcredenti:[8,40],sshcredentiallist:[8,40],sshcredentialscli:[6,40],sshd_config:8,sshhostcertif:[8,41],sshhostcertificatelist:[8,41],sshhostcertificatescli:[6,41],sshusercertif:[8,42],sshusercertificatelist:[8,42],sshusercertificatescli:[6,42],start:[6,7,8,34,36,40,51],started_at:8,state:8,statist:8,statu:[0,8,24,25,30,33,51,52],status:8,status_cod:[8,30],still:[8,26,51],stop:51,str:[0,1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],stream:8,stream_arn:8,string:[8,25],subclass:25,subdomain:[8,38],subject:8,subject_alternative_nam:8,subject_common_nam:8,subject_countri:8,subject_loc:8,subject_organ:8,subject_organizational_unit:8,subject_provinc:8,submit:[0,6],subnet:33,subscript:[8,26,27,33],subscription_id:27,subset:8,success:29,successfulli:51,suffix:[7,8,40],sum:53,suppli:[2,7,8,28,40],support:[8,35,36,51],suspect:[0,8],system:[0,8,25],take:[0,6,8,25],taken:8,target:[8,26,38],tcp:[6,8,21,33,37],tcp_addr:8,tcp_edg:8,tcp_edge_backend_modul:43,tcp_edge_ip_restriction_modul:44,tcpedg:[8,22],tcpedgebackendmodulecli:43,tcpedgeiprestrictionmodulecli:44,tcpedgelist:[8,22],team:[0,8],temporari:8,term:[0,6,8],termin:[6,8,33,42,45],terminate_at:8,than:[2,7,8,40],thei:[6,7,8,34,37,45],them:8,themselv:[2,7,8,40],thi:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],threshold:8,through:8,thrown:25,thu:[5,6],time:[7,8,40,41,42,51],timedelta:8,timestamp:8,tls:[6,8,23,31,32,38,45,46,47,48,49],tls_certif:[6,8,45],tls_edg:8,tls_edge_backend_modul:46,tls_edge_ip_restriction_modul:47,tls_edge_mutual_tls_modul:48,tls_edge_tls_termination_modul:49,tls_termin:[8,20,23],tlscertif:[8,45],tlscertificatelist:[8,45],tlscertificatesan:8,tlscertificatescli:[6,45],tlsedg:[8,23],tlsedgebackendmodulecli:46,tlsedgeiprestrictionmodulecli:47,tlsedgelist:[8,23],tlsedgemutualtlsmodulecli:48,tlsedgetlsterminationmodulecli:49,togeth:8,token:[7,8,40],top:8,trace:25,traffic:[6,8,29,33,34,36,37,38,41,45,50,53],transpar:33,transport:8,treat:34,trigger:[8,27,28],trip:8,tripped_dur:8,trust:[6,41,42],tunabl:8,tune:8,tunnel:[6,8,24,33,34,40],tunnel_group_backend:50,tunnel_sess:[6,8,51],tunnelgroup:[8,50],tunnelgroupbackend:[8,50],tunnelgroupbackendlist:[8,50],tunnelgroupbackendscli:50,tunnellist:[8,52],tunnelscli:[6,52],tunnelsess:[8,51],tunnelsessionlist:[8,51],tunnelsessionscli:[6,51],twitch:8,two:[8,42],type:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],unban:8,undefin:25,underli:8,understand:[8,42],unexpect:25,uniqu:[8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28],unit:8,unspecifi:[7,8,40,41,42],until:[6,26,29,34,45],unus:[6,45],updat:[1,2,5,7,8,20,21,22,23,26,27,28,29,30,33,34,35,36,37,38,39,40,41,42,45,50,51,53],updated_at:8,upload:[5,8,38,40,45],upstream:8,uri:8,url:[0,6,8,25],urn:8,use:[1,2,6,7,8,20,21,22,23,25,38,39,40],used:[1,2,5,6,7,8,20,21,22,23,24,28,34,36,37,38,39,40,41,42,45],user:[0,1,2,5,6,7,8,20,21,22,23,26,29,30,33,34,35,36,37,38,39,40,41,45,50,53],user_ag:8,userag:8,usernam:[8,42],uses:[2,8],using:[8,51],valid:[5,6,8,21,25,33,41,42],valid_aft:[8,41,42],valid_befor:[8,41,42],valid_until:[8,41,42],valu:[7,8,20,21,22,23,26,36,40,41,42],verif:[8,21,33],verifi:[5,6],version:[8,51],via:[1,6,20,21,22,23,34,40],violat:[0,6],visit:8,volum:8,volume_threshold:8,wai:[20,21,22,23],wait:[8,51],want:8,warn:[8,36],watch:[8,50],webhook:[8,21,33],webhook_verif:[8,21],websocket:[8,21,33],websocket_tcp_convert:[8,21],weight:[8,33],weighted_backend:53,weightedbackend:[8,53],weightedbackendlist:[8,53],weightedbackendscli:53,well:[8,33],what:[2,6,7,8,20,21,22,23,24,36,37,38,40],when:[6,8,25,26,33,39,41,42,51],whenev:8,where:[8,26],whether:8,which:[0,6,7,8,24,27,28,33,36,40,45,51],who:[6,7,8,40,41],why:[8,25],wildcard:[7,8,40],window:[8,51],wish:51,within:29,without:[25,33],work:33,would:[7,8,26,40],x11:[8,42],x509:[5,6,45],xml:8,year:41,yet:51,yml:[6,7],you:[0,1,2,6,7,8,25,26,33,34,38,40,45,51],your:[2,6,7,8,26,33,36,40,51],yourself:7,zero:34},titles:["Abuse Reports","Agent Ingresses","API Keys","Application Sessions","Application Users","Certificate Authorities","Client","Tunnel Credentials","Datatypes","HTTPS Edge Route Backend Module","HTTPS Edge Route Circuit Breaker Module","HTTPS Edge Route Compression Module","HTTPS Edge Route IP Restriction Module","HTTPS Edge Route OAuth Module","HTTPS Edge Route OIDC Module","HTTPS Edge Route Request Headers Module","HTTPS Edge Route Response Headers Module","HTTPS Edge Route SAML Module","HTTPS Edge Route Webhook Verification Module","HTTPS Edge Route Websocket TCP Converter Module","HTTPS Edges","HTTPS Edge Routes","TCP Edges","TLS Edges","Endpoints","Errors","Event Destinations","Event Sources","Event Subscriptions","Failover Backends","HTTP Response Backends","HTTPS Edge Mutual TLS Module","HTTPS Edge TLS Termination Module","ngrok-api","IP Policies","IP Policy Rules","IP Restrictions","Reserved Addresses","Reserved Domains","SSH Certificate Authorities","SSH Credentials","SSH Host Certificates","SSH User Certificates","TCP Edge Backend Module","TCP Edge IP Restriction Module","TLS Certificates","TLS Edge Backend Module","TLS Edge IP Restriction Module","TLS Edge Mutual TLS Module","TLS Edge TLS Termination Module","Tunnel Group Backends","Tunnel Sessions","Tunnels","Weighted Backends"],titleterms:{"class":25,TLS:[23,31,32,45,46,47,48,49],abus:0,address:37,agent:1,api:[2,33],applic:[3,4],author:[5,39],automat:33,backend:[9,29,30,43,46,50,53],breaker:10,certif:[5,39,41,42,45],circuit:10,client:6,compress:11,convert:19,credenti:[7,40],datatyp:8,destin:26,domain:38,edg:[9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,31,32,43,44,46,47,48,49],endpoint:24,error:[25,33],event:[26,27,28],exampl:33,except:25,failov:29,get:33,group:50,handl:[25,33],header:[15,16],host:41,http:[9,10,11,12,13,14,15,16,17,18,19,20,21,30,31,32],ingress:1,instal:33,instanc:33,kei:2,method:33,modul:[9,10,11,12,13,14,15,16,17,18,19,31,32,43,44,46,47,48,49],mutual:[31,48],ngrok:33,oauth:13,oidc:14,page:33,polici:[34,35],quickstart:33,refer:33,report:0,request:15,reserv:[37,38],respons:[16,30],restrict:[12,36,44,47],rout:[9,10,11,12,13,14,15,16,17,18,19,21],rule:35,saml:17,servic:33,session:[3,51],sourc:27,ssh:[39,40,41,42],start:33,subscript:28,tcp:[19,22,43,44],termin:[32,49],tunnel:[7,50,51,52],user:[4,42],verif:18,webhook:18,websocket:19,weight:53}}) \ No newline at end of file diff --git a/docs/ssh_certificate_authorities.html b/docs/ssh_certificate_authorities.html index 888156f..e9e909c 100644 --- a/docs/ssh_certificate_authorities.html +++ b/docs/ssh_certificate_authorities.html @@ -118,6 +118,8 @@
    • Abuse Reports
    • Agent Ingresses
    • API Keys
    • +
    • Application Sessions
    • +
    • Application Users
    • Failover Backends
    • HTTP Response Backends
    • Tunnel Group Backends
    • diff --git a/docs/ssh_credentials.html b/docs/ssh_credentials.html index 0c66475..d78fb08 100644 --- a/docs/ssh_credentials.html +++ b/docs/ssh_credentials.html @@ -118,6 +118,8 @@
    • Abuse Reports
    • Agent Ingresses
    • API Keys
    • +
    • Application Sessions
    • +
    • Application Users
    • Failover Backends
    • HTTP Response Backends
    • Tunnel Group Backends
    • @@ -188,15 +190,16 @@ via the ngrok SSH tunnel gateway.

      -create(public_key, description='', metadata='', acl=[])[source]
      +create(public_key, description='', metadata='', acl=[], owner_id=None)[source]

      Create a new ssh_credential from an uploaded public SSH key. This ssh credential can be used to start new tunnels via ngrok’s SSH gateway.

      Parameters
      • description (str) – human-readable description of who or what will use the ssh credential to authenticate. Optional, max 255 bytes.

      • metadata (str) – arbitrary user-defined machine-readable data of this ssh credential. Optional, max 4096 bytes.

      • -
      • acl (Sequence[str]) – optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the bind rule. The bind rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule bind:example.ngrok.io. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of bind:*.example.com which will allow x.example.com, y.example.com, *.example.com, etc. A rule of '*' is equivalent to no acl at all and will explicitly permit all actions.

      • +
      • acl (Sequence[str]) – optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the bind rule. The bind rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule bind:example.ngrok.io. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of bind:*.example.com which will allow x.example.com, y.example.com, *.example.com, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of bind:*=example which will allow x=example, y=example, etc. A rule of '*' is equivalent to no acl at all and will explicitly permit all actions.

      • public_key (str) – the PEM-encoded public key of the SSH keypair that will be used to authenticate

      • +
      • owner_id (Optional[str]) – If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot.

      @@ -263,7 +266,7 @@ via the ngrok SSH tunnel gateway.

    • id (str) –

    • description (Optional[str]) – human-readable description of who or what will use the ssh credential to authenticate. Optional, max 255 bytes.

    • metadata (Optional[str]) – arbitrary user-defined machine-readable data of this ssh credential. Optional, max 4096 bytes.

    • -
    • acl (Optional[Sequence[str]]) – optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the bind rule. The bind rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule bind:example.ngrok.io. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of bind:*.example.com which will allow x.example.com, y.example.com, *.example.com, etc. A rule of '*' is equivalent to no acl at all and will explicitly permit all actions.

    • +
    • acl (Optional[Sequence[str]]) – optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the bind rule. The bind rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule bind:example.ngrok.io. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of bind:*.example.com which will allow x.example.com, y.example.com, *.example.com, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of bind:*=example which will allow x=example, y=example, etc. A rule of '*' is equivalent to no acl at all and will explicitly permit all actions.

    diff --git a/docs/ssh_host_certificates.html b/docs/ssh_host_certificates.html index 6f51952..7275f6b 100644 --- a/docs/ssh_host_certificates.html +++ b/docs/ssh_host_certificates.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/ssh_user_certificates.html b/docs/ssh_user_certificates.html index 9b26f8b..9f8ea06 100644 --- a/docs/ssh_user_certificates.html +++ b/docs/ssh_user_certificates.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • @@ -197,8 +199,9 @@ Certificate Authority used to sign the certificate.

  • ssh_certificate_authority_id (str) – the ssh certificate authority that is used to sign this ssh user certificate

  • public_key (str) – a public key in OpenSSH Authorized Keys format that this certificate signs

  • principals (Sequence[str]) – the list of principals included in the ssh user certificate. This is the list of usernames that the certificate holder may sign in as on a machine authorizing the signing certificate authority. Dangerously, if no principals are specified, this certificate may be used to log in as any user.

  • -
  • critical_options (Mapping[str, str]) – A map of critical options included in the certificate. Only two critical options are currently defined by OpenSSH: force-command and source-address. See the OpenSSH certificate protocol spec <https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.certkeys>`_ for additional details.

  • -
  • extensions (Mapping[str, str]) – A map of extensions included in the certificate. Extensions are additional metadata that can be interpreted by the SSH server for any purpose. These can be used to permit or deny the ability to open a terminal, do port forwarding, x11 forwarding, and more. If unspecified, the certificate will include limited permissions with the following extension map: {"permit-pty": "", "permit-user-rc": ""} OpenSSH understands a number of predefined extensions. See the OpenSSH certificate protocol spec <https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.certkeys>`_ for additional details.

  • +
  • critical_options (Mapping[str, str]) – A map of critical options included in the certificate. Only two critical options are currently defined by OpenSSH: force-command and source-address. See the OpenSSH certificate protocol spec for additional details.

  • +
  • extensions (Mapping[str, str]) –

    A map of extensions included in the certificate. Extensions are additional metadata that can be interpreted by the SSH server for any purpose. These can be used to permit or deny the ability to open a terminal, do port forwarding, x11 forwarding, and more. If unspecified, the certificate will include limited permissions with the following extension map: {"permit-pty": "", "permit-user-rc": ""} OpenSSH understands a number of predefined extensions. See the OpenSSH certificate protocol spec for additional details.

    +

  • valid_after (str) – The time when the user certificate becomes valid, in RFC 3339 format. Defaults to the current time if unspecified.

  • valid_until (str) – The time when this host certificate becomes invalid, in RFC 3339 format. If unspecified, a default value of 24 hours will be used. The OpenSSH certificates RFC calls this valid_before.

  • description (str) – human-readable description of this SSH User Certificate. optional, max 255 bytes.

  • diff --git a/docs/tcp_edge_backend_module.html b/docs/tcp_edge_backend_module.html index 1eea8a9..f97a8c3 100644 --- a/docs/tcp_edge_backend_module.html +++ b/docs/tcp_edge_backend_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/tcp_edge_ip_restriction_module.html b/docs/tcp_edge_ip_restriction_module.html index a4e40e0..da9ec49 100644 --- a/docs/tcp_edge_ip_restriction_module.html +++ b/docs/tcp_edge_ip_restriction_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/tls_certificates.html b/docs/tls_certificates.html index 64ebdec..8562452 100644 --- a/docs/tls_certificates.html +++ b/docs/tls_certificates.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • @@ -198,8 +200,8 @@ automated certificate provisioning.

    • description (str) – human-readable description of this TLS certificate. optional, max 255 bytes.

    • metadata (str) – arbitrary user-defined machine-readable data of this TLS certificate. optional, max 4096 bytes.

    • -
    • certificate_pem (str) – chain of PEM-encoded certificates, leaf first. See Certificate Bundles <https://ngrok.com/docs/api#tls-certificates-pem>`_.

    • -
    • private_key_pem (str) – private key for the TLS certificate, PEM-encoded. See Private Keys <https://ngrok.com/docs/ngrok-link#tls-certificates-key>`_.

    • +
    • certificate_pem (str) – chain of PEM-encoded certificates, leaf first. See Certificate Bundles.

    • +
    • private_key_pem (str) – private key for the TLS certificate, PEM-encoded. See Private Keys.

    diff --git a/docs/tls_edge_backend_module.html b/docs/tls_edge_backend_module.html index 85b69a4..549be9e 100644 --- a/docs/tls_edge_backend_module.html +++ b/docs/tls_edge_backend_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/tls_edge_ip_restriction_module.html b/docs/tls_edge_ip_restriction_module.html index 1381e66..4d433ad 100644 --- a/docs/tls_edge_ip_restriction_module.html +++ b/docs/tls_edge_ip_restriction_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/tls_edge_mutual_tls_module.html b/docs/tls_edge_mutual_tls_module.html index 4dd61da..3fd1c22 100644 --- a/docs/tls_edge_mutual_tls_module.html +++ b/docs/tls_edge_mutual_tls_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/tls_edge_tls_termination_module.html b/docs/tls_edge_tls_termination_module.html index f1d25fb..52f1ea8 100644 --- a/docs/tls_edge_tls_termination_module.html +++ b/docs/tls_edge_tls_termination_module.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/tunnel_group_backends.html b/docs/tunnel_group_backends.html index ba8d06b..2829403 100644 --- a/docs/tunnel_group_backends.html +++ b/docs/tunnel_group_backends.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/tunnel_sessions.html b/docs/tunnel_sessions.html index badbd89..506cc39 100644 --- a/docs/tunnel_sessions.html +++ b/docs/tunnel_sessions.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/tunnels.html b/docs/tunnels.html index 65539cb..d01f540 100644 --- a/docs/tunnels.html +++ b/docs/tunnels.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/docs/weighted_backends.html b/docs/weighted_backends.html index bac4ef8..5205a44 100644 --- a/docs/weighted_backends.html +++ b/docs/weighted_backends.html @@ -118,6 +118,8 @@
  • Abuse Reports
  • Agent Ingresses
  • API Keys
  • +
  • Application Sessions
  • +
  • Application Users
  • Failover Backends
  • HTTP Response Backends
  • Tunnel Group Backends
  • diff --git a/ngrok/client.py b/ngrok/client.py index 6fe6182..f12e10e 100644 --- a/ngrok/client.py +++ b/ngrok/client.py @@ -21,12 +21,20 @@ class Client(object): @property def api_keys(self) -> APIKeysClient: """API Keys are used to authenticate to the `ngrok - API` `_. You may use the API itself + API `_. You may use the API itself to provision and manage API Keys but you'll need to provision your first API - key from the `API Keys page` `_ on your + key from the `API Keys page `_ on your ngrok.com dashboard.""" return APIKeysClient(self) + @property + def application_sessions(self) -> ApplicationSessionsClient: + return ApplicationSessionsClient(self) + + @property + def application_users(self) -> ApplicationUsersClient: + return ApplicationUsersClient(self) + @property def certificate_authorities(self) -> CertificateAuthoritiesClient: """Certificate Authorities are x509 certificates that are used to sign other diff --git a/ngrok/datatypes.py b/ngrok/datatypes.py index 59a1490..37469ba 100644 --- a/ngrok/datatypes.py +++ b/ngrok/datatypes.py @@ -1,5 +1,6 @@ from __future__ import annotations from typing import Any, Mapping, Sequence +from datetime import datetime, timedelta from .iterator import PagedIterator @@ -281,6 +282,11 @@ class APIKey(object): """the bearer token that can be placed into the Authorization header to authenticate request to the ngrok API. **This value is only available one time, on the API response from key creation. Otherwise it is null.**""" return self._props["token"] + @property + def owner_id(self) -> str: + """If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot.""" + return self._props["owner_id"] + class APIKeyList(object): def __init__(self, client, props): @@ -320,6 +326,402 @@ class APIKeyList(object): return self._props["next_page_uri"] +class ApplicationSession(object): + def __init__(self, client, props): + self._client = client + self._props = props + self._props["browser_session"] = ( + BrowserSession(client, props["browser_session"]) + if props.get("browser_session") is not None + else None + ) + self._props["application_user"] = ( + Ref(client, props["application_user"]) + if props.get("application_user") is not None + else None + ) + self._props["endpoint"] = ( + Ref(client, props["endpoint"]) + if props.get("endpoint") is not None + else None + ) + self._props["edge"] = ( + Ref(client, props["edge"]) if props.get("edge") is not None else None + ) + self._props["route"] = ( + Ref(client, props["route"]) if props.get("route") is not None else None + ) + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "".format(self.id, repr(self._props)) + else: + return "".format(repr(self._props)) + + def delete( + self, + ): + self._client.application_sessions.delete( + id=self.id, + ) + + @property + def id(self) -> str: + """unique application session resource identifier""" + return self._props["id"] + + @property + def uri(self) -> str: + """URI of the application session API resource""" + return self._props["uri"] + + @property + def public_url(self) -> str: + """URL of the hostport served by this endpoint""" + return self._props["public_url"] + + @property + def browser_session(self) -> BrowserSession: + """browser session details of the application session""" + return self._props["browser_session"] + + @property + def application_user(self) -> Ref: + """application user this session is associated with""" + return self._props["application_user"] + + @property + def created_at(self) -> str: + """timestamp when the user was created in RFC 3339 format""" + return self._props["created_at"] + + @property + def last_active(self) -> str: + """timestamp when the user was last active in RFC 3339 format""" + return self._props["last_active"] + + @property + def expires_at(self) -> str: + """timestamp when session expires in RFC 3339 format""" + return self._props["expires_at"] + + @property + def endpoint(self) -> Ref: + """ephemeral endpoint this session is associated with""" + return self._props["endpoint"] + + @property + def edge(self) -> Ref: + """edge this session is associated with, null if the endpoint is agent-initiated""" + return self._props["edge"] + + @property + def route(self) -> Ref: + """route this session is associated with, null if the endpoint is agent-initiated""" + return self._props["route"] + + +class ApplicationSessionList(object): + def __init__(self, client, props): + self._client = client + self._props = props + self._props["application_sessions"] = ( + [ApplicationSession(client, x) for x in props["application_sessions"]] + if props.get("application_sessions") is not None + else [] + ) + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "".format(self.id, repr(self._props)) + else: + return "".format(repr(self._props)) + + def __iter__(self): + return PagedIterator(self._client, self, "application_sessions") + + @property + def application_sessions(self) -> Sequence[ApplicationSession]: + """list of all application sessions on this account""" + return self._props["application_sessions"] + + @property + def uri(self) -> str: + """URI of the application session list API resource""" + return self._props["uri"] + + @property + def next_page_uri(self) -> str: + """URI of the next page, or null if there is no next page""" + return self._props["next_page_uri"] + + +class BrowserSession(object): + def __init__(self, client, props): + self._client = client + self._props = props + self._props["user_agent"] = ( + UserAgent(client, props["user_agent"]) + if props.get("user_agent") is not None + else None + ) + self._props["location"] = ( + Location(client, props["location"]) + if props.get("location") is not None + else None + ) + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "".format(self.id, repr(self._props)) + else: + return "".format(repr(self._props)) + + @property + def user_agent(self) -> UserAgent: + """HTTP User-Agent data""" + return self._props["user_agent"] + + @property + def ip_address(self) -> str: + """IP address""" + return self._props["ip_address"] + + @property + def location(self) -> Location: + """IP geolocation data""" + return self._props["location"] + + +class UserAgent(object): + def __init__(self, client, props): + self._client = client + self._props = props + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "".format(self.id, repr(self._props)) + else: + return "".format(repr(self._props)) + + @property + def raw(self) -> str: + """raw User-Agent request header""" + return self._props["raw"] + + @property + def browser_name(self) -> str: + """browser name (e.g. Chrome)""" + return self._props["browser_name"] + + @property + def browser_version(self) -> str: + """browser version (e.g. 102)""" + return self._props["browser_version"] + + @property + def device_type(self) -> str: + """type of device (e.g. Desktop)""" + return self._props["device_type"] + + @property + def os_name(self) -> str: + """operating system name (e.g. MacOS)""" + return self._props["os_name"] + + @property + def os_version(self) -> str: + """operating system version (e.g. 10.15.7)""" + return self._props["os_version"] + + +class Location(object): + def __init__(self, client, props): + self._client = client + self._props = props + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "".format(self.id, repr(self._props)) + else: + return "".format(repr(self._props)) + + @property + def country_code(self) -> str: + """ISO country code""" + return self._props["country_code"] + + @property + def latitude(self) -> float: + """geographical latitude""" + return self._props["latitude"] + + @property + def longitude(self) -> float: + """geographical longitude""" + return self._props["longitude"] + + @property + def lat_long_radius_km(self) -> int: + """accuracy radius of the geographical coordinates""" + return self._props["lat_long_radius_km"] + + +class ApplicationUser(object): + def __init__(self, client, props): + self._client = client + self._props = props + self._props["identity_provider"] = ( + IdentityProvider(client, props["identity_provider"]) + if props.get("identity_provider") is not None + else None + ) + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "".format(self.id, repr(self._props)) + else: + return "".format(repr(self._props)) + + def delete( + self, + ): + self._client.application_users.delete( + id=self.id, + ) + + @property + def id(self) -> str: + """unique application user resource identifier""" + return self._props["id"] + + @property + def uri(self) -> str: + """URI of the application user API resource""" + return self._props["uri"] + + @property + def identity_provider(self) -> IdentityProvider: + """identity provider that the user authenticated with""" + return self._props["identity_provider"] + + @property + def provider_user_id(self) -> str: + """unique user identifier""" + return self._props["provider_user_id"] + + @property + def username(self) -> str: + """user username""" + return self._props["username"] + + @property + def email(self) -> str: + """user email""" + return self._props["email"] + + @property + def name(self) -> str: + """user common name""" + return self._props["name"] + + @property + def created_at(self) -> str: + """timestamp when the user was created in RFC 3339 format""" + return self._props["created_at"] + + @property + def last_active(self) -> str: + """timestamp when the user was last active in RFC 3339 format""" + return self._props["last_active"] + + @property + def last_login(self) -> str: + """timestamp when the user last signed-in in RFC 3339 format""" + return self._props["last_login"] + + +class ApplicationUserList(object): + def __init__(self, client, props): + self._client = client + self._props = props + self._props["application_users"] = ( + [ApplicationUser(client, x) for x in props["application_users"]] + if props.get("application_users") is not None + else [] + ) + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "".format(self.id, repr(self._props)) + else: + return "".format(repr(self._props)) + + def __iter__(self): + return PagedIterator(self._client, self, "application_users") + + @property + def application_users(self) -> Sequence[ApplicationUser]: + """list of all application users on this account""" + return self._props["application_users"] + + @property + def uri(self) -> str: + """URI of the application user list API resource""" + return self._props["uri"] + + @property + def next_page_uri(self) -> str: + """URI of the next page, or null if there is no next page""" + return self._props["next_page_uri"] + + +class IdentityProvider(object): + def __init__(self, client, props): + self._client = client + self._props = props + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "".format(self.id, repr(self._props)) + else: + return "".format(repr(self._props)) + + @property + def name(self) -> str: + """name of the identity provider (e.g. Google)""" + return self._props["name"] + + @property + def url(self) -> str: + """URL of the identity provider (e.g. `https://accounts.google.com `_)""" + return self._props["url"] + + class FailoverBackend(object): def __init__(self, client, props): self._client = client @@ -944,9 +1346,14 @@ class Credential(object): @property def acl(self) -> Sequence[str]: - """optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions.""" + """optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of ``bind:*=example`` which will allow ``x=example``, ``y=example``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions.""" return self._props["acl"] + @property + def owner_id(self) -> str: + """If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot.""" + return self._props["owner_id"] + class CredentialList(object): def __init__(self, client, props): @@ -1009,7 +1416,7 @@ class EndpointWebhookValidation(object): @property def provider(self) -> str: - """a string indicating which webhook provider will be sending webhooks to this endpoint. Value must be one of the supported providers: ``SLACK``, ``SNS``, ``STRIPE``, ``GITHUB``, ``TWILIO``, ``SHOPIFY``, ``GITLAB``, ``INTERCOM``, ``SENDGRID``, ``XERO``, ``PAGERDUTY``.""" + """a string indicating which webhook provider will be sending webhooks to this endpoint. Value must be one of the supported providers defined at `https://ngrok.com/docs/cloud-edge/modules/webhook `_""" return self._props["provider"] @property @@ -1284,9 +1691,9 @@ class EndpointCircuitBreaker(object): return self._props["enabled"] @property - def tripped_duration(self) -> int: + def tripped_duration(self) -> timedelta: """Integer number of seconds after which the circuit is tripped to wait before re-evaluating upstream health""" - return self._props["tripped_duration"] + return timedelta(seconds=self._props["tripped_duration"]) @property def rolling_window(self) -> int: @@ -1354,9 +1761,9 @@ class EndpointOAuth(object): return self._props["inactivity_timeout"] @property - def maximum_duration(self) -> int: + def maximum_duration(self) -> timedelta: """Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.""" - return self._props["maximum_duration"] + return timedelta(seconds=self._props["maximum_duration"]) @property def auth_check_interval(self) -> int: @@ -1388,6 +1795,26 @@ class EndpointOAuthProvider(object): if props.get("google") is not None else None ) + self._props["linkedin"] = ( + EndpointOAuthLinkedIn(client, props["linkedin"]) + if props.get("linkedin") is not None + else None + ) + self._props["gitlab"] = ( + EndpointOAuthGitLab(client, props["gitlab"]) + if props.get("gitlab") is not None + else None + ) + self._props["twitch"] = ( + EndpointOAuthTwitch(client, props["twitch"]) + if props.get("twitch") is not None + else None + ) + self._props["amazon"] = ( + EndpointOAuthAmazon(client, props["amazon"]) + if props.get("amazon") is not None + else None + ) def __eq__(self, other): return self._props == other._props @@ -1418,6 +1845,26 @@ class EndpointOAuthProvider(object): """configuration for using google as the identity provider""" return self._props["google"] + @property + def linkedin(self) -> EndpointOAuthLinkedIn: + """configuration for using linkedin as the identity provider""" + return self._props["linkedin"] + + @property + def gitlab(self) -> EndpointOAuthGitLab: + """configuration for using gitlab as the identity provider""" + return self._props["gitlab"] + + @property + def twitch(self) -> EndpointOAuthTwitch: + """configuration for using twitch as the identity provider""" + return self._props["twitch"] + + @property + def amazon(self) -> EndpointOAuthAmazon: + """configuration for using amazon as the identity provider""" + return self._props["amazon"] + class EndpointOAuthGitHub(object): def __init__(self, client, props): @@ -1589,6 +2036,146 @@ class EndpointOAuthGoogle(object): return self._props["email_domains"] +class EndpointOAuthLinkedIn(object): + def __init__(self, client, props): + self._client = client + self._props = props + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "".format(self.id, repr(self._props)) + else: + return "".format(repr(self._props)) + + @property + def client_id(self) -> str: + return self._props["client_id"] + + @property + def client_secret(self) -> str: + return self._props["client_secret"] + + @property + def scopes(self) -> Sequence[str]: + return self._props["scopes"] + + @property + def email_addresses(self) -> Sequence[str]: + return self._props["email_addresses"] + + @property + def email_domains(self) -> Sequence[str]: + return self._props["email_domains"] + + +class EndpointOAuthGitLab(object): + def __init__(self, client, props): + self._client = client + self._props = props + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "".format(self.id, repr(self._props)) + else: + return "".format(repr(self._props)) + + @property + def client_id(self) -> str: + return self._props["client_id"] + + @property + def client_secret(self) -> str: + return self._props["client_secret"] + + @property + def scopes(self) -> Sequence[str]: + return self._props["scopes"] + + @property + def email_addresses(self) -> Sequence[str]: + return self._props["email_addresses"] + + @property + def email_domains(self) -> Sequence[str]: + return self._props["email_domains"] + + +class EndpointOAuthTwitch(object): + def __init__(self, client, props): + self._client = client + self._props = props + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "".format(self.id, repr(self._props)) + else: + return "".format(repr(self._props)) + + @property + def client_id(self) -> str: + return self._props["client_id"] + + @property + def client_secret(self) -> str: + return self._props["client_secret"] + + @property + def scopes(self) -> Sequence[str]: + return self._props["scopes"] + + @property + def email_addresses(self) -> Sequence[str]: + return self._props["email_addresses"] + + @property + def email_domains(self) -> Sequence[str]: + return self._props["email_domains"] + + +class EndpointOAuthAmazon(object): + def __init__(self, client, props): + self._client = client + self._props = props + + def __eq__(self, other): + return self._props == other._props + + def __str__(self): + if "id" in self._props: + return "".format(self.id, repr(self._props)) + else: + return "".format(repr(self._props)) + + @property + def client_id(self) -> str: + return self._props["client_id"] + + @property + def client_secret(self) -> str: + return self._props["client_secret"] + + @property + def scopes(self) -> Sequence[str]: + return self._props["scopes"] + + @property + def email_addresses(self) -> Sequence[str]: + return self._props["email_addresses"] + + @property + def email_domains(self) -> Sequence[str]: + return self._props["email_domains"] + + class EndpointSAML(object): def __init__(self, client, props): self._client = client @@ -1624,9 +2211,9 @@ class EndpointSAML(object): return self._props["inactivity_timeout"] @property - def maximum_duration(self) -> int: + def maximum_duration(self) -> timedelta: """Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.""" - return self._props["maximum_duration"] + return timedelta(seconds=self._props["maximum_duration"]) @property def idp_metadata(self) -> str: @@ -1714,9 +2301,9 @@ class EndpointSAMLMutate(object): return self._props["inactivity_timeout"] @property - def maximum_duration(self) -> int: + def maximum_duration(self) -> timedelta: """Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.""" - return self._props["maximum_duration"] + return timedelta(seconds=self._props["maximum_duration"]) @property def idp_metadata(self) -> str: @@ -1779,9 +2366,9 @@ class EndpointOIDC(object): return self._props["inactivity_timeout"] @property - def maximum_duration(self) -> int: + def maximum_duration(self) -> timedelta: """Integer number of seconds of the maximum duration of an authenticated session. After this period is exceeded, a user must reauthenticate.""" - return self._props["maximum_duration"] + return timedelta(seconds=self._props["maximum_duration"]) @property def issuer(self) -> str: @@ -3937,9 +4524,14 @@ class SSHCredential(object): @property def acl(self) -> Sequence[str]: - """optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions.""" + """optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of ``bind:*=example`` which will allow ``x=example``, ``y=example``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions.""" return self._props["acl"] + @property + def owner_id(self) -> str: + """If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot.""" + return self._props["owner_id"] + class SSHCredentialList(object): def __init__(self, client, props): @@ -4189,12 +4781,12 @@ class SSHUserCertificate(object): @property def critical_options(self) -> Mapping[str, str]: - """A map of critical options included in the certificate. Only two critical options are currently defined by OpenSSH: ``force-command`` and ``source-address``. See `the OpenSSH certificate protocol spec` `_ for additional details.""" + """A map of critical options included in the certificate. Only two critical options are currently defined by OpenSSH: ``force-command`` and ``source-address``. See `the OpenSSH certificate protocol spec `_ for additional details.""" return self._props["critical_options"] @property def extensions(self) -> Mapping[str, str]: - """A map of extensions included in the certificate. Extensions are additional metadata that can be interpreted by the SSH server for any purpose. These can be used to permit or deny the ability to open a terminal, do port forwarding, x11 forwarding, and more. If unspecified, the certificate will include limited permissions with the following extension map: ``{"permit-pty": "", "permit-user-rc": ""}`` OpenSSH understands a number of predefined extensions. See `the OpenSSH certificate protocol spec` `_ for additional details.""" + """A map of extensions included in the certificate. Extensions are additional metadata that can be interpreted by the SSH server for any purpose. These can be used to permit or deny the ability to open a terminal, do port forwarding, x11 forwarding, and more. If unspecified, the certificate will include limited permissions with the following extension map: ``{"permit-pty": "", "permit-user-rc": ""}`` OpenSSH understands a number of predefined extensions. See `the OpenSSH certificate protocol spec `_ for additional details.""" return self._props["extensions"] @property @@ -4315,7 +4907,7 @@ class TLSCertificate(object): @property def certificate_pem(self) -> str: - """chain of PEM-encoded certificates, leaf first. See `Certificate Bundles` `_.""" + """chain of PEM-encoded certificates, leaf first. See `Certificate Bundles `_.""" return self._props["certificate_pem"] @property @@ -4611,7 +5203,7 @@ class Tunnel(object): @property def metadata(self) -> str: - """user-supplied metadata for the tunnel defined in the ngrok configuration file. See the tunnel `metadata configuration option` `_ In API version 0, this value was instead pulled from the top-level `metadata configuration option` `_.""" + """user-supplied metadata for the tunnel defined in the ngrok configuration file. See the tunnel `metadata configuration option `_ In API version 0, this value was instead pulled from the top-level `metadata configuration option `_.""" return self._props["metadata"] @property diff --git a/ngrok/services.py b/ngrok/services.py index 0bf4ce1..316dc07 100644 --- a/ngrok/services.py +++ b/ngrok/services.py @@ -1,6 +1,7 @@ from __future__ import annotations from collections.abc import Iterator from typing import Any, Mapping, Sequence +from datetime import datetime, timedelta from .http_client import HTTPClient from .datatypes import * @@ -163,9 +164,9 @@ class AgentIngressesClient(object): class APIKeysClient(object): """API Keys are used to authenticate to the `ngrok - API` `_. You may use the API itself + API `_. You may use the API itself to provision and manage API Keys but you'll need to provision your first API - key from the `API Keys page` `_ on your + key from the `API Keys page `_ on your ngrok.com dashboard.""" def __init__(self, client): @@ -175,11 +176,13 @@ class APIKeysClient(object): self, description: str = "", metadata: str = "", + owner_id: str = None, ) -> APIKey: """Create a new API key. The generated API key can be used to authenticate to the ngrok API. :param description: human-readable description of what uses the API key to authenticate. optional, max 255 bytes. :param metadata: arbitrary user-defined data of this API key. optional, max 4096 bytes + :param owner_id: If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot. https://ngrok.com/docs/api#api-api-keys-create """ @@ -187,6 +190,7 @@ class APIKeysClient(object): body_arg = dict( description=description, metadata=metadata, + owner_id=owner_id, ) result = self._client.http_client.post(path, body_arg) return APIKey(self._client, result) @@ -272,6 +276,126 @@ class APIKeysClient(object): return APIKey(self._client, result) +class ApplicationSessionsClient(object): + def __init__(self, client): + self._client = client + + def get( + self, + id: str, + ) -> ApplicationSession: + """Get an application session by ID. + + :param id: a resource identifier + + https://ngrok.com/docs/api#api-application-sessions-get + """ + path = "/app/sessions/{id}" + path = path.format( + id=id, + ) + body_arg = None + result = self._client.http_client.get(path, body_arg) + return ApplicationSession(self._client, result) + + def delete( + self, + id: str, + ): + """Delete an application session by ID. + + :param id: a resource identifier + + https://ngrok.com/docs/api#api-application-sessions-delete + """ + path = "/app/sessions/{id}" + path = path.format( + id=id, + ) + body_arg = None + self._client.http_client.delete(path, body_arg) + + def list( + self, + before_id: str = None, + limit: str = None, + ) -> ApplicationSessionList: + """List all application sessions for this account. + + :param before_id: + :param limit: + + https://ngrok.com/docs/api#api-application-sessions-list + """ + path = "/app/sessions" + body_arg = dict( + before_id=before_id, + limit=limit, + ) + result = self._client.http_client.get(path, body_arg) + return ApplicationSessionList(self._client, result) + + +class ApplicationUsersClient(object): + def __init__(self, client): + self._client = client + + def get( + self, + id: str, + ) -> ApplicationUser: + """Get an application user by ID. + + :param id: a resource identifier + + https://ngrok.com/docs/api#api-application-users-get + """ + path = "/app/users/{id}" + path = path.format( + id=id, + ) + body_arg = None + result = self._client.http_client.get(path, body_arg) + return ApplicationUser(self._client, result) + + def delete( + self, + id: str, + ): + """Delete an application user by ID. + + :param id: a resource identifier + + https://ngrok.com/docs/api#api-application-users-delete + """ + path = "/app/users/{id}" + path = path.format( + id=id, + ) + body_arg = None + self._client.http_client.delete(path, body_arg) + + def list( + self, + before_id: str = None, + limit: str = None, + ) -> ApplicationUserList: + """List all application users for this account. + + :param before_id: + :param limit: + + https://ngrok.com/docs/api#api-application-users-list + """ + path = "/app/users" + body_arg = dict( + before_id=before_id, + limit=limit, + ) + result = self._client.http_client.get(path, body_arg) + return ApplicationUserList(self._client, result) + + class FailoverBackendsClient(object): """A Failover backend defines failover behavior within a list of referenced backends. Traffic is sent to the first backend in the list. If that backend @@ -869,12 +993,14 @@ class CredentialsClient(object): description: str = "", metadata: str = "", acl: Sequence[str] = [], + owner_id: str = None, ) -> Credential: """Create a new tunnel authtoken credential. This authtoken credential can be used to start a new tunnel session. The response to this API call is the only time the generated token is available. If you need it for future use, you must save it securely yourself. :param description: human-readable description of who or what will use the credential to authenticate. Optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this credential. Optional, max 4096 bytes. - :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. + :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of ``bind:*=example`` which will allow ``x=example``, ``y=example``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. + :param owner_id: If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot. https://ngrok.com/docs/api#api-credentials-create """ @@ -883,6 +1009,7 @@ class CredentialsClient(object): description=description, metadata=metadata, acl=acl, + owner_id=owner_id, ) result = self._client.http_client.post(path, body_arg) return Credential(self._client, result) @@ -954,7 +1081,7 @@ class CredentialsClient(object): :param id: :param description: human-readable description of who or what will use the credential to authenticate. Optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this credential. Optional, max 4096 bytes. - :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. + :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of ``bind:*=example`` which will allow ``x=example``, ``y=example``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. https://ngrok.com/docs/api#api-credentials-update """ @@ -2826,7 +2953,7 @@ class EventDestinationsClient(object): format: str = "", target: EventTarget = None, ) -> EventDestination: - """Create a new Event Destination. It will not apply to anything until it is associated with an Event Stream, and that Event Stream is associated with an Endpoint Config. + """Create a new Event Destination. It will not apply to anything until it is associated with an Event Subscription. :param metadata: Arbitrary user-defined machine-readable data of this Event Destination. Optional, max 4096 bytes. :param description: Human-readable description of the Event Destination. Optional, max 255 bytes. @@ -3636,7 +3763,8 @@ class ReservedDomainsClient(object): def create( self, - name: str, + name: str = "", + domain: str = "", region: str = "", description: str = "", metadata: str = "", @@ -3646,6 +3774,7 @@ class ReservedDomainsClient(object): """Create a new reserved domain. :param name: the domain name to reserve. It may be a full domain name like app.example.com. If the name does not contain a '.' it will reserve that subdomain on ngrok.io. + :param domain: hostname of the reserved domain :param region: reserve the domain in this geographic ngrok datacenter. Optional, default is us. (au, eu, ap, us, jp, in, sa) :param description: human-readable description of what this reserved domain will be used for :param metadata: arbitrary user-defined machine-readable data of this reserved domain. Optional, max 4096 bytes. @@ -3657,6 +3786,7 @@ class ReservedDomainsClient(object): path = "/reserved_domains" body_arg = dict( name=name, + domain=domain, region=region, description=description, metadata=metadata, @@ -3917,13 +4047,15 @@ class SSHCredentialsClient(object): description: str = "", metadata: str = "", acl: Sequence[str] = [], + owner_id: str = None, ) -> SSHCredential: """Create a new ssh_credential from an uploaded public SSH key. This ssh credential can be used to start new tunnels via ngrok's SSH gateway. :param description: human-readable description of who or what will use the ssh credential to authenticate. Optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this ssh credential. Optional, max 4096 bytes. - :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. + :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of ``bind:*=example`` which will allow ``x=example``, ``y=example``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. :param public_key: the PEM-encoded public key of the SSH keypair that will be used to authenticate + :param owner_id: If supplied at credential creation, ownership will be assigned to the specified User or Bot. Only admins may specify an owner other than themselves. Defaults to the authenticated User or Bot. https://ngrok.com/docs/api#api-ssh-credentials-create """ @@ -3933,6 +4065,7 @@ class SSHCredentialsClient(object): metadata=metadata, acl=acl, public_key=public_key, + owner_id=owner_id, ) result = self._client.http_client.post(path, body_arg) return SSHCredential(self._client, result) @@ -4004,7 +4137,7 @@ class SSHCredentialsClient(object): :param id: :param description: human-readable description of who or what will use the ssh credential to authenticate. Optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this ssh credential. Optional, max 4096 bytes. - :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains and addresses the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. + :param acl: optional list of ACL rules. If unspecified, the credential will have no restrictions. The only allowed ACL rule at this time is the ``bind`` rule. The ``bind`` rule allows the caller to restrict what domains, addresses, and labels the token is allowed to bind. For example, to allow the token to open a tunnel on example.ngrok.io your ACL would include the rule ``bind:example.ngrok.io``. Bind rules for domains may specify a leading wildcard to match multiple domains with a common suffix. For example, you may specify a rule of ``bind:*.example.com`` which will allow ``x.example.com``, ``y.example.com``, ``*.example.com``, etc. Bind rules for labels may specify a wildcard key and/or value to match multiple labels. For example, you may specify a rule of ``bind:*=example`` which will allow ``x=example``, ``y=example``, etc. A rule of ``'*'`` is equivalent to no acl at all and will explicitly permit all actions. https://ngrok.com/docs/api#api-ssh-credentials-update """ @@ -4170,8 +4303,8 @@ class SSHUserCertificatesClient(object): :param ssh_certificate_authority_id: the ssh certificate authority that is used to sign this ssh user certificate :param public_key: a public key in OpenSSH Authorized Keys format that this certificate signs :param principals: the list of principals included in the ssh user certificate. This is the list of usernames that the certificate holder may sign in as on a machine authorizing the signing certificate authority. Dangerously, if no principals are specified, this certificate may be used to log in as any user. - :param critical_options: A map of critical options included in the certificate. Only two critical options are currently defined by OpenSSH: ``force-command`` and ``source-address``. See `the OpenSSH certificate protocol spec` `_ for additional details. - :param extensions: A map of extensions included in the certificate. Extensions are additional metadata that can be interpreted by the SSH server for any purpose. These can be used to permit or deny the ability to open a terminal, do port forwarding, x11 forwarding, and more. If unspecified, the certificate will include limited permissions with the following extension map: ``{"permit-pty": "", "permit-user-rc": ""}`` OpenSSH understands a number of predefined extensions. See `the OpenSSH certificate protocol spec` `_ for additional details. + :param critical_options: A map of critical options included in the certificate. Only two critical options are currently defined by OpenSSH: ``force-command`` and ``source-address``. See `the OpenSSH certificate protocol spec `_ for additional details. + :param extensions: A map of extensions included in the certificate. Extensions are additional metadata that can be interpreted by the SSH server for any purpose. These can be used to permit or deny the ability to open a terminal, do port forwarding, x11 forwarding, and more. If unspecified, the certificate will include limited permissions with the following extension map: ``{"permit-pty": "", "permit-user-rc": ""}`` OpenSSH understands a number of predefined extensions. See `the OpenSSH certificate protocol spec `_ for additional details. :param valid_after: The time when the user certificate becomes valid, in RFC 3339 format. Defaults to the current time if unspecified. :param valid_until: The time when this host certificate becomes invalid, in RFC 3339 format. If unspecified, a default value of 24 hours will be used. The OpenSSH certificates RFC calls this ``valid_before``. :param description: human-readable description of this SSH User Certificate. optional, max 255 bytes. @@ -4296,8 +4429,8 @@ class TLSCertificatesClient(object): :param description: human-readable description of this TLS certificate. optional, max 255 bytes. :param metadata: arbitrary user-defined machine-readable data of this TLS certificate. optional, max 4096 bytes. - :param certificate_pem: chain of PEM-encoded certificates, leaf first. See `Certificate Bundles` `_. - :param private_key_pem: private key for the TLS certificate, PEM-encoded. See `Private Keys` `_. + :param certificate_pem: chain of PEM-encoded certificates, leaf first. See `Certificate Bundles `_. + :param private_key_pem: private key for the TLS certificate, PEM-encoded. See `Private Keys `_. https://ngrok.com/docs/api#api-tls-certificates-create """ diff --git a/setup.py b/setup.py index c409ab1..1c53d49 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ def read_file(filename): setup( name="ngrok-api", - version="0.9.0", + version="0.10.0", description="ngrok HTTP API client library", long_description=read_file("README.md"), long_description_content_type="text/markdown", diff --git a/tests/test_ngrok.py b/tests/test_ngrok.py index c591aef..27d81b7 100644 --- a/tests/test_ngrok.py +++ b/tests/test_ngrok.py @@ -79,7 +79,7 @@ def test_domains(): c.reserved_domains.list() mock.returns(mock_reserved_domain) - domain = c.reserved_domains.create(name="foo") + domain = c.reserved_domains.create(domain="foo.ngrok.io.lan") mock.returns(mock_reserved_domain) domain = c.reserved_domains.get(domain.id) assert domain.domain == "foo.ngrok.io.lan" diff --git a/tox.ini b/tox.ini index 008c09b..7ebc177 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py38 +envlist = py39 minversion = 3.23.0 #skip_missing_interpreters = true