diff options
author | David Luevano Alvarado <david@luevano.xyz> | 2022-05-15 16:43:35 -0600 |
---|---|---|
committer | David Luevano Alvarado <david@luevano.xyz> | 2022-05-15 16:43:35 -0600 |
commit | 1cb25d34b2c5efffd779560cde4e96a7b5231e42 (patch) | |
tree | ce62e24576131a411e8470fcc00ecce5abd0ceb7 | |
parent | 1cdd0e379c17c6ee98d16da3cc7f806c221556b6 (diff) |
add entry related to password and mfa manager
-rw-r--r-- | art/dst/rss.xml | 4 | ||||
-rw-r--r-- | blog/dst/a/password_manager_authenticator_setup.html | 152 | ||||
-rw-r--r-- | blog/dst/index.html | 1 | ||||
-rw-r--r-- | blog/dst/rss.xml | 26 | ||||
-rw-r--r-- | blog/dst/sitemap.xml | 6 | ||||
-rw-r--r-- | blog/dst/tag/@english.html | 4 | ||||
-rw-r--r-- | blog/dst/tag/@short.html | 4 | ||||
-rw-r--r-- | blog/dst/tag/@tools.html | 4 | ||||
-rw-r--r-- | blog/src/.files | 1 | ||||
-rw-r--r-- | blog/src/a/password_manager_authenticator_setup.md | 24 |
10 files changed, 219 insertions, 7 deletions
diff --git a/art/dst/rss.xml b/art/dst/rss.xml index fdfbed2..776bd8f 100644 --- a/art/dst/rss.xml +++ b/art/dst/rss.xml @@ -13,8 +13,8 @@ <copyright>Copyright 2021 David Luévano Alvarado</copyright> <managingEditor>david@luevano.xyz (David Luévano Alvarado)</managingEditor> <webMaster>david@luevano.xyz (David Luévano Alvarado)</webMaster> - <pubDate>Sun, 15 May 2022 10:03:50 GMT</pubDate> - <lastBuildDate>Sun, 15 May 2022 10:03:50 GMT</lastBuildDate> + <pubDate>Sun, 15 May 2022 22:40:48 GMT</pubDate> + <lastBuildDate>Sun, 15 May 2022 22:40:48 GMT</lastBuildDate> <generator>pyssg v0.7.1</generator> <docs>https://validator.w3.org/feed/docs/rss2.html</docs> <ttl>30</ttl> diff --git a/blog/dst/a/password_manager_authenticator_setup.html b/blog/dst/a/password_manager_authenticator_setup.html new file mode 100644 index 0000000..33c1830 --- /dev/null +++ b/blog/dst/a/password_manager_authenticator_setup.html @@ -0,0 +1,152 @@ +<!DOCTYPE html> +<html class="theme-dark" lang="en" + prefix="og: https://ogp.me/ns#"> + <head> + <base href="https://static.luevano.xyz"> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>My setup for a password manager and MFA authenticator -- Luévano's Blog</title> + <meta name="description" content"A short description on my personal setup regarding a password manager and alternatives to G\*\*gl\* authenticator."/> + <link rel="alternate" type="application/rss+xml" href="https://blog.luevano.xyz/rss.xml" title="Luévano's Blog RSS"> + <link rel="icon" href="images/icons/favicon.ico"> + + <!-- general style --> + <link rel="stylesheet" type="text/css" href="css/style.css"> + <link rel="stylesheet" type="text/css" href="fork-awesome/css/fork-awesome.min.css"> + <link rel="stylesheet" type="text/css" href="font-awesome/css/all.min.css"> + + <!-- highlight support for code blocks --> + <script type="text/javascript" src="hl/highlight.min.js"></script> + <!--<script type="text/javascript" src="hl/highlight-ln.min.js"></script>--> + <script type="text/javascript"> + hljs.initHighlightingOnLoad(); + // hljs.initLineNumbersOnLoad(); + </script> + + <!-- theme related --> + <script type="text/javascript" src="scripts/theme.js"></script> + <link id="theme-css" rel="stylesheet" type="text/css" href="css/theme.css"> + <link id="code-theme-css" rel="stylesheet" type="text/css" href="hl/styles/nord.min.css"> + + <!-- og meta --> + <meta property="og:title" content="My setup for a password manager and MFA authenticator -- Luévano's Blog"/> + <meta property="og:type" content="article"/> + <meta property="og:url" content="https://blog.luevano.xyz/a/password_manager_authenticator_setup.html"/> + <meta property="og:image" content="https://static.luevano.xyz//images/b/default.png"/> + <meta property="og:description" content="A short description on my personal setup regarding a password manager and alternatives to G\*\*gl\* authenticator."/> + <meta property="og:locale" content="en"/> + <meta property="og:site_name" content="Luévano's Blog"/> + </head> + + <body> + <header> + <nav> + <ul> + <li> + <a href="https://luevano.xyz/"><i class="fas fa-home" alt="Home"></i><span>Home</span></a> + </li> + + <li> + <a href="https://blog.luevano.xyz/"><i class="fas fa-book-open" alt="Blog"></i><span>Blog</span></a> + </li> + + <li> + <a href="https://art.luevano.xyz/"><i class="fas fa-paint-brush" alt="Art"></i><span>Art</span></a> + </li> + + <li><i class="fab fa-git" alt="Git"></i><span>Git</span> + <ul> + <li><a href="https://git.luevano.xyz/" target="_blank"><i class="fab fa-git-alt" alt="Git-alt"></i></a></li> + + <li><a href="https://github.com/luevano" target="_blank"><i class="fab fa-github" alt="Github"></i></a></li> + + <li><a href="https://gitlab.com/dluevano" target="_blank"><i class="fab fa-gitlab" alt="Gitlab"></i></a></li> + </ul> + </li> + + <li><i class="fas fa-box-open" alt="Stuff"></i><span>Stuff</span> + <ul> + <li><a href="https://gb.luevano.xyz/"><i class="fas fa-gamepad" alt="Gameboy"></i><span>Gameboy</span></a></li> + </ul> + </li> + </ul> + </nav> + + <button class="theme-switcher" onclick="toggleTheme()"><i class="fas fa-moon"></i><i class="fas fa-sun"></i></button> + </header> + + <main> + <h1>My setup for a password manager and MFA authenticator</h1> + + <p><strong>Disclaimer</strong>: I won’t go into many technical details here of how to install/configure/use the software, this is just supposed to be a short description on my setup.</p> +<p>It’s been a while since I started using a password manager at all, and I’m happy that I started with <a href="https://keepassxc.org/">KeePassXC</a> (open source, multiplatform password manager that it’s completely offline) as a direct recommendation from <a href="https://www.lmcj.xyz/">EL LM</a>; before this I was using the same password for everything (like a lot of people), which is a well know privacy issue as noted in detail by <a href="https://askleo.com/different-passwords-for-everything/">Leo</a> (I don’t personally recommed LastPass as Leo does). Note that you will still need a <em>master password</em> to lock/unlock your password database (you can additionally use a hardware key and a key file).</p> +<p>Anyways, setting up <em>keepass</em> is pretty simple, as there is a client for almost any device; note that <em>keepass</em> is basically just the format and the base for all of the clients, as its common with pretty much any open source software. In my case I’m using <a href="https://keepassxc.org/">KeePassXC</a> in my computer and <a href="https://www.keepassdx.com/">KeePassDX</a> in my phone (Android). The only concern is keeping everything in sync because <em>keepass</em> doesn’t have any automatic method of synchronizing between devices because of security reasons (as far as I know), meaning that you have to manage that yourself.</p> +<p>Usually you can use something like G**gl* drive, dropbox, mega, nextcloud, or any other cloud solution that you like to sync your <em>keepass</em> database between devices; I personally prefer to use <a href="https://syncthing.net/">Syncthing</a> as it’s open source, it’s really easy to setup and has worked wonders for me since I started using it, also it keeps versions of your files that can serve as backups in any scenario where the database gets corrupted or something.</p> +<p>Finally, when I went through the issue with the micro SD and the <em>adoptable storage</em> bullshit (you can find the rant <a href="https://blog.luevano.xyz/a/devs_android_me_trozaron.html">here</a>, in spanish) I had to also migrate from <em>G**gl* authenticator</em> (<em>gauth</em>) to something else for the simple reason that <em>gauth</em> doesn’t even let you do backups, nor it’s synched with your account… nothing, it is just standalone and if you ever lose your phone you’re fucked; so I decided to go with <a href="https://getaegis.app/">Aegis authenticator</a>, as it is open source, you have control over all your secret keys, you can do backups directly to the filesystem, you can secure your database with an extra password, etc., etc.. In general <em>aegis</em> is the superior MFA authenticator (at least compared with <em>gauth</em>) and everything that’s compatible with <em>gauth</em> is compatible with <em>aegis</em> as the format is a standard (as a matter of fact, <em>keepass</em> also has this MFA feature which is called TOPT and is also compatible, but I prefer to have things separate). I also use <em>syncthing</em> to keep a backup of my <em>aegis</em> database.</p> +<p><strong>TL;DR</strong>:</p> +<ul> +<li><a href="https://syncthing.net/">Syncthing</a> to sync files between devices (for the password databases).</li> +<li><a href="https://keepassxc.org/">KeePassXC</a> for the password manager in my computer.</li> +<li><a href="https://www.keepassdx.com/">KeePassDX</a> for the password manager in my phone.</li> +<li><a href="https://getaegis.app/">Aegis authenticator</a> for the universal MFA authenticator.</li> +</ul> + + <div class="page-nav"> + + <span class="index"> + <a href="https://blog.luevano.xyz" alt="Index"> + <i class="fas fa-home" alt="Home"></i> + <span>Index</span> + </a> + </span> + + <span class="previous"> + <a href="https://blog.luevano.xyz/a/devs_android_me_trozaron.html" alt="Previous"> + <i class="fas fa-arrow-right" alt="Arrow right"></i> + <span>Previous</span> + </a> + </span> +</div> + + + <hr> + <div class="article-info"> + <p>By David Luévano</p> + <p>Created: Sun, May 15, 2022 @ 22:40 UTC</p> + <div class="article-tags"> + <p>Tags: +<a href="https://blog.luevano.xyz/tag/@english.html">english</a>, <a href="https://blog.luevano.xyz/tag/@short.html">short</a>, <a href="https://blog.luevano.xyz/tag/@tools.html">tools</a> </p> +</div> + + </div> + </main> + + <footer> + <span> + <i class="fas fa-address-card" alt="Contact"></i> + <a href="https://luevano.xyz/contact.html">Contact</a> + </span> + + <span> + <i class="fas fa-donate" alt="Donate"></i> + <a href="https://luevano.xyz/donate.html">Donate</a> + </span> + + <span> + <i class="fas fa-rss" alt="RSS"></i> + <a target="_blank" href="https://blog.luevano.xyz/rss.xml">RSS</a> + </span> + + <br> + <span class="created-with"> + <i class="fas fa-hammer" alt="Hammer"></i> + Created with <a href="https://github.com/luevano/pyssg">pyssg</a> + </span> + + <br> + <span class="copyright"> + Copyright <i class="far fa-copyright" alt="Copyright"></i> 2021 David Luévano Alvarado + </span> + </footer> + </body> +</html>
\ No newline at end of file diff --git a/blog/dst/index.html b/blog/dst/index.html index b048273..484baa0 100644 --- a/blog/dst/index.html +++ b/blog/dst/index.html @@ -95,6 +95,7 @@ <h2>Articles</h2> <ul class="page-list"> <h3>May 2022</h3> + <li>May 15 - <a href="https://blog.luevano.xyz/a/password_manager_authenticator_setup.html">My setup for a password manager and MFA authenticator</a></li> <li>May 15 - <a href="https://blog.luevano.xyz/a/devs_android_me_trozaron.html">Los devs de Android/MIUI me trozaron</a></li> <h3>April 2022</h3> <li>Apr 28 - <a href="https://blog.luevano.xyz/a/volviendo_a_usar_la_pagina.html">Volviendo a usar la página</a></li> diff --git a/blog/dst/rss.xml b/blog/dst/rss.xml index 4c97d2a..bd9bf39 100644 --- a/blog/dst/rss.xml +++ b/blog/dst/rss.xml @@ -13,8 +13,8 @@ <copyright>Copyright 2021 David Luévano Alvarado</copyright> <managingEditor>david@luevano.xyz (David Luévano Alvarado)</managingEditor> <webMaster>david@luevano.xyz (David Luévano Alvarado)</webMaster> - <pubDate>Sun, 15 May 2022 10:03:49 GMT</pubDate> - <lastBuildDate>Sun, 15 May 2022 10:03:49 GMT</lastBuildDate> + <pubDate>Sun, 15 May 2022 22:40:48 GMT</pubDate> + <lastBuildDate>Sun, 15 May 2022 22:40:48 GMT</lastBuildDate> <generator>pyssg v0.7.1</generator> <docs>https://validator.w3.org/feed/docs/rss2.html</docs> <ttl>30</ttl> @@ -24,6 +24,28 @@ <link>https://blog.luevano.xyz</link> </image> <item> + <title>My setup for a password manager and MFA authenticator</title> + <link>https://blog.luevano.xyz/a/password_manager_authenticator_setup.html</link> + <guid isPermaLink="true">https://blog.luevano.xyz/a/password_manager_authenticator_setup.html</guid> + <pubDate>Sun, 15 May 2022 22:40:34 GMT</pubDate> + <category>English</category> + <category>Short</category> + <category>Tools</category> + <description>A short description on my personal setup regarding a password manager and alternatives to G\*\*gl\* authenticator.</description> + <content:encoded><![CDATA[<p><strong>Disclaimer</strong>: I won’t go into many technical details here of how to install/configure/use the software, this is just supposed to be a short description on my setup.</p> +<p>It’s been a while since I started using a password manager at all, and I’m happy that I started with <a href="https://keepassxc.org/">KeePassXC</a> (open source, multiplatform password manager that it’s completely offline) as a direct recommendation from <a href="https://www.lmcj.xyz/">EL LM</a>; before this I was using the same password for everything (like a lot of people), which is a well know privacy issue as noted in detail by <a href="https://askleo.com/different-passwords-for-everything/">Leo</a> (I don’t personally recommed LastPass as Leo does). Note that you will still need a <em>master password</em> to lock/unlock your password database (you can additionally use a hardware key and a key file).</p> +<p>Anyways, setting up <em>keepass</em> is pretty simple, as there is a client for almost any device; note that <em>keepass</em> is basically just the format and the base for all of the clients, as its common with pretty much any open source software. In my case I’m using <a href="https://keepassxc.org/">KeePassXC</a> in my computer and <a href="https://www.keepassdx.com/">KeePassDX</a> in my phone (Android). The only concern is keeping everything in sync because <em>keepass</em> doesn’t have any automatic method of synchronizing between devices because of security reasons (as far as I know), meaning that you have to manage that yourself.</p> +<p>Usually you can use something like G**gl* drive, dropbox, mega, nextcloud, or any other cloud solution that you like to sync your <em>keepass</em> database between devices; I personally prefer to use <a href="https://syncthing.net/">Syncthing</a> as it’s open source, it’s really easy to setup and has worked wonders for me since I started using it, also it keeps versions of your files that can serve as backups in any scenario where the database gets corrupted or something.</p> +<p>Finally, when I went through the issue with the micro SD and the <em>adoptable storage</em> bullshit (you can find the rant <a href="https://blog.luevano.xyz/a/devs_android_me_trozaron.html">here</a>, in spanish) I had to also migrate from <em>G**gl* authenticator</em> (<em>gauth</em>) to something else for the simple reason that <em>gauth</em> doesn’t even let you do backups, nor it’s synched with your account… nothing, it is just standalone and if you ever lose your phone you’re fucked; so I decided to go with <a href="https://getaegis.app/">Aegis authenticator</a>, as it is open source, you have control over all your secret keys, you can do backups directly to the filesystem, you can secure your database with an extra password, etc., etc.. In general <em>aegis</em> is the superior MFA authenticator (at least compared with <em>gauth</em>) and everything that’s compatible with <em>gauth</em> is compatible with <em>aegis</em> as the format is a standard (as a matter of fact, <em>keepass</em> also has this MFA feature which is called TOPT and is also compatible, but I prefer to have things separate). I also use <em>syncthing</em> to keep a backup of my <em>aegis</em> database.</p> +<p><strong>TL;DR</strong>:</p> +<ul> +<li><a href="https://syncthing.net/">Syncthing</a> to sync files between devices (for the password databases).</li> +<li><a href="https://keepassxc.org/">KeePassXC</a> for the password manager in my computer.</li> +<li><a href="https://www.keepassdx.com/">KeePassDX</a> for the password manager in my phone.</li> +<li><a href="https://getaegis.app/">Aegis authenticator</a> for the universal MFA authenticator.</li> +</ul>]]></content:encoded> + </item> + <item> <title>Los devs de Android/MIUI me trozaron</title> <link>https://blog.luevano.xyz/a/devs_android_me_trozaron.html</link> <guid isPermaLink="true">https://blog.luevano.xyz/a/devs_android_me_trozaron.html</guid> diff --git a/blog/dst/sitemap.xml b/blog/dst/sitemap.xml index 3dcf825..f2b8356 100644 --- a/blog/dst/sitemap.xml +++ b/blog/dst/sitemap.xml @@ -3,6 +3,12 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> <url> + <loc>https://blog.luevano.xyz/a/password_manager_authenticator_setup.html</loc> + <lastmod>2022-05-15</lastmod> + <changefreq>weekly</changefreq> + <priority>1.0</priority> + </url> + <url> <loc>https://blog.luevano.xyz/a/devs_android_me_trozaron.html</loc> <lastmod>2022-05-15</lastmod> <changefreq>weekly</changefreq> diff --git a/blog/dst/tag/@english.html b/blog/dst/tag/@english.html index 65833c2..d2e43f0 100644 --- a/blog/dst/tag/@english.html +++ b/blog/dst/tag/@english.html @@ -80,7 +80,9 @@ <h2>Articles</h2> <ul class="page-list"> - <h3>August 2021</h3> + <h3>May 2022</h3> + <li>May 15 - <a href="https://blog.luevano.xyz/a/password_manager_authenticator_setup.html">My setup for a password manager and MFA authenticator</a></li> + <h3>August 2021</h3> <li>Aug 01 - <a href="https://blog.luevano.xyz/a/vpn_server_with_openvpn.html">Create a VPN server with OpenVPN (IPv4)</a></li> <h3>June 2021</h3> <li>Jun 09 - <a href="https://blog.luevano.xyz/a/xmpp_server_with_prosody.html">Create an XMPP server with Prosody compatible with Conversations and Movim</a></li> diff --git a/blog/dst/tag/@short.html b/blog/dst/tag/@short.html index 74701ca..c8d0f5f 100644 --- a/blog/dst/tag/@short.html +++ b/blog/dst/tag/@short.html @@ -80,7 +80,9 @@ <h2>Articles</h2> <ul class="page-list"> - <h3>April 2022</h3> + <h3>May 2022</h3> + <li>May 15 - <a href="https://blog.luevano.xyz/a/password_manager_authenticator_setup.html">My setup for a password manager and MFA authenticator</a></li> + <h3>April 2022</h3> <li>Apr 28 - <a href="https://blog.luevano.xyz/a/volviendo_a_usar_la_pagina.html">Volviendo a usar la página</a></li> <h3>July 2021</h3> <li>Jul 18 - <a href="https://blog.luevano.xyz/a/tenia_esto_descuidado.html">Tenia este pex algo descuidado</a></li> diff --git a/blog/dst/tag/@tools.html b/blog/dst/tag/@tools.html index 44f4b72..1cb1895 100644 --- a/blog/dst/tag/@tools.html +++ b/blog/dst/tag/@tools.html @@ -80,7 +80,9 @@ <h2>Articles</h2> <ul class="page-list"> - <h3>August 2021</h3> + <h3>May 2022</h3> + <li>May 15 - <a href="https://blog.luevano.xyz/a/password_manager_authenticator_setup.html">My setup for a password manager and MFA authenticator</a></li> + <h3>August 2021</h3> <li>Aug 01 - <a href="https://blog.luevano.xyz/a/vpn_server_with_openvpn.html">Create a VPN server with OpenVPN (IPv4)</a></li> <h3>June 2021</h3> <li>Jun 09 - <a href="https://blog.luevano.xyz/a/xmpp_server_with_prosody.html">Create an XMPP server with Prosody compatible with Conversations and Movim</a></li> diff --git a/blog/src/.files b/blog/src/.files index bf59f33..22eb7d9 100644 --- a/blog/src/.files +++ b/blog/src/.files @@ -12,3 +12,4 @@ a/hoy_toco_desarrollo_personaje.md 1627452655.5560262 0.0 b891e8efe4e9a5c3f342f9 a/vpn_server_with_openvpn.md 1627810022.100739 1627812788.832212 7df7d2d05cb07a5d83284f41f3ce9054 english,server,tools,tutorial a/volviendo_a_usar_la_pagina.md 1651116062.9191298 1651116501.5491333 0f36388a5a216a8b7c79a52e84219fca short,spanish,update a/devs_android_me_trozaron.md 1652608264.4901433 1652609027.0201497 41c897ac0c6e0bd66f67ddc8286f4413 rant,spanish,update +a/password_manager_authenticator_setup.md 1652654434.4686146 0.0 dc72958a26d27780b149b974221234a3 english,short,tools diff --git a/blog/src/a/password_manager_authenticator_setup.md b/blog/src/a/password_manager_authenticator_setup.md new file mode 100644 index 0000000..2af5bc6 --- /dev/null +++ b/blog/src/a/password_manager_authenticator_setup.md @@ -0,0 +1,24 @@ +title: My setup for a password manager and MFA authenticator +author: David Luévano +lang: en +summary: A short description on my personal setup regarding a password manager and alternatives to G\*\*gl\* authenticator. +tags: tools + short + english + +**Disclaimer**: I won't go into many technical details here of how to install/configure/use the software, this is just supposed to be a short description on my setup. + +It's been a while since I started using a password manager at all, and I'm happy that I started with [KeePassXC](https://keepassxc.org/) (open source, multiplatform password manager that it's completely offline) as a direct recommendation from [EL LM](https://www.lmcj.xyz/); before this I was using the same password for everything (like a lot of people), which is a well know privacy issue as noted in detail by [Leo](https://askleo.com/different-passwords-for-everything/) (I don't personally recommed LastPass as Leo does). Note that you will still need a *master password* to lock/unlock your password database (you can additionally use a hardware key and a key file). + +Anyways, setting up *keepass* is pretty simple, as there is a client for almost any device; note that *keepass* is basically just the format and the base for all of the clients, as its common with pretty much any open source software. In my case I'm using [KeePassXC](https://keepassxc.org/) in my computer and [KeePassDX](https://www.keepassdx.com/) in my phone (Android). The only concern is keeping everything in sync because *keepass* doesn't have any automatic method of synchronizing between devices because of security reasons (as far as I know), meaning that you have to manage that yourself. + +Usually you can use something like G\*\*gl\* drive, dropbox, mega, nextcloud, or any other cloud solution that you like to sync your *keepass* database between devices; I personally prefer to use [Syncthing](https://syncthing.net/) as it's open source, it's really easy to setup and has worked wonders for me since I started using it, also it keeps versions of your files that can serve as backups in any scenario where the database gets corrupted or something. + +Finally, when I went through the issue with the micro SD and the *adoptable storage* bullshit (you can find the rant [here](https://blog.luevano.xyz/a/devs_android_me_trozaron.html), in spanish) I had to also migrate from *G\*\*gl\* authenticator* (*gauth*) to something else for the simple reason that *gauth* doesn't even let you do backups, nor it's synched with your account... nothing, it is just standalone and if you ever lose your phone you're fucked; so I decided to go with [Aegis authenticator](https://getaegis.app/), as it is open source, you have control over all your secret keys, you can do backups directly to the filesystem, you can secure your database with an extra password, etc., etc.. In general *aegis* is the superior MFA authenticator (at least compared with *gauth*) and everything that's compatible with *gauth* is compatible with *aegis* as the format is a standard (as a matter of fact, *keepass* also has this MFA feature which is called TOPT and is also compatible, but I prefer to have things separate). I also use *syncthing* to keep a backup of my *aegis* database. + +**TL;DR**: + +- [Syncthing](https://syncthing.net/) to sync files between devices (for the password databases). +- [KeePassXC](https://keepassxc.org/) for the password manager in my computer. +- [KeePassDX](https://www.keepassdx.com/) for the password manager in my phone. +- [Aegis authenticator](https://getaegis.app/) for the universal MFA authenticator.
\ No newline at end of file |