Verified Commit 28b24b5f authored by Ming Di Leom's avatar Ming Di Leom
Browse files

post: replace 'image' tag plugin with markdown syntax

parent 8e421b92
......@@ -18,20 +18,20 @@ Firefox can restrict the referrer to the same origin only ([docs](https://wiki.m
When you try to login to AliExpress, the login box is just blank.
{% image '20190228/no-login.png' 'Blank aliexpress login box' %}
![Blank aliexpress login box](20190228/no-login.png)
In the new design, the loading wheel just keeps spinning.
{% image '20190228/invalid-login.png' 'Aliexpress login pop-up keeps loading' %}
![Aliexpress login pop-up keeps loading](20190228/invalid-login.png)
Upon inspection on the blank element (right click on the blank login and select `Inspect Element`), the login box is an iframe of ``. From the Web Console (`Ctrl + Shift + K`), the following error message suggested it's caused by [X-Frame-Options](
{% image '20190228/iframe.png' 'Aliexpress login page under an iframe' %}
{% image '20190228/x-frame.png' 'Console error of Aliexpress login' %}
![Aliexpress login page under an iframe](20190228/iframe.png)
![Console error of Aliexpress login](20190228/x-frame.png)
From the Network inspection (`Ctrl + Shift + E`), `` has HTTP header `x-frame-options: SAMEORIGIN` (which I believe stems from the `XOriginPolicy` setting). This restricts the iframe to the same domain. This caused the iframe unable to load because it's different from the login page ``.
{% image '20190228/sameorigin.png' 'Aliexpress x-frame-options is sameorigin' %}
![Aliexpress x-frame-options is sameorigin](20190228/sameorigin.png)
**Edit:** After pinpoint the issue to `XOriginPolicy`, I suspect AliExpress sends the referrer from `login` to `passport` for tracking purpose, and somehow `passport` could not be loaded if it does not receive any referrer. There are a few options to resolve this.
......@@ -41,7 +41,7 @@ From the Network inspection (`Ctrl + Shift + E`), `https://passport.aliexpress.c
To use the old login page, mouse-over on the **Account** link at the top right corner and click on **My Orders**. It should redirects to ``
{% image '20190228/my-orders.png' "Aliexpress 'My Orders' link" %}
![Aliexpress 'My Orders' link](20190228/my-orders.png)
## Reset referer policy
......@@ -63,11 +63,11 @@ To use the old login page, mouse-over on the **Account** link at the top right c*
{% image '20190228/whitelist.png' "Add a whitelist to 'Ignore X-Frame-Options'" %}
![Add a whitelist to 'Ignore X-Frame-Options'](20190228/whitelist.png)
That's how the whitelist works on the extension; you add the domain of the iframe not the page's domain. After you add it to the list, refresh the page and you should see the login.
{% image '20190228/login.png' 'Regular Aliexpress login page' %}
![Regular Aliexpress login page](20190228/login.png)
## Direct link
......@@ -13,22 +13,22 @@ Before you rush off to purchase your funky new domain, do note that (as per ICAA
For optimal privacy, register a NameSilo account *before* you make your purchase. After you register an account, go to "Account Settings", scroll to the bottom and adjust the following settings.
{% image '20190905/namesilo-user.png' 'Recommended NameSilo User Settings' %}
![Recommended NameSilo User Settings](20190905/namesilo-user.png)
Now proceed to purchase your domain (remember to enable WHOIS Privacy in the cart, it's free) and wait for 60 days. While you are waiting, register a Cloudflare account and change the [name server]( to Cloudflare's on NameSilo Domain Console page. This step is required before you can transfer to Cloudflare.
Once the transfer lock period has passed, go to your domain **Overview** on Cloudflare, on the right bottom is the "Domain Registration" section to kickstart the transfer. Mine looks different because I already transferred.
{% image '20190905/cloudflare-registrar-section.png' 'Domain Registration Section on Cloudflare' %}
![Domain Registration Section on Cloudflare](20190905/cloudflare-registrar-section.png)
Simply follow [the process]( and you should be able to transfer across in less than three days. To expedite the process, after you make the payment, you should receive the following email from NameSilo in less than a day.
{% image '20190905/transfer-notification.png' 'NameSilo transfer notification' %}
![NameSilo transfer notification](20190905/transfer-notification.png)
Once you receive that, go to "Transfer Manager" and click Approve. After you approve, the domain should be transferred across in 15 minutes.
However, the process above may not go as smoothly and the initial transfer might fail. If you receive an email from Cloudflare saying the transfer was rejected, fret not, most probably it is rejected by the registry (for whatever reason) instead of NameSilo. Simply restart the transfer through the Domain Registration section. The authorization code is the same (as what you receive from NameSilo's email), so you don't need to request again.
{% image '20190905/cloudflare-registrar-section.png' 'Domain Registration Section on Cloudflare' %}
![Domain Registration Section on Cloudflare](20190905/cloudflare-registrar-section.png)
Disclaimer: I do **not** receive any commission from any of the products mentioned above. None of the links are affiliate link.
......@@ -20,7 +20,7 @@ If you use Compiz, the shortcut is not shown in Keyboard Shortcuts due to confli
Launch dconf-editor and search (click on the search icon on top right corner or just Ctrl+F) for 'shaded'.
{% image '20181024/dconf.png' "Search for 'shaded' in dconf-editor" %}
![Search for 'shaded' in dconf-editor](20181024/dconf.png)
Simply navigate into
......@@ -31,4 +31,4 @@ Toggle 'Use default value' to off, and set the custom value as `disabled`.
Finally, disable the shortcut in CCSM. Go to General Options > Key bindings (tab) > Toggle Window Shaded (last value).
{% image '20181024/ccsm.png' "Disable Shaded Window in CCSM" %}
![Disable Shaded Window in CCSM](20181024/ccsm.png)
......@@ -14,7 +14,7 @@ ISP still knows what **IP address** you are connecting to. Even with HTTPS and D
But even with all that, I repeat, ISP still *knows* what IP address you are connecting to. A simple reverse DNS lookup or even just by visiting the IP address can reveal what website it belongs to. While reverse DNS lookup is not as easy as ten years ago due to the current proliferation of content delivery network (CDN) like Cloudflare, yet it is still possible. For example, A `dig startpage @` returned ``. When you go to the IP through a web browser, it redirects to Going to's IP resulted in SSL warning with shown as the valid hostname.
{% image '20190404/gitlab-ip.png' 'Reverse domain lookup through browser' %}
![Reverse domain lookup through browser](20190404/gitlab-ip.png)
Websites that are behind CDN can be harder to lookup. For example, `dig @` returned ``, but going to that IP resulted in an error page. Even then, with sufficient dataset, it is still [possible]( to infer a website from an IP.
......@@ -14,7 +14,7 @@ On LimeSurvey, making minor edits to multiple questions can be quite a chore. `L
Edit: The view is accessible through (Survey) Settings > Survey menu > List questions.
{% image '20181018/listquestions.png' 'List all question in LimeSurvey' %}
![List all question in LimeSurvey](20181018/listquestions.png)
Ignore the rest...
......@@ -32,8 +32,8 @@ Replace `questiongroups` to `survey` and replace `view` to `listquestions`, so t
This is what ListQuestions view looks like,
{% image '20181018/limesurvey.png' 'LimeSurvey ListQuestions page' %}
![LimeSurvey ListQuestions page](20181018/limesurvey.png)
The view is also useful for quickly open multiple questions. Simply ctrl + left click or just middle click on the Edit button to open the question (to edit) in new tab.
{% image '20181018/limesurvey-edit.png' 'Edit button on LimeSurvey' %}
![Edit button on LimeSurvey](20181018/limesurvey-edit.png)
......@@ -11,7 +11,7 @@ tags:
Whenever I try to open an Engadget article, it will automatically redirect me to `` which is (thankfully) blocked by uBO.
{% image '20190609/guce-engadget.png' 'uBO blocks Engadget redirect' %}
![uBO blocks Engadget redirect](20190609/guce-engadget.png)
Initially, I was able to workaround by opening the article in a private window, but it was not reliable. I didn't know why private window worked in the first place (and only found the reason later on). I figured it must be redirected by third-party javascript, so I checked the page source, looked for suspicious domains and block them using uBO. That didn't work, not even disabling javascript.
......@@ -29,15 +29,15 @@ Firefox can block cookie by website. To block Engadget from setting a cookie, in
2. Navigate to **Privacy & Security** tab on the left.
3. Scroll down to **Cookies & Site Data** section and open **Manage Permissions**.
{% image '20190609/privacy-settings.png' 'Privacy settings in Firefox' %}
![Privacy settings in Firefox](20190609/privacy-settings.png)
4. Put `` as the address and click **Block** and save it.
{% image '20190609/engadget-block-cookie.png' 'Block Engadget cookies' %}
![Block Engadget cookies](20190609/engadget-block-cookie.png)
5. If you have **Clear history when Firefox enabled** enabled, make sure **Site Preferences** is unchecked.
{% image '20190609/uncheck-site.png' 'Settings for clearing history' %}
![Settings for clearing history](20190609/uncheck-site.png)
That's it. If you want to know what is the purpose of ``, read on.
......@@ -27,23 +27,23 @@ privacy.userContext.longPressBehavior;2
Once you enabled it, you should be able to access its setting from `about:preferences#containers`. Here's what the default settings look like:
{% image '20190812/container-in-preferences.png' "Containers settings in Firefox Preferences" %}
![Containers settings in Firefox Preferences](20190812/container-in-preferences.png)
{% image '20190812/container-settings.png' "Containers' default setting" %}
![Containers' default setting](20190812/container-settings.png)
The name, icon and colour are customisable.
{% image '20190812/container-personalisation.png' "Personalise Containers" %}
![Personalise Containers](20190812/container-personalisation.png)
There are two ways of using the Containers. We can open a link on a webpage in a specific container, by right-click → Open Link in New Container Tab.
{% image '20190812/container-context-menu.png' "Containers right-click menu" %}
![Containers right-click menu](20190812/container-context-menu.png)
We also can open a new container tab by long-pressing the plus (+) button, next to a tab.
{% image '20190812/containers-tabs.png' "New Container Tab" %}
![New Container Tab](20190812/containers-tabs.png)
{% image '20190812/containers-tabs.webp' "Container Tab in action" %}
![Container Tab in action](20190812/containers-tabs.webp)
## Facebook Container
......@@ -11,20 +11,18 @@ tags:
Many criticise Firefox for using Cloudflare by default in DNS-over-HTTPS. In reality, it's **not enabled** by default and you can **easily switch** to other providers.
{% image '20190525/firefox-doh.png' "'DNS over HTTPS' setting in Firefox" %}
!['DNS over HTTPS' setting in Firefox](20190525/firefox-doh.png)
That's right, as of version 66, it's *still* **not** enabled by default. You want to use DNS-over-HTTPS but not to use Cloudflare? Just click on 'Custom' and enter the provider's address. There are a few to choose from. Refer to the lists provided by [AdGuard]( and [cURL](
{% image '20190525/firefox-doh-animated.webp' "How to enable 'DNS over HTTPS' in Firefox" %}
![How to enable 'DNS over HTTPS' in Firefox](20190525/firefox-doh-animated.webp)
I'm writing this in response to the recent [Opera article]( by Ars Technica,
{% blockquote %}
Firefox is also planning to change how it handles DNS in ways that [could seriously compromise]( the browser, which makes me uncertain about its future.
{% endblockquote %}
> Firefox is also planning to change how it handles DNS in ways that [could seriously compromise]( the browser, which makes me uncertain about its future.
The link referenced by the author refers to an article written right after Firefox introduces the DoH feature. At that time, there was no UI to configure it, the only way is through the 'about:config'. So, I can see why some feel sceptical *at that time*. The [official announcement](, "We'd like to turn this on as the default...", didn't help either. Yet a year later, it's still disabled by default.
For me, I think having DoH in a browser is a great *security* feature. Yes, DoH has overhead of HTTP and SSL, as many have critiqued. But look in this way, DoH is a stopgap solution, until DNS encryption (via DNS-over-TLS, DNSCrypt or similar) is baked into the OS.
By the way, despite what tech articles said about DoH, it is more of a security feature, rather than a privacy feature. See my {% post_link doh-tls-privacy 'other post' %} on this.
\ No newline at end of file
By the way, despite what tech articles said about DoH, it is more of a security feature, rather than a privacy feature. See my {% post_link doh-tls-privacy 'other post' %} on this.
......@@ -16,7 +16,7 @@ For example, you are looking for item A and B at a shopping website using the pr
A useful feature of Firefox is that it allows more than one profile, which otherwise would requires multiple operating system accounts. The feature even allows you to run multiple profiles at the same time by having multiple instances.
{% image '20190407/firefox-error.png' "'Firefox is currently running' error" %}
!['Firefox is currently running' error](20190407/firefox-error.png)
There are two ways of creating profiles: (1) **Fresh** profile and (2) **Clone** existing profile.
......@@ -30,19 +30,19 @@ firefox --no-remote -P 'new profile name'
2. Click "Create Profile...".
{% image '20190407/profile-manager.png' 'Firefox Profile Manager' %}
![Firefox Profile Manager](20190407/profile-manager.png)
3. Click "Next".
{% image '20190407/profile-wizard.png' 'Wizard to set up new Firefox profile' %}
![Wizard to set up new Firefox profile](20190407/profile-wizard.png)
4. Name the new profile and click "Finish".
{% image '20190407/new-profile-name.png' 'Name the new Firefox profile' %}
![Name the new Firefox profile](20190407/new-profile-name.png)
5. Once you are back to the profile manager, select "default", make sure "Use the selected profile..." and "Start Firefox".
{% image '20190407/profile-manager-new.png' 'Firefox Profile Manager with a recently added profile' %}
![Firefox Profile Manager with a recently added profile](20190407/profile-manager-new.png)
6. Launch Firefox with the newly created profile using the same command as above:
......@@ -52,7 +52,7 @@ firefox --no-remote -P 'new profile name'
***Protip***: Create a launcher or keyboard shortcut to run the command.
{% image '20190407/launcher.png' 'Create a new launcher for the Firefox profile' %}
![Create a new launcher for the Firefox profile](20190407/launcher.png)
7. Just launch Firefox as usual for your current profile.
......@@ -62,7 +62,7 @@ firefox --no-remote -P 'new profile name'
2. Browse to the **~/.mozilla/firefox** folder
3. To clone the default profile, simply select the xxxx.default and duplicate it by **Edit: -> Duplicate**, or copy to another folder, rename and move it back. Rename the cloned folder to desired name. In this example, I named it as *profile z*.
{% image '20190407/profile-folder.png' 'List of folders in ~/.mozilla/firefox' %}
![List of folders in ~/.mozilla/firefox](20190407/profile-folder.png)
4. Append the following line to **profiles.ini**, if there is no existing profile (other than the default), use `[Profile1]` instead.
......@@ -73,7 +73,7 @@ IsRelative=1
Path=profile z
{% image '20190407/profiles-ini.png' 'profile.ini in a text editor' %}
![profile.ini in a text editor](20190407/profiles-ini.png)
5. Launch Firefox with the newly created profile using the same command as above (note the case-sensitive):
......@@ -95,4 +95,4 @@ privacy.userContext.longPressBehavior;2
The feature is also available through [an add-on]( The add-on offers the ability to assign a site to a specific container, so that a website will always open in a specified container.
{% image '20190407/open-site-container.png' 'Assign a site to a container' %}
![Assign a site to a container](20190407/open-site-container.png)
......@@ -10,7 +10,7 @@ Caja is a file manager originally forked from Nautilus. It's used in MATE deskto
The side pane of Caja shows many media folders by default. You might not have all the media types or not important enough to bookmark it.
{% image '20181002/caja-side-pane.png' 'Side pane view of Caja file manager' %}
![Side pane view of Caja file manager](20181002/caja-side-pane.png)
*from github [issue](*
You can hide some folder through `~/.config/user-dirs.dirs` or `/home/your-username/.config/user-dirs.dirs` (you need to show hidden file/folder if you're going to browse through Caja).
......@@ -11,13 +11,13 @@ TrueCrypt and KeePassX have been discontinued while Adblock Plus has been [comme
## VeraCrypt
{% image '20190115/veracrypt.png' 'Screenshot of VeraCrypt' %}
![Screenshot of VeraCrypt](20190115/veracrypt.png)
VeraCrypt is a fork of the discontinued [TrueCrypt]( It includes security improvements and fixes over the originalfor example using much higher iterations (327,661-655,331 vs 1,000-2,000) to generate the header keyto make brute force more costly. This improvement along with supporting more ciphers and their combinations, means its storage format is incompatible to the original's. User still has the option to open TrueCrypt volume and (optionally, but recommended) convert it to VeraCrypt format.
## KeePassXC
{% image '20190115/keepassxc.png' 'Screenshot of KeePassXC' %}
![Screenshot of KeePassXC](20190115/keepassxc.png)
KeePassXC is a fork of the discontinued [KeePassX]( KeePassX started out as a Linux port of (previously Windows-only) KeePass. While both eventually become cross-platform, I stick with KeePassX (even on Windows) for being lighter and quicker to launch. The [Mono]( KeePasslike Javamakes it not quite as native as Qt-developed KeePass, thus feels slower on Linux. It last [released]( in October 2016 with no further update since then.
......@@ -25,7 +25,7 @@ Notable [improvements]( of KeePassXC including KD
## uBlock Origin
{% image '20190115/ubo.png' 'Screenshot of uBlock Origin' %}
![Screenshot of uBlock Origin](20190115/ubo.png)
uBlock Origin (uBO) is a popular ad blocker well-known for its low memory and CPU usage (compared to other ad blockers). The [dynamic filtering]( allows granular control over filtering rules. It supports HOSTS syntax for blocking malicious websites. I created a [blocklist]( based on the [URLhaus](
......@@ -38,7 +38,7 @@ Practically, you can use Snyk to patch it, *if* possible like this [hexo-all-min
1. [Sign up]( for a new Snyk account.
2. Snyk only supports [SSO](, no e-mail sign up. You need to have GitHub, Bitbucket, or Google account. It can be a separate account from your current GitHub account. Linking your current GitHub repo to Snyk is *optional*.
3. Once you signed up, go to your account setting, grab the API token and save it in your password manager (or somewhere safe).
{% image '20181001/snyk-api.png' 'Snyk API token' %}
![Snyk API token](20181001/snyk-api.png)
4. Install Snyk,
$ npm install snyk
......@@ -64,7 +64,7 @@ $ echo 'PATH="$PATH:./node_modules/.bin"' >> ~/.profile
Alternatively, you could integrate directly to your remote repo (github/gitlab). This integration allows Snyk to automatically create pull/merge request. Enable this by going to your Snyk account and Integrations tab.
{% image '20181001/snyk-integration.png' 'Available integrations offered by Snyk' %}
![Available integrations offered by Snyk](20181001/snyk-integration.png)
More info: [NodeJS](, [GitHub](, [GitLab](
......@@ -10,19 +10,19 @@ Note: The previews are displayed in dark theme, but hi-res downloads are in ligh
## Parametric and non-parametric tests
{% image '20190209/parametric-non-parametric-preview.png' 'Common parametric and non-parametric tests' %}
![Common parametric and non-parametric tests](20190209/parametric-non-parametric-preview.png)
**Download:** [PDF](!3F81WarB!9aBojWuS6S4_8azMSFdy5ug3UDqCt3UHCKFr77Wpkg0) | [DOCX](!nB9zgCiA!hHHtI-MELou9xVq1dMpkJeE2edXogkP1kEnxE1gr-84)
## Flowchart
{% image '20190209/statistical-test-flowchart-preview.png' 'Choose a statistical test using a flowchart' %}
![Choose a statistical test using a flowchart](20190209/statistical-test-flowchart-preview.png)
**Download:** [PDF](!CV8DAYaD!r9NaOEZ4VfeF-peNQm7jbEP6MqO4mRIBsRiHBd2DgsU) | [PNG](!fc9H2KbS!LDp8FmX2W46d58zjIgItZiYDEkmnwkza6EbBxtDSl2g) | [VSDX](!GM0jyKRQ!CEaKcoNBlYmT3bTmEgdatWAkshteinDeby5_FVYcHu8)
## Table
{% image '20190209/statistical-tests-table-preview.png' 'Statistical tests in a table view' %}
![Statistical tests in a table view](20190209/statistical-tests-table-preview.png)
**Download:** [PDF](!KN0jjaoS!cqr4sXCabLuD7jIs1GDGUuNrZP0okYRck24-V5QpS8U) | [DOCX](!vV1TXaBb!Rq6x3--CRizMLCJFJ4wgADQmo-NPRMNERSIHeWSwW1o)
......@@ -30,6 +30,6 @@ Credit: James D. Leeper, Ph.D. (University of Alabama) [(Source)](https://statra
## Statistics mathematical symbols
{% image '20190209/statistics-mathematical-symbols-preview.png' 'Common mathematical symbols used in statistics' %}
![Common mathematical symbols used in statistics](20190209/statistics-mathematical-symbols-preview.png)
**Download:** [PDF](!Sc8hUISZ!B-j-ULD7CKDltjBYBRiX7_EPRe0P_YiUDmMzFBLlaEY) | [ODT](!LA0XlAwa!FvU91TB43vgj7fLmNLTq_uMHlSGFHjB1EwVYuv8zlBQ)
......@@ -20,6 +20,6 @@
This is what it looks like,
{% image '20181025/lint.png' 'Verify .gitlab-ci.yml online' %}
![Verify .gitlab-ci.yml online](20181025/lint.png)
Simply paste the content of your `.gitlab-ci.yml` and 'Validate'.
......@@ -9,7 +9,7 @@ tags:
When using [Dark Reader]( (DR) add-on with "Filter" or "Filter+" mode in Firefox (FF 67 as of writing), you may encounter this issue where only the lower half of an image is shown.
{% image '20190628/dark-reader-before.png' 'Image is only shown half' %}
![Image is only shown half](20190628/dark-reader-before.png)
To resolve it, add the following CSS rule to the DR's setting via **Dev tools**. Prepend before the site-specific rules.
......@@ -21,13 +21,13 @@ To resolve it, add the following CSS rule to the DR's setting via **Dev tools**.
{% image '20190628/dark-reader-dev-tools.png' 'Dev tools of Dark Reader' %}
![Dev tools of Dark Reader](20190628/dark-reader-dev-tools.png)
{% image '20190628/dev-tools-demo.webp' 'A video of Dev Tools' %}
![A video of Dev Tools](20190628/dev-tools-demo.webp)
After adding the CSS, you should be able to see the whole image. But the fix is not perfect, the image sticks to the top rather than centred.
{% image '20190628/dark-reader-after.png' 'Full image is shown' %}
![Full image is shown](20190628/dark-reader-after.png)
The above CSS is to override the default CSS used by FF to display an image. The default CSS is located at `resource://content-accessible/TopLevelImageDocument.css`, accessible via Style Editor (Shift + F7, don't enable Caret Browsing when prompted). It's used to centre the image. Here is a snippet of "TopLevelImageDocument.css",
......@@ -49,4 +49,4 @@ The `bottom: 0;` rule is the source of the issue, though it's more of a compatib
I got the information from the issue report ([#1142]( It's unlikely that the fix will be in the default DR, so you need to re-apply the workaround every time DR is updated.
Credit: Screenshots and screen recording contain a photo by [Yunming Wang]( on [Unsplash](
\ No newline at end of file
Credit: Screenshots and screen recording contain a photo by [Yunming Wang]( on [Unsplash](
......@@ -9,7 +9,7 @@ tags:
When you have many answer options, the word can break into next line, like this:
{% image '20181031/break-word' 'Part of a word break into next line in LimeSurvey' %}
![Part of a word break into next line in LimeSurvey](20181031/break-word.png)
LimeSurvey does this to have consistent column width size across array question. Personally, I prefer not to have word break than fixed width.
......@@ -17,16 +17,16 @@ Here's how to prevent word break.
1. Go to the main admin page and then Themes.
{% image '20181031/theme-button' 'LimeSurvey theme button in admin panel' %}
![LimeSurvey theme button in admin panel](20181031/theme-button.png)
2. 'Extend' the theme of your choice. Choose a name of the new *extended* theme.
{% image '20181031/theme-list' 'LimeSurvey theme list' %}
![LimeSurvey theme list](20181031/theme-list.png)
3. It will redirect you to 'Theme editor' page.
4. Go to 'custom.css'.
{% image '20181031/custom-css' 'Customise LimeSurvey theme through custom.css' %}
![Customise LimeSurvey theme through custom.css](20181031/custom-css.png)
5. Paste the following css,
......@@ -47,4 +47,4 @@ Here's how to prevent word break.
Once the word break is disabled, array answers should look like this,
{% image '20181031/no-break-word' 'No word break in LimeSurvey' %}
![No word break in LimeSurvey](20181031/no-break-word.png)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment