<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>index on OyunDev</title>
    <link>https://oyundev.com/tags/index/</link>
    <description>Recent content in index on OyunDev</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <copyright>© oyundev.com</copyright>
    
        <atom:link href="https://oyundev.com/tags/index/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Deploy go fiber webapp to azure cloud from private docker hub container repo</title>
      <link>https://oyundev.com/post/azure-containerapp/</link>
      <pubDate>Sun, 29 Aug 2021 00:00:00 +0000</pubDate>
      
      <guid>https://oyundev.com/post/azure-containerapp/</guid>
      <description>&lt;h1 id=&#34;azure-webapp-running-a-docker-container-from-your-private-docker-hub-repository&#34;&gt;Azure WebApp running a docker container from your private docker hub repository&lt;/h1&gt;
&lt;p&gt;Microsoft Azure Cloud app services allows customers to run web applications which can be deployed using docker containers residing in Azure Container Registry, Docker Hub (public or private) and other custom docker repositories.&lt;br&gt;&lt;br&gt;Just like other big-cloud vendors Microsoft Azure offers a limited time free plan and an always free tier within certain limitations. You can find list of free service offers and information about limits at this &lt;a href=&#34;https://portal.azure.com/#blade/Microsoft_Azure_Billing/FreeServicesBlade&#34;target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;azure portal free services page&lt;/a&gt;
. You can find source code for this article on &lt;a href=&#34;https://github.com/oyundev/tweb1&#34;target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github here&lt;/a&gt;
&lt;/p&gt;
&lt;h1 id=&#34;synopsis-and-prerequisites&#34;&gt;Synopsis and prerequisites&lt;/h1&gt;
&lt;p&gt;I wanted to create a &lt;a href=&#34;https://github.com/gofiber/fiber&#34;target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;gofiber&lt;/a&gt;
 webapp, running inside of a docker from scratch container, deploy and run it using azure app services and secure it using azure active directory authentication provider &lt;a href=&#34;https://github.com/markbates/goth/tree/master/providers/azureadv2&#34;target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;goth/azureadv2&lt;/a&gt;
. Prerequisites to do this are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go compiler: &lt;a href=&#34;https://golang.org/dl/&#34;&gt;https://golang.org/dl/&lt;/a&gt; &lt;br&gt;&lt;/li&gt;
&lt;li&gt;Docker and a free docker hub account to store my containers: &lt;a href=&#34;https://hub.docker.com&#34;&gt;https://hub.docker.com&lt;/a&gt; &lt;br&gt;&lt;/li&gt;
&lt;li&gt;Microsoft Azure Cloud account: &lt;a href=&#34;https://azure.microsoft.com&#34;&gt;https://azure.microsoft.com&lt;/a&gt; free tier would suffice. &lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr/&gt;
End result will be a simple web page that only your default Azure AD users can login: &lt;br&gt; &lt;br&gt;
&lt;p&gt;&lt;img  src=&#34;https://oyundev.com/assets/img/azure-go-ad.png&#34;
        alt=&#34;webapp-login-authenticated&#34;/&gt;&lt;/p&gt;
&lt;h1 id=&#34;go-webapp-with-gofiber-and-gothazureadv2&#34;&gt;Go webapp with gofiber and goth/azureadv2&lt;/h1&gt;
&lt;p&gt;Go code for this web app fairly simple. I was getting &amp;ldquo;Request Header Fields Too Large&amp;rdquo; error with default gofiber config. Increasing ReadBufferSize to 16K in fiber config constructor fixed this issue. &lt;br&gt;&lt;br&gt;Also goth/azureadv2 provider has a known bug getting authenticated users email address info so I used a little workaround for it. You can find full source code on &lt;a href=&#34;https://github.com/oyundev/tweb1&#34;target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github here&lt;/a&gt;
.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
	&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;testparam&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;
	&lt;span class=&#34;nx&#34;&gt;flag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
	&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;strings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;TrimSpace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;flagkey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;testparam&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;strings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;TrimSpace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;flagkey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
	&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

	&lt;span class=&#34;nx&#34;&gt;options&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;azureadv2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ProviderOptions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;Scopes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;azureadv2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ScopeType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;azureadv2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;UserReadScope&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;Tenant&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;azureadv2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;TenantType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tenantID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
	&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
	&lt;span class=&#34;nx&#34;&gt;goth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;UseProviders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;azureadv2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;New&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;applicationID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;secret&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;redirectUri&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
	&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

	&lt;span class=&#34;nx&#34;&gt;app&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fiber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;New&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fiber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;ReadBufferSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;16384&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
	&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;

	&lt;span class=&#34;nx&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/auth/:provider/callback&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fiber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;error&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;gf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;CompleteUserAuth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt;
		&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

		&lt;span class=&#34;c1&#34;&gt;//PROVIDER-BUG:https://github.com/markbates/goth/issues/289
&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;		&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;userPrincipalName&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;range&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;dumpMap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;RawData&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;k&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;userPrincipalName&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
				&lt;span class=&#34;nx&#34;&gt;userPrincipalName&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;v&lt;/span&gt;
			&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
		&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;

		&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;strings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Builder&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;htmlheadsrc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;body&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#34;/logout/azureadv2&amp;#34;&amp;gt;Logout&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;table&amp;gt;&amp;lt;thead&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Value&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/thead&amp;gt;&amp;lt;tbody&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Email&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;Email&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;userPrincipalName&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;Email&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Email&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;Name&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;FirstName&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;FirstName&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;LastName&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;LastName&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;NickName&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;NickName&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;Description&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Description&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;UserID&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;UserID&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;AvatarURL&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;AvatarURL&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;Location&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Location&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;AccessToken&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;AccessToken&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;AccessTokenSecret&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;AccessTokenSecret&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;RefreshToken&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;RefreshToken&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;ExpiresAt&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ExpiresAt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;IDToken&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;IDToken&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;tr&amp;gt;&amp;lt;td nowrap&amp;gt;userPrincipalName&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;RawData&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;userPrincipalName&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;br/&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;p&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Getenv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;WEBSITE_HOSTNAME&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/p&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;p&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;testparam&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/p&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

		&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;text/html&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([]&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()))&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;
	&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;

	&lt;span class=&#34;nx&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/logout/:provider&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fiber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;error&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;gf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Logout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Redirect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;
	&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;

	&lt;span class=&#34;nx&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/auth/:provider&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fiber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;error&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;authUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;gf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;CompleteUserAuth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;authUser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
			&lt;span class=&#34;nx&#34;&gt;gf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;BeginAuthHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;
	&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
	
	&lt;span class=&#34;nx&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/favicon.ico&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fiber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;error&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;buf&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x89&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x50&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x4E&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x47&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x0D&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x0A&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x1A&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x0A&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x0D&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x49&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x48&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x44&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x52&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x14&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x16&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x08&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x03&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xF7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x9F&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x4C&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x34&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x12&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x50&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x4C&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x54&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x45&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xCC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x99&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x99&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x99&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x66&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x66&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x66&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x33&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x33&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x33&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x9E&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x8B&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x9A&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xE7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x02&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x74&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x52&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x4E&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x53&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xE5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xB7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x4A&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x3D&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x49&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x44&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x41&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x54&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x78&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xDA&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xCD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xD0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x31&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x0E&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x0C&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x02&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x40&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xA0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xF2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x2F&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x8B&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x23&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x89&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xBB&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x76&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xB9&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x5B&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xC1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xCB&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x3D&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x2F&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xED&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x58&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x80&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x96&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x62&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x01&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x0B&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x88&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x05&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xC2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x19&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x8B&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x94&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xD2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x98&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x05&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x96&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x67&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xBC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x58&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x26&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xB0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x40&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x3C&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xA1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xF8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xF0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x1B&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x75&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xA3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x02&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xBE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x47&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x80&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xD3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xF4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x49&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x45&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x4E&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x44&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xAE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x42&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x60&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x82&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;image/x-icon&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;
	&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;

	&lt;span class=&#34;nx&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fiber&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;error&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
		&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;strings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Builder&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;htmlheadsrc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;body&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;#34;/auth/azureadv2&amp;#34;&amp;gt;Login&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a&amp;gt;Logout&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;p&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Getenv&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;WEBSITE_HOSTNAME&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/p&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;p&amp;gt;`&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;testparam&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;`&amp;lt;/p&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;WriteString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;`&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;`&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;

		&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;text/html&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
		&lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([]&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()))&lt;/span&gt;
		&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;
	&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;

	&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Fatal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Listen&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;:80&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;dockerfile-and-preparing-container&#34;&gt;Dockerfile and preparing container&lt;/h1&gt;
&lt;p&gt;Because we are using a scratch container we need to provide ssl certificates manually otherwise authentication will fail. To do this we use a docker multi stage build:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-docker&#34; data-lang=&#34;docker&#34;&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; alpine:latest as certs&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;RUN&lt;/span&gt; apk --update add ca-certificates&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# https://medium.com/on-docker/use-multi-stage-builds-to-inject-ca-certs-ad1e8f01de1b&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; scratch&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;EXPOSE&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; 80&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ENV&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/bin&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;COPY&lt;/span&gt; --from&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;certs /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;COPY&lt;/span&gt; ./tweb1 /&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;CMD&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/tweb1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;deploy-container-to-azure-cloud-using-portal&#34;&gt;Deploy container to Azure Cloud using Portal&lt;/h1&gt;
&lt;p&gt;At this stage we should have our app container inside our docker hub private repo. I think how to use docker and docker hub is out of scope of this post so I assume we have built our container and pushed it to our private hub repository already.&lt;br&gt;&lt;br&gt;
Creating a web app at Azure Portal using web based UI is very easy. This is just a wizard type UI that you fill out some required values and click next to continue on next step until final page where you review all info and create the webapp. After that we need to configure authentication and create Azure AD app registration for our webapp. Here steps how to to so:&lt;br&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Login to Azure Portal and create a new webapp in app services.
&lt;ul&gt;
&lt;li&gt;Bear in mind free-tier may not be available in some regions, you can change the region if necessary.&lt;/li&gt;
&lt;li&gt;Choose docker hub for deployment source and fill out your docker credentials.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;After creating webapp, go to authentication section and click to add identity provider.
&lt;ul&gt;
&lt;li&gt;This step will create active directory app registration and create access token secret for our app.&lt;/li&gt;
&lt;li&gt;It is important to allow anonymous access to users so they can click login button to start the authentication process.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Go to webapp configuration section and create tree new values for:
&lt;ul&gt;
&lt;li&gt;APPLICATION_ID, AD_TENANT_ID, REDIRECT_URI.&lt;/li&gt;
&lt;li&gt;These are necessary values to authenticate users with Azure AD provider.&lt;/li&gt;
&lt;li&gt;You should also see settings value for MICROSOFT_PROVIDER_AUTHENTICATION_SECRET already created for us when we added identity provider in previous step.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;deploy-using-azure-cli&#34;&gt;Deploy using Azure CLI:&lt;/h1&gt;
&lt;p&gt;Azure CLI is very powerful tool to manage azure resources. We can use it to automate deployment with CI/CD pipelines. I think the easiest way to run azure cli is using docker. Run it with the command: ~$ docker run &amp;ndash;rm -it mcr.microsoft.com/azure-cli&lt;br&gt;&lt;br&gt;
This script below shows how to use cli to create webapp with container, configure environment and set up authentication:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# https://docs.microsoft.com/en-us/cli/azure/install-azure-cli&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# https://docs.microsoft.com/en-us/cli/azure/run-azure-cli-docker&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Using Docker: docker run -it mcr.microsoft.com/azure-cli&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# ~$ sudo docker run --rm -it mcr.microsoft.com/azure-cli&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Unable to find image &amp;#39;mcr.microsoft.com/azure-cli:latest&amp;#39; locally&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# latest: Pulling from azure-cli&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# 540db60ca938: Pull complete&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# a7ad1a75a999: Pull complete&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# 8d9a9d314bf5: Pull complete &lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Digest: sha256:2090963629cc9c595bbad24354bb6879112d8900000000000009&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Status: Downloaded newer image for mcr.microsoft.com/azure-cli:latest&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# bash-5.1# az&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# &lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Welcome to Azure CLI!&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# ---------------------&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Use `az -h` to see available commands or go to https://aka.ms/cli.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# &lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Telemetry&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# ---------&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# The Azure CLI collects usage data in order to improve your experience.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# The data is anonymous and does not include commandline argument values.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# The data is collected by Microsoft.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# &lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# You can change your telemetry settings with `az configure`.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# &lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# &lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#      /\&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#     /  \    _____   _ _  ___ _&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#    / /\ \  |_  / | | | \&amp;#39;__/ _\&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#   / ____ \  / /| |_| | | |  __/&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#  /_/    \_\/___|\__,_|_|  \___|&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# &lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# &lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Welcome to the cool new Azure CLI!&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# this optional step, if you have more than one subscription, &lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# you should set the default subscription, &lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# which will be used for the remaining Azure CLI commands.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# ~$ az account set --subscription XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;tenantId&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;#39;&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;webAppName&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;tweb1app&amp;#39;&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;resGroup&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;tweb1-resgrp&amp;#39;&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;location&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;northeurope&amp;#39;&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;servicePlan&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;tweb1-freeplan&amp;#39;&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;tier&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;F1&amp;#39;&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;containerImg&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;DOCKER|dockeruser/myrepo:tweb1&amp;#39;&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;dockerUsr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;dockeruser&amp;#39;&lt;/span&gt;
&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;dockerPass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;xxxxxxxxxxx&amp;#39;&lt;/span&gt; 
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
az login --tenant &lt;span class=&#34;nv&#34;&gt;$tenantId&lt;/span&gt; 
&lt;span class=&#34;c1&#34;&gt;# bash-5.1# az login --tenant $tenantId&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# Not able to launch a browser to log you in, falling back to device code...&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code DA5EFUFVL to authenticate.&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# create new resource group&lt;/span&gt;
az group create --name &lt;span class=&#34;nv&#34;&gt;$resGroup&lt;/span&gt; --location &lt;span class=&#34;nv&#34;&gt;$location&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# create new app service plan Free tier (sku:F1)&lt;/span&gt;
az appservice plan create -n &lt;span class=&#34;nv&#34;&gt;$servicePlan&lt;/span&gt; -g &lt;span class=&#34;nv&#34;&gt;$resGroup&lt;/span&gt; --sku &lt;span class=&#34;nv&#34;&gt;$tier&lt;/span&gt; --is-linux
&lt;span class=&#34;c1&#34;&gt;# create new web app (Note: as of 2021-08-28 this command can not configure private-docker-hub-conatiner image deployments so after this command you need to issue another config-container-set command to reach desired configuration.)&lt;/span&gt;
az webapp create -n &lt;span class=&#34;nv&#34;&gt;$webAppName&lt;/span&gt; -g &lt;span class=&#34;nv&#34;&gt;$resGroup&lt;/span&gt; -p &lt;span class=&#34;nv&#34;&gt;$servicePlan&lt;/span&gt; -i &lt;span class=&#34;nv&#34;&gt;$containerImg&lt;/span&gt; -s &lt;span class=&#34;nv&#34;&gt;$dockerUsr&lt;/span&gt; -w &lt;span class=&#34;nv&#34;&gt;$dockerPass&lt;/span&gt; --tags &lt;span class=&#34;nv&#34;&gt;Lifecycle&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;Test
az webapp stop --name &lt;span class=&#34;nv&#34;&gt;$webAppName&lt;/span&gt; --resource-group &lt;span class=&#34;nv&#34;&gt;$resGroup&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
az webapp config container &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; --name &lt;span class=&#34;nv&#34;&gt;$webAppName&lt;/span&gt; --resource-group &lt;span class=&#34;nv&#34;&gt;$resGroup&lt;/span&gt; --docker-custom-image-name &lt;span class=&#34;s1&#34;&gt;&amp;#39;DOCKER|dockeruser/myrepo:tweb1&amp;#39;&lt;/span&gt; --docker-registry-server-url &lt;span class=&#34;s1&#34;&gt;&amp;#39;https://index.docker.io/v1&amp;#39;&lt;/span&gt; --docker-registry-server-user &lt;span class=&#34;s1&#34;&gt;&amp;#39;dockeruser&amp;#39;&lt;/span&gt; --docker-registry-server-password &lt;span class=&#34;s1&#34;&gt;&amp;#39;xxxxxxxxxxx&amp;#39;&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
az ad app create --display-name &lt;span class=&#34;nv&#34;&gt;$webAppName&lt;/span&gt; --available-to-other-tenants &lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt; --key-type Password --password &lt;span class=&#34;s1&#34;&gt;&amp;#39;111xxxxxxxxxxxx11_1111xxxx1x&amp;#39;&lt;/span&gt; --reply-urls &lt;span class=&#34;s1&#34;&gt;&amp;#39;https://tweb1app.azurewebsites.net/auth/azureadv2/callback&amp;#39;&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
az webapp stop --name &lt;span class=&#34;nv&#34;&gt;$webAppName&lt;/span&gt; --resource-group &lt;span class=&#34;nv&#34;&gt;$resGroup&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# a custom startup command for docker container&lt;/span&gt;
az webapp config &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; --resource-group &lt;span class=&#34;nv&#34;&gt;$resGroup&lt;/span&gt; --name &lt;span class=&#34;nv&#34;&gt;$webAppName&lt;/span&gt; --startup-file &lt;span class=&#34;s1&#34;&gt;&amp;#39;/tweb1 -k sample_param-value,1714&amp;#39;&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;# configure web app settings, get the value for APPLICATION_ID which you can find inside of resulted json output from `az ad create` command like: &amp;#34;appId&amp;#34;: &amp;#34;XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;#34;  &lt;/span&gt;
az webapp config appsettings &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; --resource-group &lt;span class=&#34;nv&#34;&gt;$resGroup&lt;/span&gt; --name &lt;span class=&#34;nv&#34;&gt;$webAppName&lt;/span&gt; --settings &lt;span class=&#34;nv&#34;&gt;APPLICATION_ID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX&amp;#39;&lt;/span&gt;
az webapp config appsettings &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; --resource-group &lt;span class=&#34;nv&#34;&gt;$resGroup&lt;/span&gt; --name &lt;span class=&#34;nv&#34;&gt;$webAppName&lt;/span&gt; --settings &lt;span class=&#34;nv&#34;&gt;AD_TENANT_ID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$tenantId&lt;/span&gt;
az webapp config appsettings &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; --resource-group &lt;span class=&#34;nv&#34;&gt;$resGroup&lt;/span&gt; --name &lt;span class=&#34;nv&#34;&gt;$webAppName&lt;/span&gt; --settings &lt;span class=&#34;nv&#34;&gt;REDIRECT_URI&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;https://tweb1app.azurewebsites.net/auth/azureadv2/callback&amp;#39;&lt;/span&gt;
az webapp config appsettings &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; --resource-group &lt;span class=&#34;nv&#34;&gt;$resGroup&lt;/span&gt; --name &lt;span class=&#34;nv&#34;&gt;$webAppName&lt;/span&gt; --settings &lt;span class=&#34;nv&#34;&gt;MICROSOFT_PROVIDER_AUTHENTICATION_SECRET&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;111xxxxxxxxxxxx11_1111xxxx1x&amp;#39;&lt;/span&gt;
&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;
az webapp start --name &lt;span class=&#34;nv&#34;&gt;$webAppName&lt;/span&gt; --resource-group &lt;span class=&#34;nv&#34;&gt;$resGroup&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Faster Directory Size Calculator</title>
      <link>https://oyundev.com/post/directory-usage/</link>
      <pubDate>Sat, 22 May 2021 00:00:00 +0000</pubDate>
      
      <guid>https://oyundev.com/post/directory-usage/</guid>
      <description>&lt;h1 id=&#34;a-faster-version-of-linuxunix-du--hs-command-implemented-in-rustgoc&#34;&gt;A faster version of Linux/Unix “du -hs” command implemented in Rust/Go/C#&lt;/h1&gt;
&lt;p&gt;Find out fastest Rust/Go/C# code calculating total disk usage of a directory under Windows and Linux.&lt;/p&gt;
&lt;p&gt;This is an experiment inspired by &lt;a href=&#34;https://github.com/artempyanykh/rdu&#34;&gt;https://github.com/artempyanykh/rdu&lt;/a&gt; project implementing a fast directory disk usage calculator, similar to unix/linux du tool but using rust-lang. Measurements are taken with Hyperfine v1.11.0: &lt;a href=&#34;https://github.com/sharkdp/hyperfine&#34;&gt;https://github.com/sharkdp/hyperfine&lt;/a&gt;. All measurements are with warm disk cache.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt; Debian GNU/Linux 9 (stretch) under WSL2 (Linux 4.19.128-microsoft-standard x86_64 GNU/Linux)&lt;br/&gt;
&lt;strong&gt;Windows 10 x64:&lt;/strong&gt; Microsoft Windows [Version 10.0.19042.450]&lt;/p&gt;
&lt;h3 id=&#34;disk-info&#34;&gt;Disk Info:&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Sequential write [4MB] block        Avg: 819,08MB/s
Sequential read [4MB] block         Avg: 2412,23MB/s
Random write [4KB] block            Avg: 120,39MB/s
Random read [4KB] block             Avg: 323,64MB/s
Memory copy [4MB] block             Avg: 3703,64MB/s
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;target-directory&#34;&gt;Target Directory:&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Files:        5403
Directories:  813
Size:         1.227.079.350 bytes
&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Contenders&lt;/th&gt;
&lt;th&gt;Programming Language&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Size Bytes Linux&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Size Bytes Win10&lt;/th&gt;
&lt;th&gt;Repo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;du/du64.exe&lt;/td&gt;
&lt;td&gt;C/C++&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;105.640&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;465.784&lt;/td&gt;
&lt;td&gt;Linux: internal /usr/bin/du, Windows: &lt;a href=&#34;https://docs.microsoft.com/en-us/sysinternals/downloads/du&#34;&gt;https://docs.microsoft.com/en-us/sysinternals/downloads/du&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rdu-async-par&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1.243.632&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1.126.400&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/artempyanykh/rdu&#34;&gt;https://github.com/artempyanykh/rdu&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;diskus&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;801.088&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;759.808&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/sharkdp/diskus&#34;&gt;https://github.com/sharkdp/diskus&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;du-rs&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;649.568&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;459.776&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/oyundev/du-rs&#34;&gt;https://github.com/oyundev/du-rs&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;du-go&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1.585.304&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1.735.168&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/oyundev/du-go&#34;&gt;https://github.com/oyundev/du-go&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;du-cs&lt;/td&gt;
&lt;td&gt;C#&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;5.172.232&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;4.855.296&lt;/td&gt;
&lt;td&gt;&lt;a href=&#34;https://github.com/oyundev/du-cs&#34;&gt;https://github.com/oyundev/du-cs&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;notes&#34;&gt;Notes:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;x86-64 Platform: amd64&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Rust version: 1.52&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Go version: go1.16.3&lt;br&gt;&lt;/li&gt;
&lt;li&gt;.Net 5.0 C# code compiled to native binary using experimental .net native AOT compiler at &lt;a href=&#34;https://github.com/dotnet/runtimelab/tree/feature/NativeAOT/samples/HelloWorld&#34;&gt;https://github.com/dotnet/runtimelab/tree/feature/NativeAOT/samples/HelloWorld&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;linux-debian-9-wsl2&#34;&gt;Linux Debian 9 (WSL2):&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;~$ hyperfine -L exe &lt;span class=&#34;s1&#34;&gt;&amp;#39;du -hs&amp;#39;&lt;/span&gt;,./rdu-async-par,&lt;span class=&#34;s1&#34;&gt;&amp;#39;./du-rs -p 64 -t 64&amp;#39;&lt;/span&gt;,&lt;span class=&#34;s1&#34;&gt;&amp;#39;./du-cs 64&amp;#39;&lt;/span&gt;,./du-go,&lt;span class=&#34;s1&#34;&gt;&amp;#39;./diskus --threads 64&amp;#39;&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;{exe} /mnt/r/test&amp;#39;&lt;/span&gt;
Benchmark &lt;span class=&#34;c1&#34;&gt;#1: du -hs /mnt/r/test&lt;/span&gt;

  Time &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;mean ± σ&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:     10.058 s ±  0.375 s    &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;User: 183.9 ms, System: 3104.2 ms&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
  Range &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;min … max&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:    9.562 s … 10.570 s    &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; runs

Benchmark &lt;span class=&#34;c1&#34;&gt;#2: ./rdu-async-par /mnt/r/test&lt;/span&gt;
  Time &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;mean ± σ&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:      5.426 s ±  0.030 s    &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;User: 723.1 ms, System: 6757.7 ms&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
  Range &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;min … max&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:    5.390 s …  5.494 s    &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; runs

Benchmark &lt;span class=&#34;c1&#34;&gt;#3: ./du-rs -p 64 -t 64 /mnt/r/test&lt;/span&gt;
  Time &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;mean ± σ&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:      3.717 s ±  0.016 s    &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;User: 235.6 ms, System: 5625.0 ms&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
  Range &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;min … max&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:    3.687 s …  3.735 s    &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; runs

Benchmark &lt;span class=&#34;c1&#34;&gt;#4: ./du-cs 64 /mnt/r/test&lt;/span&gt;
  Time &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;mean ± σ&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:      4.566 s ±  0.040 s    &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;User: 682.7 ms, System: 6599.2 ms&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
  Range &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;min … max&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:    4.515 s …  4.642 s    &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; runs

Benchmark &lt;span class=&#34;c1&#34;&gt;#5: ./du-go /mnt/r/test&lt;/span&gt;
  Time &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;mean ± σ&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:      3.210 s ±  0.016 s    &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;User: 404.6 ms, System: 4832.7 ms&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
  Range &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;min … max&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:    3.192 s …  3.231 s    &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; runs

Benchmark &lt;span class=&#34;c1&#34;&gt;#6: ./diskus --threads 64 /mnt/r/test&lt;/span&gt;
  Time &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;mean ± σ&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:      4.552 s ±  0.141 s    &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;User: 1.723 s, System: 7.016 s&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
  Range &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;min … max&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:    4.305 s …  4.732 s    &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; runs

Summary
  &lt;span class=&#34;s1&#34;&gt;&amp;#39;./du-go /mnt/r/test&amp;#39;&lt;/span&gt; ran
    1.16 ± 0.01 &lt;span class=&#34;nb&#34;&gt;times&lt;/span&gt; faster than &lt;span class=&#34;s1&#34;&gt;&amp;#39;./du-rs -p 64 -t 64 /mnt/r/test&amp;#39;&lt;/span&gt;
    1.42 ± 0.04 &lt;span class=&#34;nb&#34;&gt;times&lt;/span&gt; faster than &lt;span class=&#34;s1&#34;&gt;&amp;#39;./diskus --threads 64 /mnt/r/test&amp;#39;&lt;/span&gt;
    1.42 ± 0.01 &lt;span class=&#34;nb&#34;&gt;times&lt;/span&gt; faster than &lt;span class=&#34;s1&#34;&gt;&amp;#39;./du-cs 64 /mnt/r/test&amp;#39;&lt;/span&gt;
    1.69 ± 0.01 &lt;span class=&#34;nb&#34;&gt;times&lt;/span&gt; faster than &lt;span class=&#34;s1&#34;&gt;&amp;#39;./rdu-async-par /mnt/r/test&amp;#39;&lt;/span&gt;
    3.13 ± 0.12 &lt;span class=&#34;nb&#34;&gt;times&lt;/span&gt; faster than &lt;span class=&#34;s1&#34;&gt;&amp;#39;du -hs /mnt/r/test&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Command&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Mean [s]&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Min [s]&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Max [s]&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Relative&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;du -hs /mnt/r/test&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;10.058 ± 0.375&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;9.562&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;10.570&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;3.13 ± 0.12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;./rdu-async-par /mnt/r/test&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;5.426 ± 0.030&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;5.390&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;5.494&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1.69 ± 0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;./du-rs -p 64 -t 64 /mnt/r/test&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;3.717 ± 0.016&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;3.687&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;3.735&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1.16 ± 0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;./du-cs 64 /mnt/r/test&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;4.566 ± 0.040&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;4.515&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;4.642&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1.42 ± 0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;./du-go /mnt/r/test&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;3.210 ± 0.016&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;3.192&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;3.231&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;./diskus --threads 64 /mnt/r/test&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;4.552 ± 0.141&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;4.305&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;4.732&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1.42 ± 0.04&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;windows-10-x64&#34;&gt;Windows 10 (x64):&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;PS&amp;gt; .&lt;span class=&#34;se&#34;&gt;\h&lt;/span&gt;yperfine -L exe &lt;span class=&#34;s2&#34;&gt;&amp;#34;du64.exe -nobanner&amp;#34;&lt;/span&gt;,rdu-async-par.exe,du-rs.exe,&lt;span class=&#34;s2&#34;&gt;&amp;#34;du-cs.exe -t 64&amp;#34;&lt;/span&gt;,du-go.exe,&lt;span class=&#34;s2&#34;&gt;&amp;#34;diskus.exe --threads 64&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;{exe} r:\test&amp;#34;&lt;/span&gt;
