Simple Haskell Data Pretty-printing

A couple years ago when I was knee-deep in Ruby, there was this really neat module called ‘pp’ that you could use to print out, in prettified format, any data structure.

#!/usr/bin/ruby

require 'pp'

a = {0 => [1, 2, 3, [4, 5], 6], 1 => "hello", 2 => ["foo", "bar", "quux", "toto", "tata"], 3 => "this is a long sentence"}

pp(a)

Would result in something like this (depending on your window width):

{0=>[1, 2, 3, [4, 5], 6],
 1=>"hello",
 2=>["foo", "bar", "quux", "toto", "tata"],
 3=>"this is a long sentence"}

Today I discovered that you can do basically the same thing in Haskell with minimum fuss. All you need is the Text.Show.Pretty module (fellow Archers can grab the haskell-pretty-show package on AUR). The github page for the module is here. Here is how you’d use it:

import IO
import qualified Text.Show.Pretty as Pr

data VeryComplexNestedType = VeryComplexNestedType
    { foo :: Foo
    , bar :: Bar
    , quux :: Quux
    }

someData = VeryComplexNestedType ......

main = putStrLn $ Pr.ppShow someData 

It took me quite a while to figure out that the module I needed was Text.Show.Pretty. All the web searches I did for pretty-printing led me to gigantic/industrial libraries like Text.PrettyPrint.HughesPJ or Language.Haskell.Pretty. Those libraries are there to let you customize your own pretty printing function on some arbitrary data type of your choice. But for super-simple, generic pretty-printing like Ruby’s ‘pp’ module, there’s Text.Show.Pretty. For some reason, it remains relatively unknown (the AUR page shows just 1 vote for it as of this writing).

Spread the word!

UPDATE March 13, 2011: In the comments, Neill pointed out that you can also optionally use the “ppsh” executable, which comes with the Text.Show.Pretty module (/usr/bin/ppsh on Arch Linux). Thus, you don’t have to change all of your existing code that uses “show”; all you have to do is pipe the output into ppsh, like “./myprogram | ppsh”. This method is arguably superior because now you don’t have to include Text.Show.Pretty as a dependency in your project.

Update October 30, 2012: To install Text.Show.Pretty (aka pretty-show on Hackage) on Arch Linux, just use cblrepo. The all AUR Haskell packages are pretty much dead at this point.

Advertisements

Zsh and Ruby: Toward a universal directory/file opener

This post has been deprecated. Please read this post instead.

I’ve been using Linux for a while now (almost 2 years?), and have learned quite a bit about it. However, ever since I switched to Xmonad as my window manager, I’ve always been tied to the “urxvt + zsh” GUI. Don’t get me wrong — I really enjoy this setup (a plain old terminal has a beauty all of its own in how things get done), but it could be even better.

Lately, I’ve noticed my ~/.zshrc file grow larger and larger, with the addition of new aliases to open up common programs, like “m” for mplayer (audio, movies) and “e” for evince (PDF’s). To get rid of this clutter, and also to automate things, I decided to make a new, simple alias to handle pretty much everything I throw at it. The new functionality lets Zsh, with the help of Ruby, open up just about any file I throw at it, while also integrating the common “cd” command for directories — all from the command line.

The required files/code are as follows: (1) a custom zsh function (autoloaded into your zsh session) and (2) a custom Ruby script. I’ve only tested this on Ruby 1.9.1p243 (2009-07-16 revision 24175) [x86_64-linux].

For the custom zsh function, here is how I autoload it from ~/.zshrc:

fpath=(~/.zsh/func $fpath) # add ~/.zsh/func to $fpath
autoload -U ~/.zsh/func/*(:t) # load all functions in ~/.zsh/func

The function itself is as follows:


 1 # Author: Shinobu (https://zuttobenkyou.wordpress.com)
 2 # Date: December 2009
 3 # License: PUBLIC DOMAIN
 4 # Program Name: univ_open()
 5 # Description: zsh function to open up either directories or files
 6 univ_open() {
 7     ls_pretty="ls -Ahs --color=auto"
 8     if [[ ! -e $@ ]]; then
 9         # go to the parent directory if given path does not exist
10         /home/shinobu/syscfg/shellscripts/sys/univ_handler.rb $@ "parent" | read parent
11         cd $parent && ${=ls_pretty}
12     elif [[ -d $@ ]]; then
13         cd $@ && ${=ls_pretty}
14     else
15         # if it does exist, but is not a directory, open it up with the
16         # universal readerscript, to execute an appropriate program for the
17         # extension
18         /home/shinobu/syscfg/shellscripts/sys/univ_handler.rb $@ "extension" | read outputcmd
19         # since zsh does not split words by default, we need to manually do
20         # this by invoking outputcmd with the ${=VAR} syntax; this is because
21         # univ_handler will sometimes give a multi-word command where we use
22         # one or more commandline options, such as "mplayer -loop 0" or
23         # "soffice -writer" -- to prevent zsh from interpreting the entire
24         # string as the name of a command, we have to split it up into an array
25         ${=outputcmd} $@
26     fi
27 }

The file that contains this function is also called “univ_open”, which resides in ~/.zsh/func/. Anyway, this function is quite simple — it checks to see if the given argument does not exist (line 8), does exist and is a directory (line 12), or does exist and is a file (line 14).

In the “if” statement at line 8, it calls our custom Ruby script, univ_handler.rb, with an argument called “parent”. For lines 12-13, we don’t need to intelligently handle anything since the given argument is a valid directory path, so we just “cd” into it. Lastly, if the argument is a valid file (line 14), we call univ_handler.rb with the “extension” argument to determine which command to use to open up that file.

The univ_handler.rb file looks like this:


 1 #!/usr/bin/ruby
 2 # Author: Shinobu (https://zuttobenkyou.wordpress.com)
 3 # Date: December 2009
 4 # License: PUBLIC DOMAIN
 5 # Program Name: univ_handler.rb
 6 # Description: with the help of smart input from zsh, this script helps zsh
 7 # open up directories and files intelligently
 8
 9 class Ext
10     @doc = %w{doc odf odt rtf}
11     @web = %w{htm html}
12     @pdf = %w{pdf ps}
13     @img = %w{bmp gif jpg jpeg png svg tiff}
14     @img2 = %w{psd xcf}
15     @audio = %w{flac mp3 wma}
16     @midi = %w{mid midi}
17     @movie = %w{avi flv ogg mkv mov mp4 mpg mpeg wmv}
18
19     class<<self; attr_reader :doc end
20     class<<self; attr_reader :web end
21     class<<self; attr_reader :pdf end
22     class<<self; attr_reader :img end
23     class<<self; attr_reader :img2 end
24     class<<self; attr_reader :audio end
25     class<<self; attr_reader :midi  end
26     class<<self; attr_reader :movie end
27 end
28
29 file = ARGV.shift
30 arg = ARGV.shift
31
32 # zsh will read whatever we ultimately "print" to STDOUT!
33 if file.nil? # if the user does not specify an argument
34     print ""
35 else # figure out file extension, or if directory, the parent directory
36     if arg == "extension"
37         case file.split(".").last.downcase
38         when *Ext.doc
39             print "soffice -writer"
40         when *Ext.web
41             print "firefox"
42         when *Ext.pdf
43             print "evince"
44         # image files -- typical simple files for plain viewing
45         when *Ext.img
46             print "eog"
47         # image files -- ones meant to be edited (strange looking ones and also
48         # gimp's native format)
49         when *Ext.img2
50             print "gimp"
51         # audio files
52         when *Ext.audio
53             print "mplayer -loop 0"
54         # midi files
55         when *Ext.midi
56             print "timidity"
57         # movies
58         when *Ext.movie
59             print "mplayer -loop 0"
60         else
61             # use vim to access files by default, including those without an
62             # extension
63             print "vim"
64         end
65     elsif arg == "parent" # find the closest valid parent directory
66         if file.scan("/").empty? # if there is no "/" in the argument
67             print "." # let's keep the user in the same directory
68         else # if we have a filename (at least the user thinks so), but it is
69              # not a valid file path = file.split("/")
70             path.pop
71             # return 1 directory higher than this one -- we assume that the
72             # reader used tab completions enough to avoid having more than 1
73             # bad directory/file level (that only the text following the last
74             # "/" is invalid)
75             print path.join("/")
76         end
77     end
78 end

You don’t even need to know Ruby to see what’s going on. The important thing is what’s inside the curly braces — we simply group common extensions together based on the file they usually represent. We don’t bother with uppercased combinations, since we use Ruby’s String class’s “downcase” method on the original user-given argument before handling it. Since I love vim, I use it as the “catch-all” to open up any other kind of file (such as files that don’t have extensions).

Now, the most important part — the one alias to rule them all (in your ~/.zshrc):

alias d='univ_open' # alias to use univ_open()

And… that’s it! All you have to do is now do d [file, directory, path, symlink to either a directory or path] to open it up intelligently! I personally use “d” since historically I’ve used it to cd into a directory (and used “k” to go back up); I also find using my middle finger much easier to press keys than my index finger. Probably the best benefit of this setup is that you can do “d TAB TAB …” to go deep into directories, and then just press ENTER when you find the file you want to edit — no more cd-ing deep into a subdirectory first, and then doing “ls” on it to see what’s inside, and deciding which command to use to open up that file. Now it’s just “d” and away you go.

It took me about half a day to get everything working, with help from googling, of course. I hope you can make use of it as it is, or even better, to customize it to your own needs. There’s enough “foundation” code in there with enough complexity to let anyone customize it a great deal and add more extensions to it.

As an added bonus, notice how the code here does not mention symlinks at all — and yet they are handled properly (don’t you love symlinks?)).

UPDATE December 6, 2009: Apparently, there is a similar command line script to open anything called “gnome-open”: http://embraceubuntu.com/2006/12/16/gnome-open-open-anything-from-the-command-line/. You can open up URLs in addition to directories and files. I don’t really see the advantages of opening up a URL from the command line, though — I’m already on Xmonad and going to my supremely powerful Firefox + Vimperator setup is at most 2 or 3 keystrokes away. Still, it looks interesting.

UPDATE December 31, 2009: This post has been deprecated. Please read this post instead.

Updated Autolily Script

UPDATE July 24, 2010: This post is now totally obsolete. See this post instead.

This is an update to my previous post. Now, Autolily’s single argument is no longer required to be the bare *.ly filename itself, but instead may optionally include a path! See the embedded comments in the source code below. Enjoy!


 1 #!/usr/bin/ruby
 2 #===============================================================================================================#
 3 # Program name: Autolily                                                                                        #
 4 # LICENSE: PUBLIC DOMAIN                                                                                        #
 5 # This program takes 1 argument, the name of a lilypond file (*.ly), and watches it for changes every 1 second. #
 6 # If there has been any change, it simply calls lilypond on it to create a new .pdf/.ps/.midi of it.            #
 7 #                                                                                                               #
 8 # Place this script somewhere, like in ~/scripts                                                                #
 9 # Then, open up a terminal and call it like so: ~/scripts/autolily.rb [file]                                    #
10 # [file] must be a LilyPond file (.ly), but it can be located anywhere -- i.e., you may include paths in your   #
11 # file, such as "~/sheet-music/classical/bach2.ly" or "../../bach3.ly".                                         #
12 #                                                                                                               #
13 # You might want to do a "sudo ln -s" of autolily.rb to one of your system's $PATH directories (e.g., /usr/bin) #
14 # to avoid typing out the path to autolily.rb every time you use it. Continuing the example from above,         #
15 # something like "sudo ln -s ~/scripts/autolily.rb /usr/bin/autolily" should do (make sure that                 #
16 # /usr/bin/autolily does not exist already, as the above comman will overwrite that file if it exists).         #
17 #                                                                                                               #
18 # Now you can just do:                                                                                          #
19 #                                                                                                               #
20 #     autolily [file]                                                                                           #
21 #                                                                                                               #
22 # from anywhere in your system!                                                                                 #
23 #                                                                                                               #
24 # To exit, press CTRL-C.                                                                                        #
25 #===============================================================================================================#
26
27 if ARGV.size > 0
28     file_data_orig = ""
29     file = ARGV.shift
30     pathsize = file.split("/").size
31     ls_call = "ls --full-time"
32
33     # make sure that the "file" variable is a filename, and not mixed with its path
34     if pathsize > 1
35         path_to_file = file.split("/").first(pathsize - 1).join("/")
36         file = file.split("/").last
37         ls_call << " #{path_to_file}" # modify our `ls` command to reflect relative location of file
38     end
39
40     `#{ls_call}`.split("\n").each do |line|
41         if line.split(/\s/).last == file
42             file_data_orig = line
43             break
44         end
45     end
46     file_data_new = ""
47
48     # enter infinite loop -- keep compiling the given lilypond file if it has changed in the past 1 second
49     while true
50         # detect the file size and also timestamp
51         lsarr = `#{ls_call}`.split("\n")
52         lsarr.shift # get rid of the first line, since that is the size of all the files in the directory
53
54         # find our file from ls's output!
55         lsarr.each do |line|
56             if line.split(/\s/).last == file
57                 file_data_new = line
58                 break
59             end
60         end
61
62         # if there is any change detected, run lilypond on it
63         if file_data_orig != file_data_new
64             puts "\n\e[1;4;38;5;226mAutolily: Change detected in given file; invoking lilypond...\e[0m\n"
65             if pathsize > 1
66             `lilypond "#{path_to_file}/#{file}"`
67             else
68             `lilypond "#{file}"`
69             end
70             file_data_orig = file_data_new
71         end
72         sleep 1
73     end
74 else
75     puts "No .ly file specified.\n"
76 end

Auto-update/make/compile script for Lilypond: Autolily

UPDATE July 24, 2010: This post is now totally obsolete. See this post instead.

I’ve so far used Lilypond twice to make nice, clean music of some classical pieces. If you don’t know what Lilypond is already, it is basically LaTeX, but for music. Since the music notation style is almost always the same across many different genres, LaTeX’s “what you see is what you mean” philosophy applies particularly well to your sheetmusic-making needs.

The basic way you work is — create an .ly file pursuant to the lilypond format, then save it, then call “lilypond [filename]” on it from the terminal, which will generate a .pdf, .ps, and .midi output all for you (that is, if you have a “\layout {}” and also a “\midi {}” in you “\score {}”). If you have dual monitors, then you can open up the .pdf file with evince, and then evince will automatically update to the latest .pdf version by itself (no need to close and re-open the same generated .pdf file).

This workflow is nice, but it could be better. For one, it takes time to switch windows and invoke “lilypond [filename]” every time you want to see a small change done. For me, I like to make sure at least every 1/2 measure or so that what I put in is correct. Thus, switching back and forth between all these windows every 30 seconds makes the whole process very time consuming.

So I wrote a small ruby script (I call it “Autolily”) to automatically invoke lilypond for me:


 1 #!/usr/bin/ruby
 2 #===============================================================================================================#
 3 # Program name: Autolily                                                                                        #
 4 # LICENSE: PUBLIC DOMAIN                                                                                        #
 5 # This program takes 1 argument, the name of a lilypond file (*.ly), and watches it for changes every 1 second. #
 6 # If there has been any change, it simply calls lilypond on it to create a new .pdf/.ps/.midi of it.            #
 7 #                                                                                                               #
 8 # Place this script somewhere, like in ~/scripts                                                                #
 9 # Then, open up a terminal and call it like so: ~/scripts/autolily.rb [lilypond file]                           #
10 # Be sure to call it from the directory where the lilypond file is located -- i.e., don't do [path/to/file]     #
11 #                                                                                                               #
12 # To exit, type CTRL-C.                                                                                         #
13 #===============================================================================================================#
14 
15 if ARGV.size > 0
16     file = ARGV.shift
17     file_data_orig = ""
18     `ls --full-time`.split("\n").each do |line|
19         if line.split(/\s/).last == file
20             file_data_orig = line
21             break
22         end
23     end
24     file_data_new = ""
25 
26     # enter infinite loop -- keep compiling the given lilypond file if it has changed in the past 1 second
27     while true
28         # detect the file size and also timestamp
29         lsarr = `ls --full-time`.split("\n")
30         lsarr.shift # get rid of the first line, since that is the size of all the files in the directory
31 
32         # find our file from ls's output!
33         lsarr.each do |line|
34             if line.split(/\s/).last == file
35                 file_data_new = line
36                 break
37             end
38         end
39 
40         # if there is any change detected, run lilypond on it
41         if file_data_orig != file_data_new
42             puts "\n\e[1;4;38;5;226mAutolily: Change detected in given file; invoking lilypond...\e[0m\n"
43             `lilypond "#{file}"`
44             file_data_orig = file_data_new
45         end
46         sleep 1
47     end
48 else
49     puts "No .ly file specified.\n"
50 end

This very simple script is an infinite loop which takes snapshots of the output of the “ls” command every second, and monitors any changes. Only the output line for the given lilypond file is monitored. Whenever this single line changes (any time you save your file, thus changing the modification timestamp of the file), the “lilypond [filename]” command is invoked to generate the .pdf, .ps, .midi outputs.

Now, every single time you save your .ly file, Autolily will run lilypond for you in the background, letting you know of any errors or such (and if you have evince open on the generated .pdf file, evince will update what your sheet music looks like as well).

Memory usage of this script is a bit embarrassing — I get around 4.5 MB — but hey, that’s Ruby’s fault.

Enjoy!

UPDATE November 12, 2009: Added quotes around _file_ so that a filename with spaces works correctly. (Though, if you’re a Linux guy like me, you probably don’t name your files with spaces in them.)

Rails and SASS

I don’t think people quite understand the beauty and power of SASS (metaprogramming/abstraction layer on top of CSS).

Here is a small portion of a CSS file that is generated by SASS that I use on my personal (LAN) website. As WordPress doesn’t yet feature pretty code snippet tags, I have to use the “Preformatted” style for code — but the code here is too long for this design layout, you must  scroll allllll the way to the right to see all the code (alternatively, I suggest you copy all the text on this page and paste it into your text editor to get a real world feel on the sheer length of the code). I can’t help but marvel at the seemingly insane complexity of this VALID, working CSS code:

#article_body_unique .b_c_padding_bottom table.bullet, #article_body_unique .ph1b table.bullet, #article_body_unique .ph2b table.bullet, #article_body_unique .ph3b table.bullet, #article_body_unique .ph4b table.bullet, #article_body_unique .ph5b table.bullet, #article_body_unique .ph6b table.bullet, #article_body_unique .ph7b table.bullet, #article_body_unique .ph8b table.bullet, #article_body_unique .ph9b table.bullet, #article_body_unique .ph1c table.bullet, #article_body_unique .ph2c table.bullet, #article_body_unique .ph3c table.bullet, #article_body_unique .ph4c table.bullet, #article_body_unique .ph5c table.bullet, #article_body_unique .ph6c table.bullet, #article_body_unique .ph7c table.bullet, #article_body_unique .ph8c table.bullet, #article_body_unique .ph9c table.bullet, #article_body_unique .ph1d table.bullet, #article_body_unique .ph2d table.bullet, #article_body_unique .ph3d table.bullet, #article_body_unique .ph4d table.bullet, #article_body_unique .ph5d table.bullet, #article_body_unique .ph6d table.bullet, #article_body_unique .ph7d table.bullet, #article_body_unique .ph8d table.bullet, #article_body_unique .ph9d table.bullet, #article_body_unique .ph1e table.bullet, #article_body_unique .ph2e table.bullet, #article_body_unique .ph3e table.bullet, #article_body_unique .ph4e table.bullet, #article_body_unique .ph5e table.bullet, #article_body_unique .ph6e table.bullet, #article_body_unique .ph7e table.bullet, #article_body_unique .ph8e table.bullet, #article_body_unique .ph9e table.bullet, #article_body_unique .ph1f table.bullet, #article_body_unique .ph2f table.bullet, #article_body_unique .ph3f table.bullet, #article_body_unique .ph4f table.bullet, #article_body_unique .ph5f table.bullet, #article_body_unique .ph6f table.bullet, #article_body_unique .ph7f table.bullet, #article_body_unique .ph8f table.bullet, #article_body_unique .ph9f table.bullet {
  padding-left: 0.9em; }
#article_body_unique .b_c_padding_bottom table.bullet2, #article_body_unique .ph1b table.bullet2, #article_body_unique .ph2b table.bullet2, #article_body_unique .ph3b table.bullet2, #article_body_unique .ph4b table.bullet2, #article_body_unique .ph5b table.bullet2, #article_body_unique .ph6b table.bullet2, #article_body_unique .ph7b table.bullet2, #article_body_unique .ph8b table.bullet2, #article_body_unique .ph9b table.bullet2, #article_body_unique .ph1c table.bullet2, #article_body_unique .ph2c table.bullet2, #article_body_unique .ph3c table.bullet2, #article_body_unique .ph4c table.bullet2, #article_body_unique .ph5c table.bullet2, #article_body_unique .ph6c table.bullet2, #article_body_unique .ph7c table.bullet2, #article_body_unique .ph8c table.bullet2, #article_body_unique .ph9c table.bullet2, #article_body_unique .ph1d table.bullet2, #article_body_unique .ph2d table.bullet2, #article_body_unique .ph3d table.bullet2, #article_body_unique .ph4d table.bullet2, #article_body_unique .ph5d table.bullet2, #article_body_unique .ph6d table.bullet2, #article_body_unique .ph7d table.bullet2, #article_body_unique .ph8d table.bullet2, #article_body_unique .ph9d table.bullet2, #article_body_unique .ph1e table.bullet2, #article_body_unique .ph2e table.bullet2, #article_body_unique .ph3e table.bullet2, #article_body_unique .ph4e table.bullet2, #article_body_unique .ph5e table.bullet2, #article_body_unique .ph6e table.bullet2, #article_body_unique .ph7e table.bullet2, #article_body_unique .ph8e table.bullet2, #article_body_unique .ph9e table.bullet2, #article_body_unique .ph1f table.bullet2, #article_body_unique .ph2f table.bullet2, #article_body_unique .ph3f table.bullet2, #article_body_unique .ph4f table.bullet2, #article_body_unique .ph5f table.bullet2, #article_body_unique .ph6f table.bullet2, #article_body_unique .ph7f table.bullet2, #article_body_unique .ph8f table.bullet2, #article_body_unique .ph9f table.bullet2 {
  padding-left: 1.8em; }
#article_body_unique .b_c_padding_bottom table.bullet3, #article_body_unique .ph1b table.bullet3, #article_body_unique .ph2b table.bullet3, #article_body_unique .ph3b table.bullet3, #article_body_unique .ph4b table.bullet3, #article_body_unique .ph5b table.bullet3, #article_body_unique .ph6b table.bullet3, #article_body_unique .ph7b table.bullet3, #article_body_unique .ph8b table.bullet3, #article_body_unique .ph9b table.bullet3, #article_body_unique .ph1c table.bullet3, #article_body_unique .ph2c table.bullet3, #article_body_unique .ph3c table.bullet3, #article_body_unique .ph4c table.bullet3, #article_body_unique .ph5c table.bullet3, #article_body_unique .ph6c table.bullet3, #article_body_unique .ph7c table.bullet3, #article_body_unique .ph8c table.bullet3, #article_body_unique .ph9c table.bullet3, #article_body_unique .ph1d table.bullet3, #article_body_unique .ph2d table.bullet3, #article_body_unique .ph3d table.bullet3, #article_body_unique .ph4d table.bullet3, #article_body_unique .ph5d table.bullet3, #article_body_unique .ph6d table.bullet3, #article_body_unique .ph7d table.bullet3, #article_body_unique .ph8d table.bullet3, #article_body_unique .ph9d table.bullet3, #article_body_unique .ph1e table.bullet3, #article_body_unique .ph2e table.bullet3, #article_body_unique .ph3e table.bullet3, #article_body_unique .ph4e table.bullet3, #article_body_unique .ph5e table.bullet3, #article_body_unique .ph6e table.bullet3, #article_body_unique .ph7e table.bullet3, #article_body_unique .ph8e table.bullet3, #article_body_unique .ph9e table.bullet3, #article_body_unique .ph1f table.bullet3, #article_body_unique .ph2f table.bullet3, #article_body_unique .ph3f table.bullet3, #article_body_unique .ph4f table.bullet3, #article_body_unique .ph5f table.bullet3, #article_body_unique .ph6f table.bullet3, #article_body_unique .ph7f table.bullet3, #article_body_unique .ph8f table.bullet3, #article_body_unique .ph9f table.bullet3 {
  padding-left: 2.7em; }
#article_body_unique .b_c_padding_bottom table.bullet4, #article_body_unique .ph1b table.bullet4, #article_body_unique .ph2b table.bullet4, #article_body_unique .ph3b table.bullet4, #article_body_unique .ph4b table.bullet4, #article_body_unique .ph5b table.bullet4, #article_body_unique .ph6b table.bullet4, #article_body_unique .ph7b table.bullet4, #article_body_unique .ph8b table.bullet4, #article_body_unique .ph9b table.bullet4, #article_body_unique .ph1c table.bullet4, #article_body_unique .ph2c table.bullet4, #article_body_unique .ph3c table.bullet4, #article_body_unique .ph4c table.bullet4, #article_body_unique .ph5c table.bullet4, #article_body_unique .ph6c table.bullet4, #article_body_unique .ph7c table.bullet4, #article_body_unique .ph8c table.bullet4, #article_body_unique .ph9c table.bullet4, #article_body_unique .ph1d table.bullet4, #article_body_unique .ph2d table.bullet4, #article_body_unique .ph3d table.bullet4, #article_body_unique .ph4d table.bullet4, #article_body_unique .ph5d table.bullet4, #article_body_unique .ph6d table.bullet4, #article_body_unique .ph7d table.bullet4, #article_body_unique .ph8d table.bullet4, #article_body_unique .ph9d table.bullet4, #article_body_unique .ph1e table.bullet4, #article_body_unique .ph2e table.bullet4, #article_body_unique .ph3e table.bullet4, #article_body_unique .ph4e table.bullet4, #article_body_unique .ph5e table.bullet4, #article_body_unique .ph6e table.bullet4, #article_body_unique .ph7e table.bullet4, #article_body_unique .ph8e table.bullet4, #article_body_unique .ph9e table.bullet4, #article_body_unique .ph1f table.bullet4, #article_body_unique .ph2f table.bullet4, #article_body_unique .ph3f table.bullet4, #article_body_unique .ph4f table.bullet4, #article_body_unique .ph5f table.bullet4, #article_body_unique .ph6f table.bullet4, #article_body_unique .ph7f table.bullet4, #article_body_unique .ph8f table.bullet4, #article_body_unique .ph9f table.bullet4 {
  padding-left: 3.6em; }
#article_body_unique .b_c_padding_bottom .divbox .divbox_note_text p, #article_body_unique .b_c_padding_bottom .divbox .divbox_example_text p, #article_body_unique .b_c_padding_bottom .divbox .divbox_warning_text p, #article_body_unique .ph1b .divbox .divbox_note_text p, #article_body_unique .ph1b .divbox .divbox_example_text p, #article_body_unique .ph1b .divbox .divbox_warning_text p, #article_body_unique .ph2b .divbox .divbox_note_text p, #article_body_unique .ph2b .divbox .divbox_example_text p, #article_body_unique .ph2b .divbox .divbox_warning_text p, #article_body_unique .ph3b .divbox .divbox_note_text p, #article_body_unique .ph3b .divbox .divbox_example_text p, #article_body_unique .ph3b .divbox .divbox_warning_text p, #article_body_unique .ph4b .divbox .divbox_note_text p, #article_body_unique .ph4b .divbox .divbox_example_text p, #article_body_unique .ph4b .divbox .divbox_warning_text p, #article_body_unique .ph5b .divbox .divbox_note_text p, #article_body_unique .ph5b .divbox .divbox_example_text p, #article_body_unique .ph5b .divbox .divbox_warning_text p, #article_body_unique .ph6b .divbox .divbox_note_text p, #article_body_unique .ph6b .divbox .divbox_example_text p, #article_body_unique .ph6b .divbox .divbox_warning_text p, #article_body_unique .ph7b .divbox .divbox_note_text p, #article_body_unique .ph7b .divbox .divbox_example_text p, #article_body_unique .ph7b .divbox .divbox_warning_text p, #article_body_unique .ph8b .divbox .divbox_note_text p, #article_body_unique .ph8b .divbox .divbox_example_text p, #article_body_unique .ph8b .divbox .divbox_warning_text p, #article_body_unique .ph9b .divbox .divbox_note_text p, #article_body_unique .ph9b .divbox .divbox_example_text p, #article_body_unique .ph9b .divbox .divbox_warning_text p, #article_body_unique .ph1c .divbox .divbox_note_text p, #article_body_unique .ph1c .divbox .divbox_example_text p, #article_body_unique .ph1c .divbox .divbox_warning_text p, #article_body_unique .ph2c .divbox .divbox_note_text p, #article_body_unique .ph2c .divbox .divbox_example_text p, #article_body_unique .ph2c .divbox .divbox_warning_text p, #article_body_unique .ph3c .divbox .divbox_note_text p, #article_body_unique .ph3c .divbox .divbox_example_text p, #article_body_unique .ph3c .divbox .divbox_warning_text p, #article_body_unique .ph4c .divbox .divbox_note_text p, #article_body_unique .ph4c .divbox .divbox_example_text p, #article_body_unique .ph4c .divbox .divbox_warning_text p, #article_body_unique .ph5c .divbox .divbox_note_text p, #article_body_unique .ph5c .divbox .divbox_example_text p, #article_body_unique .ph5c .divbox .divbox_warning_text p, #article_body_unique .ph6c .divbox .divbox_note_text p, #article_body_unique .ph6c .divbox .divbox_example_text p, #article_body_unique .ph6c .divbox .divbox_warning_text p, #article_body_unique .ph7c .divbox .divbox_note_text p, #article_body_unique .ph7c .divbox .divbox_example_text p, #article_body_unique .ph7c .divbox .divbox_warning_text p, #article_body_unique .ph8c .divbox .divbox_note_text p, #article_body_unique .ph8c .divbox .divbox_example_text p, #article_body_unique .ph8c .divbox .divbox_warning_text p, #article_body_unique .ph9c .divbox .divbox_note_text p, #article_body_unique .ph9c .divbox .divbox_example_text p, #article_body_unique .ph9c .divbox .divbox_warning_text p, #article_body_unique .ph1d .divbox .divbox_note_text p, #article_body_unique .ph1d .divbox .divbox_example_text p, #article_body_unique .ph1d .divbox .divbox_warning_text p, #article_body_unique .ph2d .divbox .divbox_note_text p, #article_body_unique .ph2d .divbox .divbox_example_text p, #article_body_unique .ph2d .divbox .divbox_warning_text p, #article_body_unique .ph3d .divbox .divbox_note_text p, #article_body_unique .ph3d .divbox .divbox_example_text p, #article_body_unique .ph3d .divbox .divbox_warning_text p, #article_body_unique .ph4d .divbox .divbox_note_text p, #article_body_unique .ph4d .divbox .divbox_example_text p, #article_body_unique .ph4d .divbox .divbox_warning_text p, #article_body_unique .ph5d .divbox .divbox_note_text p, #article_body_unique .ph5d .divbox .divbox_example_text p, #article_body_unique .ph5d .divbox .divbox_warning_text p, #article_body_unique .ph6d .divbox .divbox_note_text p, #article_body_unique .ph6d .divbox .divbox_example_text p, #article_body_unique .ph6d .divbox .divbox_warning_text p, #article_body_unique .ph7d .divbox .divbox_note_text p, #article_body_unique .ph7d .divbox .divbox_example_text p, #article_body_unique .ph7d .divbox .divbox_warning_text p, #article_body_unique .ph8d .divbox .divbox_note_text p, #article_body_unique .ph8d .divbox .divbox_example_text p, #article_body_unique .ph8d .divbox .divbox_warning_text p, #article_body_unique .ph9d .divbox .divbox_note_text p, #article_body_unique .ph9d .divbox .divbox_example_text p, #article_body_unique .ph9d .divbox .divbox_warning_text p, #article_body_unique .ph1e .divbox .divbox_note_text p, #article_body_unique .ph1e .divbox .divbox_example_text p, #article_body_unique .ph1e .divbox .divbox_warning_text p, #article_body_unique .ph2e .divbox .divbox_note_text p, #article_body_unique .ph2e .divbox .divbox_example_text p, #article_body_unique .ph2e .divbox .divbox_warning_text p, #article_body_unique .ph3e .divbox .divbox_note_text p, #article_body_unique .ph3e .divbox .divbox_example_text p, #article_body_unique .ph3e .divbox .divbox_warning_text p, #article_body_unique .ph4e .divbox .divbox_note_text p, #article_body_unique .ph4e .divbox .divbox_example_text p, #article_body_unique .ph4e .divbox .divbox_warning_text p, #article_body_unique .ph5e .divbox .divbox_note_text p, #article_body_unique .ph5e .divbox .divbox_example_text p, #article_body_unique .ph5e .divbox .divbox_warning_text p, #article_body_unique .ph6e .divbox .divbox_note_text p, #article_body_unique .ph6e .divbox .divbox_example_text p, #article_body_unique .ph6e .divbox .divbox_warning_text p, #article_body_unique .ph7e .divbox .divbox_note_text p, #article_body_unique .ph7e .divbox .divbox_example_text p, #article_body_unique .ph7e .divbox .divbox_warning_text p, #article_body_unique .ph8e .divbox .divbox_note_text p, #article_body_unique .ph8e .divbox .divbox_example_text p, #article_body_unique .ph8e .divbox .divbox_warning_text p, #article_body_unique .ph9e .divbox .divbox_note_text p, #article_body_unique .ph9e .divbox .divbox_example_text p, #article_body_unique .ph9e .divbox .divbox_warning_text p, #article_body_unique .ph1f .divbox .divbox_note_text p, #article_body_unique .ph1f .divbox .divbox_example_text p, #article_body_unique .ph1f .divbox .divbox_warning_text p, #article_body_unique .ph2f .divbox .divbox_note_text p, #article_body_unique .ph2f .divbox .divbox_example_text p, #article_body_unique .ph2f .divbox .divbox_warning_text p, #article_body_unique .ph3f .divbox .divbox_note_text p, #article_body_unique .ph3f .divbox .divbox_example_text p, #article_body_unique .ph3f .divbox .divbox_warning_text p, #article_body_unique .ph4f .divbox .divbox_note_text p, #article_body_unique .ph4f .divbox .divbox_example_text p, #article_body_unique .ph4f .divbox .divbox_warning_text p, #article_body_unique .ph5f .divbox .divbox_note_text p, #article_body_unique .ph5f .divbox .divbox_example_text p, #article_body_unique .ph5f .divbox .divbox_warning_text p, #article_body_unique .ph6f .divbox .divbox_note_text p, #article_body_unique .ph6f .divbox .divbox_example_text p, #article_body_unique .ph6f .divbox .divbox_warning_text p, #article_body_unique .ph7f .divbox .divbox_note_text p, #article_body_unique .ph7f .divbox .divbox_example_text p, #article_body_unique .ph7f .divbox .divbox_warning_text p, #article_body_unique .ph8f .divbox .divbox_note_text p, #article_body_unique .ph8f .divbox .divbox_example_text p, #article_body_unique .ph8f .divbox .divbox_warning_text p, #article_body_unique .ph9f .divbox .divbox_note_text p, #article_body_unique .ph9f .divbox .divbox_example_text p, #article_body_unique .ph9f .divbox .divbox_warning_text p {
  padding-left: 5px; }
#article_body_unique .b_c_padding_bottom .divbox .divbox_note_text table.bullet, #article_body_unique .b_c_padding_bottom .divbox .divbox_example_text table.bullet, #article_body_unique .b_c_padding_bottom .divbox .divbox_warning_text table.bullet, #article_body_unique .ph1b .divbox .divbox_note_text table.bullet, #article_body_unique .ph1b .divbox .divbox_example_text table.bullet, #article_body_unique .ph1b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph2b .divbox .divbox_note_text table.bullet, #article_body_unique .ph2b .divbox .divbox_example_text table.bullet, #article_body_unique .ph2b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph3b .divbox .divbox_note_text table.bullet, #article_body_unique .ph3b .divbox .divbox_example_text table.bullet, #article_body_unique .ph3b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph4b .divbox .divbox_note_text table.bullet, #article_body_unique .ph4b .divbox .divbox_example_text table.bullet, #article_body_unique .ph4b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph5b .divbox .divbox_note_text table.bullet, #article_body_unique .ph5b .divbox .divbox_example_text table.bullet, #article_body_unique .ph5b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph6b .divbox .divbox_note_text table.bullet, #article_body_unique .ph6b .divbox .divbox_example_text table.bullet, #article_body_unique .ph6b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph7b .divbox .divbox_note_text table.bullet, #article_body_unique .ph7b .divbox .divbox_example_text table.bullet, #article_body_unique .ph7b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph8b .divbox .divbox_note_text table.bullet, #article_body_unique .ph8b .divbox .divbox_example_text table.bullet, #article_body_unique .ph8b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph9b .divbox .divbox_note_text table.bullet, #article_body_unique .ph9b .divbox .divbox_example_text table.bullet, #article_body_unique .ph9b .divbox .divbox_warning_text table.bullet, #article_body_unique .ph1c .divbox .divbox_note_text table.bullet, #article_body_unique .ph1c .divbox .divbox_example_text table.bullet, #article_body_unique .ph1c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph2c .divbox .divbox_note_text table.bullet, #article_body_unique .ph2c .divbox .divbox_example_text table.bullet, #article_body_unique .ph2c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph3c .divbox .divbox_note_text table.bullet, #article_body_unique .ph3c .divbox .divbox_example_text table.bullet, #article_body_unique .ph3c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph4c .divbox .divbox_note_text table.bullet, #article_body_unique .ph4c .divbox .divbox_example_text table.bullet, #article_body_unique .ph4c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph5c .divbox .divbox_note_text table.bullet, #article_body_unique .ph5c .divbox .divbox_example_text table.bullet, #article_body_unique .ph5c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph6c .divbox .divbox_note_text table.bullet, #article_body_unique .ph6c .divbox .divbox_example_text table.bullet, #article_body_unique .ph6c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph7c .divbox .divbox_note_text table.bullet, #article_body_unique .ph7c .divbox .divbox_example_text table.bullet, #article_body_unique .ph7c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph8c .divbox .divbox_note_text table.bullet, #article_body_unique .ph8c .divbox .divbox_example_text table.bullet, #article_body_unique .ph8c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph9c .divbox .divbox_note_text table.bullet, #article_body_unique .ph9c .divbox .divbox_example_text table.bullet, #article_body_unique .ph9c .divbox .divbox_warning_text table.bullet, #article_body_unique .ph1d .divbox .divbox_note_text table.bullet, #article_body_unique .ph1d .divbox .divbox_example_text table.bullet, #article_body_unique .ph1d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph2d .divbox .divbox_note_text table.bullet, #article_body_unique .ph2d .divbox .divbox_example_text table.bullet, #article_body_unique .ph2d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph3d .divbox .divbox_note_text table.bullet, #article_body_unique .ph3d .divbox .divbox_example_text table.bullet, #article_body_unique .ph3d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph4d .divbox .divbox_note_text table.bullet, #article_body_unique .ph4d .divbox .divbox_example_text table.bullet, #article_body_unique .ph4d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph5d .divbox .divbox_note_text table.bullet, #article_body_unique .ph5d .divbox .divbox_example_text table.bullet, #article_body_unique .ph5d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph6d .divbox .divbox_note_text table.bullet, #article_body_unique .ph6d .divbox .divbox_example_text table.bullet, #article_body_unique .ph6d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph7d .divbox .divbox_note_text table.bullet, #article_body_unique .ph7d .divbox .divbox_example_text table.bullet, #article_body_unique .ph7d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph8d .divbox .divbox_note_text table.bullet, #article_body_unique .ph8d .divbox .divbox_example_text table.bullet, #article_body_unique .ph8d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph9d .divbox .divbox_note_text table.bullet, #article_body_unique .ph9d .divbox .divbox_example_text table.bullet, #article_body_unique .ph9d .divbox .divbox_warning_text table.bullet, #article_body_unique .ph1e .divbox .divbox_note_text table.bullet, #article_body_unique .ph1e .divbox .divbox_example_text table.bullet, #article_body_unique .ph1e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph2e .divbox .divbox_note_text table.bullet, #article_body_unique .ph2e .divbox .divbox_example_text table.bullet, #article_body_unique .ph2e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph3e .divbox .divbox_note_text table.bullet, #article_body_unique .ph3e .divbox .divbox_example_text table.bullet, #article_body_unique .ph3e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph4e .divbox .divbox_note_text table.bullet, #article_body_unique .ph4e .divbox .divbox_example_text table.bullet, #article_body_unique .ph4e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph5e .divbox .divbox_note_text table.bullet, #article_body_unique .ph5e .divbox .divbox_example_text table.bullet, #article_body_unique .ph5e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph6e .divbox .divbox_note_text table.bullet, #article_body_unique .ph6e .divbox .divbox_example_text table.bullet, #article_body_unique .ph6e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph7e .divbox .divbox_note_text table.bullet, #article_body_unique .ph7e .divbox .divbox_example_text table.bullet, #article_body_unique .ph7e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph8e .divbox .divbox_note_text table.bullet, #article_body_unique .ph8e .divbox .divbox_example_text table.bullet, #article_body_unique .ph8e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph9e .divbox .divbox_note_text table.bullet, #article_body_unique .ph9e .divbox .divbox_example_text table.bullet, #article_body_unique .ph9e .divbox .divbox_warning_text table.bullet, #article_body_unique .ph1f .divbox .divbox_note_text table.bullet, #article_body_unique .ph1f .divbox .divbox_example_text table.bullet, #article_body_unique .ph1f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph2f .divbox .divbox_note_text table.bullet, #article_body_unique .ph2f .divbox .divbox_example_text table.bullet, #article_body_unique .ph2f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph3f .divbox .divbox_note_text table.bullet, #article_body_unique .ph3f .divbox .divbox_example_text table.bullet, #article_body_unique .ph3f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph4f .divbox .divbox_note_text table.bullet, #article_body_unique .ph4f .divbox .divbox_example_text table.bullet, #article_body_unique .ph4f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph5f .divbox .divbox_note_text table.bullet, #article_body_unique .ph5f .divbox .divbox_example_text table.bullet, #article_body_unique .ph5f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph6f .divbox .divbox_note_text table.bullet, #article_body_unique .ph6f .divbox .divbox_example_text table.bullet, #article_body_unique .ph6f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph7f .divbox .divbox_note_text table.bullet, #article_body_unique .ph7f .divbox .divbox_example_text table.bullet, #article_body_unique .ph7f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph8f .divbox .divbox_note_text table.bullet, #article_body_unique .ph8f .divbox .divbox_example_text table.bullet, #article_body_unique .ph8f .divbox .divbox_warning_text table.bullet, #article_body_unique .ph9f .divbox .divbox_note_text table.bullet, #article_body_unique .ph9f .divbox .divbox_example_text table.bullet, #article_body_unique .ph9f .divbox .divbox_warning_text table.bullet {
  padding-left: 0.9em; }
#article_body_unique .b_c_padding_bottom .divbox .divbox_note_text table.bullet2, #article_body_unique .b_c_padding_bottom .divbox .divbox_example_text table.bullet2, #article_body_unique .b_c_padding_bottom .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph1b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph1b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph1b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph2b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph2b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph2b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph3b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph3b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph3b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph4b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph4b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph4b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph5b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph5b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph5b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph6b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph6b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph6b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph7b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph7b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph7b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph8b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph8b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph8b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph9b .divbox .divbox_note_text table.bullet2, #article_body_unique .ph9b .divbox .divbox_example_text table.bullet2, #article_body_unique .ph9b .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph1c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph1c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph1c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph2c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph2c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph2c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph3c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph3c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph3c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph4c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph4c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph4c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph5c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph5c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph5c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph6c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph6c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph6c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph7c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph7c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph7c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph8c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph8c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph8c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph9c .divbox .divbox_note_text table.bullet2, #article_body_unique .ph9c .divbox .divbox_example_text table.bullet2, #article_body_unique .ph9c .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph1d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph1d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph1d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph2d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph2d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph2d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph3d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph3d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph3d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph4d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph4d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph4d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph5d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph5d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph5d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph6d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph6d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph6d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph7d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph7d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph7d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph8d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph8d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph8d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph9d .divbox .divbox_note_text table.bullet2, #article_body_unique .ph9d .divbox .divbox_example_text table.bullet2, #article_body_unique .ph9d .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph1e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph1e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph1e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph2e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph2e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph2e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph3e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph3e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph3e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph4e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph4e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph4e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph5e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph5e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph5e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph6e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph6e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph6e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph7e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph7e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph7e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph8e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph8e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph8e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph9e .divbox .divbox_note_text table.bullet2, #article_body_unique .ph9e .divbox .divbox_example_text table.bullet2, #article_body_unique .ph9e .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph1f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph1f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph1f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph2f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph2f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph2f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph3f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph3f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph3f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph4f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph4f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph4f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph5f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph5f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph5f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph6f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph6f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph6f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph7f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph7f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph7f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph8f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph8f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph8f .divbox .divbox_warning_text table.bullet2, #article_body_unique .ph9f .divbox .divbox_note_text table.bullet2, #article_body_unique .ph9f .divbox .divbox_example_text table.bullet2, #article_body_unique .ph9f .divbox .divbox_warning_text table.bullet2 {
  padding-left: 1.8em; }
#article_body_unique .b_c_padding_bottom .divbox .divbox_note_text table.bullet3, #article_body_unique .b_c_padding_bottom .divbox .divbox_example_text table.bullet3, #article_body_unique .b_c_padding_bottom .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph1b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph1b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph1b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph2b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph2b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph2b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph3b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph3b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph3b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph4b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph4b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph4b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph5b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph5b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph5b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph6b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph6b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph6b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph7b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph7b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph7b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph8b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph8b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph8b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph9b .divbox .divbox_note_text table.bullet3, #article_body_unique .ph9b .divbox .divbox_example_text table.bullet3, #article_body_unique .ph9b .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph1c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph1c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph1c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph2c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph2c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph2c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph3c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph3c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph3c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph4c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph4c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph4c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph5c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph5c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph5c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph6c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph6c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph6c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph7c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph7c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph7c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph8c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph8c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph8c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph9c .divbox .divbox_note_text table.bullet3, #article_body_unique .ph9c .divbox .divbox_example_text table.bullet3, #article_body_unique .ph9c .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph1d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph1d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph1d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph2d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph2d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph2d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph3d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph3d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph3d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph4d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph4d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph4d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph5d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph5d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph5d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph6d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph6d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph6d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph7d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph7d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph7d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph8d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph8d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph8d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph9d .divbox .divbox_note_text table.bullet3, #article_body_unique .ph9d .divbox .divbox_example_text table.bullet3, #article_body_unique .ph9d .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph1e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph1e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph1e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph2e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph2e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph2e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph3e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph3e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph3e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph4e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph4e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph4e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph5e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph5e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph5e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph6e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph6e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph6e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph7e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph7e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph7e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph8e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph8e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph8e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph9e .divbox .divbox_note_text table.bullet3, #article_body_unique .ph9e .divbox .divbox_example_text table.bullet3, #article_body_unique .ph9e .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph1f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph1f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph1f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph2f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph2f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph2f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph3f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph3f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph3f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph4f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph4f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph4f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph5f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph5f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph5f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph6f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph6f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph6f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph7f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph7f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph7f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph8f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph8f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph8f .divbox .divbox_warning_text table.bullet3, #article_body_unique .ph9f .divbox .divbox_note_text table.bullet3, #article_body_unique .ph9f .divbox .divbox_example_text table.bullet3, #article_body_unique .ph9f .divbox .divbox_warning_text table.bullet3 {
  padding-left: 2.7em; }
#article_body_unique .b_c_padding_bottom .divbox .divbox_note_text table.bullet4, #article_body_unique .b_c_padding_bottom .divbox .divbox_example_text table.bullet4, #article_body_unique .b_c_padding_bottom .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph1b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph1b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph1b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph2b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph2b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph2b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph3b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph3b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph3b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph4b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph4b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph4b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph5b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph5b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph5b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph6b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph6b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph6b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph7b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph7b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph7b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph8b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph8b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph8b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph9b .divbox .divbox_note_text table.bullet4, #article_body_unique .ph9b .divbox .divbox_example_text table.bullet4, #article_body_unique .ph9b .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph1c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph1c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph1c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph2c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph2c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph2c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph3c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph3c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph3c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph4c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph4c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph4c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph5c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph5c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph5c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph6c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph6c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph6c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph7c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph7c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph7c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph8c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph8c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph8c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph9c .divbox .divbox_note_text table.bullet4, #article_body_unique .ph9c .divbox .divbox_example_text table.bullet4, #article_body_unique .ph9c .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph1d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph1d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph1d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph2d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph2d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph2d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph3d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph3d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph3d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph4d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph4d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph4d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph5d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph5d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph5d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph6d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph6d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph6d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph7d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph7d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph7d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph8d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph8d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph8d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph9d .divbox .divbox_note_text table.bullet4, #article_body_unique .ph9d .divbox .divbox_example_text table.bullet4, #article_body_unique .ph9d .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph1e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph1e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph1e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph2e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph2e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph2e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph3e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph3e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph3e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph4e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph4e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph4e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph5e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph5e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph5e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph6e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph6e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph6e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph7e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph7e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph7e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph8e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph8e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph8e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph9e .divbox .divbox_note_text table.bullet4, #article_body_unique .ph9e .divbox .divbox_example_text table.bullet4, #article_body_unique .ph9e .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph1f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph1f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph1f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph2f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph2f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph2f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph3f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph3f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph3f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph4f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph4f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph4f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph5f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph5f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph5f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph6f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph6f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph6f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph7f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph7f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph7f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph8f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph8f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph8f .divbox .divbox_warning_text table.bullet4, #article_body_unique .ph9f .divbox .divbox_note_text table.bullet4, #article_body_unique .ph9f .divbox .divbox_example_text table.bullet4, #article_body_unique .ph9f .divbox .divbox_warning_text table.bullet4 {
  padding-left: 3.6em; }

table.bullet, table.bullet2, table.bullet3, table.bullet4 {
  margin: 0; }
  table.bullet tbody tr td.point, table.bullet tbody tr td.point_small,   table.bullet2 tbody tr td.point, table.bullet2 tbody tr td.point_small,   table.bullet3 tbody tr td.point, table.bullet3 tbody tr td.point_small,   table.bullet4 tbody tr td.point, table.bullet4 tbody tr td.point_small {
    vertical-align: top;
    font-family: 'dejavu sans mono', 'times new roman', sans-serif; }
  table.bullet tbody tr td.point_small,   table.bullet2 tbody tr td.point_small,   table.bullet3 tbody tr td.point_small,   table.bullet4 tbody tr td.point_small {
    font-size: 0.7em;
    padding-top: 2px; }
  table.bullet tbody tr td.point_number,   table.bullet2 tbody tr td.point_number,   table.bullet3 tbody tr td.point_number,   table.bullet4 tbody tr td.point_number {
    vertical-align: top; }
  table.bullet tbody tr td.text,   table.bullet2 tbody tr td.text,   table.bullet3 tbody tr td.text,   table.bullet4 tbody tr td.text {
    padding-left: 5px;
    line-spacing: 95%; }

Can you imagine doing this in plain CSS? Here is the SASS for the corresponding section:

#article_body_unique
  .b_c_padding_bottom, .ph1b, .ph2b, .ph3b, .ph4b, .ph5b, .ph6b, .ph7b, .ph8b, .ph9b, .ph1c, .ph2c, .ph3c, .ph4c, .ph5c, .ph6c, .ph7c, .ph8c, .ph9c, .ph1d, .ph2d, .ph3d, .ph4d, .ph5d, .ph6d, .ph7d, .ph8d, .ph9d, .ph1e, .ph2e, .ph3e, .ph4e, .ph5e, .ph6e, .ph7e, .ph8e, .ph9e, .ph1f, .ph2f, .ph3f, .ph4f, .ph5f, .ph6f, .ph7f, .ph8f, .ph9f
    table.bullet
      :padding-left = !padding_left_outline_base * 1
    table.bullet2
      :padding-left = !padding_left_outline_base * 2
    table.bullet3
      :padding-left = !padding_left_outline_base * 3
    table.bullet4
      :padding-left = !padding_left_outline_base * 4
    .divbox
      .divbox_note_text, .divbox_example_text, .divbox_warning_text
        p
          :padding-left 5px
        table.bullet
          :padding-left = !padding_left_outline_base * 1
        table.bullet2
          :padding-left = !padding_left_outline_base * 2
        table.bullet3
          :padding-left = !padding_left_outline_base * 3
        table.bullet4
          :padding-left = !padding_left_outline_base * 4

table.bullet, table.bullet2, table.bullet3, table.bullet4
  :margin 0
  //:font-size 90%
  tbody
    tr
      td.point, td.point_small
        :vertical-align top
        :font-family = !font_constant
      td.point_small
        :font-size 0.7em
        :padding-top 2px
      td.point_number
        :vertical-align top
      td.text
        :padding-left 5px
        :line-spacing 95%

So use SASS, and explore new ways to structure your CSS files. And once your stylesheet theme is set in stone, you can make SASS generate all the CSS code into a single line — effectively reducing bandwidth usage, and also acting as a poor man’s way of obfuscating brilliant CSS ideas.

Netbeans 6.0.1 on Elyssa – Ruby, Rails, C/C++ Projects

Some weeks ago, the Ubuntu people quietly upgraded their Netbeans package on their repositories from version 5.5 to 6.0.1. For me, this is great, because I don’t have to download shell install scripts from the Netbeans website any more (the current 6.1 not being much of a facelift from version 6.0.1). However, you’ll notice that 6.0.1 from Synaptic does not support the creation of projects other than Java or some other “Samples” in the New Project dialog box. To remedy this, simply go to Tools -> Plugins -> Available Plugins, and check off the boxes that you want to use. For me, I added the Ruby and Rails, Ruby Extra Hints, and C/C++ plugins. Now, I can create (and open existing) projects that are based on Ruby, Rails, or C/C++, and use all of the functionality of the IDE associated with those languages! You might also want to go to the Tools -> Plugins -> Updates tab to install some of the “core” updates to the general IDE.

Linux Mint (4.0, “Daryna”) – Reflections after a week of regular use

As far as the distro itself, Mint is quite excellent as I’ve pointed out in my previous post. After having the unprecedented success on my Dell laptop, I decided to install it on my Windows XP SP2 desktop PC as well. It’s too bad that there’s only a 32-bit version of Mint right now, but I’m sure it’ll expand to 64-bit once it gets popular enough.

Mint on my desktop looks verrry pretty. Compiz fusion runs brilliantly with the official nvidia drivers (easily google-able/searchable on synaptic). Indeed, running the Desktop Cube plugin alone saves me a ton of desktop real estate–it’s so beautiful and easy to use! (Firefox 2.0.0.12, when it restarts from a crash, will actually remember which sides of the cube its multiple windows were last open on–amazing.) And you can have more than just 4 sides–I have a hexagon setup on my laptop (4 sides is plenty enough for me on my desktop, as I use dual 22″ LCDs).

Speaking of dual monitors, it was probably the single most difficult thing for me to set up to get it to work. I ended up using TwinView after some preliminary research. Basically though, don’t get let down if after installing Mint you find that only 1 of the 2 monitors plugged into your video card is displaying any images. You just need to get TwinView (or Xinerama, or… there’s another program for ATI cards) to get your linux system to start spitting images out to that second monitor.

Some things I really dig about Linux (not just Mint, since this should apply to all linux distros/open source apps):

  1. NO NEED FOR ANTIVIRUS SOFTWARE! Google about it. It’s a liberating feeling not having to wait 3 minutes every day for AVG Free Edition to update virus definitions.
  2. NO NEED TO DEFRAG! Well, you wouldn’t need to defrag as long as you are using about 80% of your disk space (provided that the majority of your files are small, not like 2 gigs or something in size–I think; google it to see what I mean)
  3. NO SPYWARE/ADWARE! Since I only use FOSS, and since these are all developed by, basically, regular people like you and me (smart consumers who can code), and only grow in popularity based on things like ease of use, how good the program is, etc., they NEVER have any sort of system monitoring BS you get with (many) Windows programs. (To my mind, even the Apple Update software that comes with iTunes is bloat/crap, for people without iPods like me). As you can see by now, these three advantages alone rid probably100% of people’s problems with Microsoft Windows/what people spend their money on for Windows software. It’s incredible to see now, after all these years, that, Windows is essentially equivalent to a gasoline-guzzling truck (and the whole profit-minded, scam-like industry that the auto manufacturers have created in terms of exorbitant prices for simple, often obsolete-technology-but-still-being-produced parts). Linux is different. It’s smarter. (And I don’t understand why in the world Gates designed Windows the way it is, since UNIX came before him, not just Torvalds).
  4. COMPLETE CONTROL /ABILITY TO FIGURE OUT EXACTLY WHAT IS INSTALLED IN YOUR SYSTEM. You won’t be hunting down registry keys and things like that on linux (for 99% of your needs). This is because the wonderful application installer called synaptic (which comes with Mint–I’m not sure how other distros work) lists EVERY little component to ANYTHING you’ve installed (provided that you installed it from synaptic–which is like 98% of the time–unless you install things by building from source files and compiling them, which is what I did for some programs that were cutting-edge and not available from synaptic (e.g., NetBeans 6.0)). The beauty about installing things from synaptic is that, it lists programs from an online server (you can connect to as many servers as you want, I think, although Mint, being an Ubuntu-based distro, leaches off of Ubuntu’s repositories, heh). This means that thousands and thousands (maybe millions?) of people are looking at the same list of programs (for those using the default servers listed with synaptic). This means that, we have, at any given time, a tangible and finite amount of programs that are being considered for installation by people like you and me. Only quality programs/programs that are actually good and useful make it to this list; you won’t find any bogus/bloated junk here. Isn’t that just beautiful? And also, most programs you install will also tell you exactly what other programs/components it will need to become fully functional. I don’t write these down, but hey, it’s nice to know.
  5. FAST bootup times. I’m running off of an old IDE hard drive (I installed Windows on the SATA, poor me), and I still boot faster than Windows. This is still taking into account the 5-second delay for GRUB’s OS-choosing menu (which is deletable, I think, if you don’t want to dual-boot and just access Windows files from Linux, which is quite easy and automatic in Mint), and the 10-second minimum timed automatic login for your username/password. My PC feels lighter with less useless garbage running in the background.
  6. Related to #3 and #4: MOST PROGRAMS HAVE A VERY INTUITIVE/EASY TO UNDERSTAND USER INTERFACE! You won’t be digging up help files much at all. It’s not like the old Word 2003, where you had to do odd things like View -> Header and Footer to actually add things in there. This is because, since FOSS is developed actively (and incrementally, one step/patch at a time), things are changed quickly if people voice their dislike of a certain feature (or if enough requests come in). I didn’t have to do much to figure out how to customize things on the standard text editor/etc, even though I’d never used them for the first time. The only exception to this is OpenOffice, which retains much of the quirky location of options from the old MS Office programs, to steal Microsoft’s userbase.
  7. Oh, and how can I forget: NO NEED TO RESTART/REBOOT AFTER INSTALLING A PROGRAM!!! You heard that right. Well, it’s been this way so far for about… 15-ish programs that I’ve installed. Amazing. It just feels so odd to install a program and then use it right away. It’s a good feeling.
  8. Multi-platform programs are faster on here than in Windows. E.g., the ruby interpreter, irb, begins instantly when I type in “irb” in the terminal. On Windows’ command line, it would always wait 1 second before starting. Mongrel is faster on Linux here for my Ruby on Rails app (probably due to how there’s less crap/no antivirus running on my system when my app is handling a large MySQL/computationally intensive query). If you click on any program, it seems, it will start pretty quick compared to Windows.

Now, nothing gold can stay; so, here are some perks that I find distracting/unnatural:

  1. The need to constantly type in “sudo” before executing any important and/or system administration/driver related command. I think “sudo” stands for “super user do.” Essentially, typing in “sudo” is a security layer against someone changing really important settings on your system, like editing the configuration file for your screen/monitor (the widely-known “xorg.conf” file that you might have heard of by now). I think this behavior is changeable (heck, anything in Linux is), but I’m too lazy to google it just now. And in a way I sort of like being trained in the old UNIX tradition of yore of using the terminal. And that brings me to…
  2. TERMINALS! I should have mentioned this first. The “terminal” basically stands for the Windows equivalent of a “DOS” prompt or “command line” prompt. It’s the black background with monospaced characters with a little blinking line waiting for you to type in some (rather archaic looking) command the computer can understand, like “cd” for change directory, “rm” for removing a file, and so on. Terminals, and Linux’s obsession with giving the user absolute control over everything, has lead to their continued widespread use for some rather basic commands (you’ve probably seen advice like “type ‘sudo apt-get install program_name_here’ ” on some forum online–the speaker was referring to the terminal). This is confusing, and really, there shouldn’t be a need for you to type in perfectly-spelled commands. Right now, I don’t know how to change file/folder permissions in the File Browser (aka “nautilus”), so I have to type in things like “sudo chmod 777 file_name” which looks a bit stupid, honestly, for something so simple. Yes, the terminal is powerful and you can do all the magic in the world in them, but it’s basically over-used/over-recommended for some things.
  3. Lack of official support for some hardware, like my Brother HL-2040 printer. (I was so suprised that Mint got it working without a hiccup after I installed the Linux drivers from the Brother website–and even automatically found and printed to a networked printer (also a Brother, but a different model) in a different room in my house). Wait, but how can I say lack of support when everything worked smoothly? It’s the lack of printing options I get from inside Windows. I can’t do 2-up printing (or even manual duplex, it seems) inside Mint. Ah, I miss duplex so much.
  4. Since there are few commercial companies that have Linux products, this means that any Linux problem you google about to get help is likely to link to some Linux community’s forum or the official forum of the FOSS developer in question (and sometimes the monstrous, 60+ page topics that have hundreds of people chipping in their own little quirk/experience/variation to the problem originally proposed). The real downside is that, often, if you don’t want to spend 20 minutes to research/find an answer that works, you’ll have to register and submit a question on a forum. For Windows problems, I’ve found that, the internet is overflowing with answers to just about anything you can think of about your Windows system, that it’s more like spending 2 minutes to find an answer on google. I miss the large community of me-alikes (and yes, Ubuntu’s community is very large, but nothing compared to the Windows family).
  5. Somewhat shoddy international language INPUT support. Notice how I stress input, not viewing Unicode or anything like that. Right now, there are two alternatives for Chinese/Japanese/Korean input on Mint–SCIM (what I use) and UIM. But SCIM is weird because I’m quite sure I installed it the same way on my desktop as I did in my laptop, and yet, they behaved differently for some time, in things like display of the tray icon and whatnot. Well, they both work now–but to get them to work, I had to edit some files and things. Not fun. (If you’re curious, the tray icon wouldn’t show on my desktop, so I had to configure my Sessions setting to restart SCIM with “scim -d” manually each time Mint starts–which seems redundant since SCIM is already supposed to start automatically anew with each boot/login).
  6. And of course, not many games! It’s not really a complaint, I guess, but yes, the gaming community is really lagging behind in the Linux world. For things like word processing and email and any other basic PC use, Linux is quite excellent. But not for games. So, it’s not yet a really as “fun” a machine as Windows in this field.
  7. Somewhat redundant-looking folders in the system. E.g., for fonts, there’s a ~/.fonts hidden folder, another fonts folder under /etc/X11, etc etc etc (like 20 folders all called “fonts” in various directories–type in “fc-cache -fv” in the terminal to update your system’s font recognition of new fonts you’ve installed, and you’ll see these redundant-looking font folder structures/locations). It’s confusing. It’s probably because there are thousands of programmers and many large projects that do not work together toward a common goal (that goal here being the use of just 1 font folder for everything, like how Windows does C:/Windows/FONTS). E.g., OpenOffice has its own font directory, and the same for X11 mentioned above (X is a GUI kind of thing for the Mint OS, it seems, and I think the term “X Window System” comes from this technology). It’s a liiiiittle bit confusing if you’re anal about where everything is located, like me. (On the other hand, you can type in “fonts:///” in File Browser and see a universal list of fonts that are currently recognized by the system–but “fonts:///” is not actually a physical folder, but a collection of symbolic links I think that is displayed into one magic folder).

So that’s my wrap-up of Linux first impressions, of sorts. Hopefully this will give you an idea of what the Linux world is like at the moment. Do keep an eye out for Mint version 5.0, due out sometime in April (that’s next month!). (Daryna came out last October–oh, if I had known, I would have installed it during winter break!)

EDIT: To simulate Manual Duplex printing on a HL-2040 (or possibly any basic printer), follow these steps:

  1. First, set up the printing properties from within the app you’re printing from, so that you print only the even pages first.
  2. Put those pages back into the printer tray, keeping in mind the proper orientation. For me, I just stole the image from the manual duplex dialog box from Windows.
  3. Now, print the odd pages.

The only significant difference from the Windows experience is that, you have to manually click your way through to set up the printer that it prints only the even pages, and then only the odd pages. Other than that, it’s basically the same. Caveat: be sure to set the printer option BACK to printing “all pages,” and not just the odd ones, because it will likely remember your setting, so that, if you ask the printer to print page 4 next time, it will give you an error (this is what happened to me using the Evince pdf viewer).