Benchmark &lt;span class=&#34;c1&#34;&gt;#1: du64.exe -nobanner r:\test&lt;/span&gt;

  Time &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;mean ± σ&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:     703.1 ms ±   5.3 ms    &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;User: 1.4 ms, System: 6.2 ms&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
  Range &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;min … max&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:   692.4 ms … 709.2 ms    &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; runs

Benchmark &lt;span class=&#34;c1&#34;&gt;#2: rdu-async-par.exe r:\test&lt;/span&gt;
  Time &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;mean ± σ&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:     344.9 ms ±  24.3 ms    &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;User: 4.1 ms, System: 5.4 ms&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
  Range &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;min … max&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:   325.1 ms … 411.0 ms    &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; runs

Benchmark &lt;span class=&#34;c1&#34;&gt;#3: du-rs.exe r:\test&lt;/span&gt;
  Time &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;mean ± σ&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:      72.4 ms ±   5.1 ms    &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;User: 3.5 ms, System: 5.8 ms&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
  Range &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;min … max&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:    66.8 ms …  93.3 ms    &lt;span class=&#34;m&#34;&gt;28&lt;/span&gt; runs

Benchmark &lt;span class=&#34;c1&#34;&gt;#4: du-cs.exe -t 64 r:\test&lt;/span&gt;
  Time &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;mean ± σ&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:      86.4 ms ±  10.5 ms    &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;User: 1.9 ms, System: 4.6 ms&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
  Range &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;min … max&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:    71.3 ms … 109.5 ms    &lt;span class=&#34;m&#34;&gt;29&lt;/span&gt; runs

Benchmark &lt;span class=&#34;c1&#34;&gt;#5: du-go.exe r:\test&lt;/span&gt;
  Time &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;mean ± σ&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:      57.9 ms ±   2.4 ms    &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;User: 0.6 ms, System: 2.6 ms&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
  Range &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;min … max&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:    54.1 ms …  63.5 ms    &lt;span class=&#34;m&#34;&gt;42&lt;/span&gt; runs

Benchmark &lt;span class=&#34;c1&#34;&gt;#6: diskus.exe --threads 64 r:\test&lt;/span&gt;
  Time &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;mean ± σ&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:     156.8 ms ±   4.5 ms    &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;User: 2.5 ms, System: 4.4 ms&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
  Range &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;min … max&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:   150.4 ms … 169.4 ms    &lt;span class=&#34;m&#34;&gt;16&lt;/span&gt; runs

Summary
  &lt;span class=&#34;s1&#34;&gt;&amp;#39;du-go.exe r:\test&amp;#39;&lt;/span&gt; ran
    1.25 ± 0.10 &lt;span class=&#34;nb&#34;&gt;times&lt;/span&gt; faster than &lt;span class=&#34;s1&#34;&gt;&amp;#39;du-rs.exe r:\test&amp;#39;&lt;/span&gt;
    1.49 ± 0.19 &lt;span class=&#34;nb&#34;&gt;times&lt;/span&gt; faster than &lt;span class=&#34;s1&#34;&gt;&amp;#39;du-cs.exe -t 64 r:\test&amp;#39;&lt;/span&gt;
    2.71 ± 0.14 &lt;span class=&#34;nb&#34;&gt;times&lt;/span&gt; faster than &lt;span class=&#34;s1&#34;&gt;&amp;#39;diskus.exe --threads 64 r:\test&amp;#39;&lt;/span&gt;
    5.96 ± 0.49 &lt;span class=&#34;nb&#34;&gt;times&lt;/span&gt; faster than &lt;span class=&#34;s1&#34;&gt;&amp;#39;rdu-async-par.exe r:\test&amp;#39;&lt;/span&gt;
   12.14 ± 0.51 &lt;span class=&#34;nb&#34;&gt;times&lt;/span&gt; faster than &lt;span class=&#34;s1&#34;&gt;&amp;#39;du64.exe -nobanner r:\test&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:left&#34;&gt;Command&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Mean [ms]&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Min [ms]&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Max [ms]&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Relative&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;du64.exe -nobanner r:\test&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;703.1 ± 5.3&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;692.4&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;709.2&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;12.14 ± 0.51&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;rdu-async-par.exe r:\test&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;344.9 ± 24.3&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;325.1&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;411.0&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;5.96 ± 0.49&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;du-rs.exe r:\test&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;72.4 ± 5.1&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;66.8&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;93.3&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1.25 ± 0.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;du-cs.exe -t 64 r:\test&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;86.4 ± 10.5&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;71.3&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;109.5&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1.49 ± 0.19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;du-go.exe r:\test&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;57.9 ± 2.4&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;54.1&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;63.5&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:left&#34;&gt;&lt;code&gt;diskus.exe --threads 64 r:\test&lt;/code&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;156.8 ± 4.5&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;150.4&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;169.4&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;2.71 ± 0.14&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;who-is-the-winner-&#34;&gt;Who is the winner ?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Go is fastest of all in both platforms. I tried a lot of different approaches in Rust (without unsafe hacks) to speed it up but coroutine tasks in Go-lang are realy fast and efficient.&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Sadly none of my attemts using Rust tokio-main with multithreaded runtime flavor, async-std, walkdir, rayon etc. helped to speed up rust. Only using Xudong-Huang&amp;rsquo;s coroutines implementation (&lt;a href=&#34;https://github.com/Xudong-Huang/may&#34;&gt;https://github.com/Xudong-Huang/may&lt;/a&gt;) almost helped to match the speed of Go implementation.&lt;br&gt;&lt;/li&gt;
&lt;li&gt;Diskus when using 64 threads is very fast and beats standard solid implementation of rdu-async-par. At some point though increasing thread count begins to degrade performance.&lt;br&gt;&lt;/li&gt;
&lt;li&gt;There is an interesting comment in diskus source code about how performance is effected by context switching in multithreading and I/O Queue.
&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://oyundev.com/archives/</link>
      <pubDate>Tue, 28 May 2019 00:00:00 +0000</pubDate>
      
      <guid>https://oyundev.com/archives/</guid>
      <description></description>
    </item>
    
    <item>
      <title>About</title>
      <link>https://oyundev.com/about/</link>
      <pubDate>Thu, 28 Feb 2019 00:00:00 +0000</pubDate>
      
      <guid>https://oyundev.com/about/</guid>
      <description>&lt;p&gt;Written in Go, Hugo is an open source static site generator available under the &lt;a href=&#34;https://github.com/gohugoio/hugo/blob/master/LICENSE&#34;target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Apache Licence 2.0.&lt;/a&gt;
 Hugo supports TOML, YAML and JSON data file types, Markdown and HTML content files and uses shortcodes to add rich content. Other notable features are taxonomies, multilingual mode, image processing, custom output formats, HTML/CSS/JS minification and support for Sass SCSS workflows.&lt;/p&gt;
&lt;p&gt;Hugo makes use of a variety of open source projects including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/yuin/goldmark&#34;&gt;https://github.com/yuin/goldmark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/alecthomas/chroma&#34;&gt;https://github.com/alecthomas/chroma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/muesli/smartcrop&#34;&gt;https://github.com/muesli/smartcrop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/spf13/cobra&#34;&gt;https://github.com/spf13/cobra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/spf13/viper&#34;&gt;https://github.com/spf13/viper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hugo is ideal for blogs, corporate websites, creative portfolios, online magazines, single page applications or even a website with thousands of pages.&lt;/p&gt;
&lt;p&gt;Hugo is for people who want to hand code their own website without worrying about setting up complicated runtimes, dependencies and databases.&lt;/p&gt;
&lt;p&gt;Websites built with Hugo are extremelly fast, secure and can be deployed anywhere including, AWS, GitHub Pages, Heroku, Netlify and any other hosting provider.&lt;/p&gt;
&lt;p&gt;Learn more and contribute on &lt;a href=&#34;https://github.com/gohugoio&#34;target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;GitHub&lt;/a&gt;
.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>