//[Update:[Wed May 30 IST 2018]]
//[[./map2018.png]]
import java.util.*;
class Axar implements Comparable<Axar> {
    int top, bottom, left, right, cenJ;
    boolean isCont;
    String let;
    int line;

    int উপর, নীচ, বাঁ, ডান;
    public void setLine(int ln) {
        line = ln;
    }

    public boolean getIsCont() {
        return isCont;
    }

    /*private static Dict dict;

      static {
      dict = new Dict();
      }*/
    int index, thisHeight;
    String id;
    Glyphs gl;

    public Axar(String id, int t,int b, int lf, int rt) {
        top = t;
        bottom = b;
        left = lf;
        right = rt;
        cenJ = (left+right)/2;
        this.id = id; 
        if(dict.containsKey(id)) 
            gl = dict.get(id);

        else 
            gl = Glyphs.BAD;
        
        thisHeight = bottom-top+1;


    }
    
    public String toString() {
        return line+":["+id+"@["+top+", "+bottom+"]x["+left+", "+right
            +"]";
    }


    public boolean sharesLineWith(Axar other) {
        if(top > other.bottom) return false;
        if(bottom < other.top) return false;

        int horGap = (left < other.left? 
                      other.left-left :
                      left-other.left);
        if(horGap > 500) return false;

        int thatHeight = other.bottom-other.top+1;
        int criticalHeight = 
            (thisHeight < thatHeight? thisHeight : thatHeight)/2;

        int one = other.bottom-top;
        int two = bottom-other.top;

        int overLap = (one < two? one : two);

        if(overLap < criticalHeight) return false;

        //System.err.println(index+" shares line with "+other.index);
        return true;
    }


    public int compareTo(Axar other) {
        int temp = line - other.line;

        if(temp!=0) return temp;

        return cenJ - other.cenJ;
    }

    public boolean isByanjan() {
        //System.err.println("gl = "+gl);
        return (gl.ordinal() >= Glyphs.K.ordinal()) && (gl.ordinal() <= Glyphs.X.ordinal());
    }

    public boolean isYaphala() {
        return gl==Glyphs.YAPHALA;
    }

    public boolean isShift() {
        return gl==Glyphs.ENG;
    }

    final static int BENG=0, ENG=1; 
    enum Glyphs {K, KH, G, GH, CH, CHH, J, JH,
                 TT, TTH, DD, DDH, T, TH, D, DH, 
                 P, PH, B, BH, M, N, R, L,
                 S, H, PLUS, NG, Y, X, A,
                 ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE,
                 AA, RRI, I, U, E, OI, O , OU,
                 AA_KAR, RRI_KAR, I_KAR, U_KAR, E_KAR, OI_KAR, O_KAR , OU_KAR,
                 YAPHALA,
                 LPAR, RPAR, MATH, BISARGA, PERIOD, QN, ENG, SPACE, BAD};


    static Hashtable<String,Glyphs> dict = new Hashtable<String,Glyphs>();
    static Hashtable<Glyphs,String> bname = new Hashtable<Glyphs,String>();

    // {{{ static String[] ename = {"a", "A", etc }
    static String[] ename = 
        {"a", "A", "i", "I", "u", "U", "w", "e", "E", "o", "O",
         "k","K","g","G","q",
         "c","C","j","J","z",
         "T","M","D","Q","N",
         "t","W","d","P","n",
         "p","f","b","v","m",
         "s","Z","S","h",
         "r","R","F","l",
         "x","B","L","H",
         "y","y","Y",".h",
         ".",",","--","?","!",
         " ", "</E>@}","*"};
    // }}}

    static {
        // {{{ Id to glyph to string mappings
        dict.put("0101",Glyphs.K); bname.put(Glyphs.K,"k");
        dict.put("0102",Glyphs.KH); bname.put(Glyphs.KH,"kh");
        dict.put("0111",Glyphs.G); bname.put(Glyphs.G,"g");
        dict.put("0121",Glyphs.GH); bname.put(Glyphs.GH,"gh");
        
        dict.put("0110",Glyphs.CH); bname.put(Glyphs.CH,"ch");
        dict.put("0120",Glyphs.CHH); bname.put(Glyphs.CHH,"chh");
        dict.put("0112",Glyphs.J); bname.put(Glyphs.J,"j");
        dict.put("0122",Glyphs.JH); bname.put(Glyphs.JH,"jh");
        //-------
        dict.put("0201",Glyphs.TT); bname.put(Glyphs.TT,"T");
        dict.put("0202",Glyphs.TTH); bname.put(Glyphs.TTH,"Th");
        dict.put("0211",Glyphs.DD); bname.put(Glyphs.DD,"D");
        dict.put("0221",Glyphs.DDH); bname.put(Glyphs.DDH,"Dh");
        
        dict.put("0210",Glyphs.T); bname.put(Glyphs.T,"t");
        dict.put("0220",Glyphs.TH); bname.put(Glyphs.TH,"th");
        dict.put("0212",Glyphs.D); bname.put(Glyphs.D,"d");
        dict.put("0222",Glyphs.DH); bname.put(Glyphs.DH,"dh");
        //-------
        dict.put("1001",Glyphs.P); bname.put(Glyphs.P,"p");
        dict.put("1002",Glyphs.PH); bname.put(Glyphs.PH,"ph");
        dict.put("1011",Glyphs.B); bname.put(Glyphs.B,"b");
        dict.put("1021",Glyphs.BH); bname.put(Glyphs.BH,"bh");
        
        dict.put("1010",Glyphs.M); bname.put(Glyphs.M,"m");
        dict.put("1020",Glyphs.N); bname.put(Glyphs.N,"n");
        dict.put("1012",Glyphs.R); bname.put(Glyphs.R,"r");
        dict.put("1022",Glyphs.L); bname.put(Glyphs.L,"l");
        //-------
        dict.put("1101",Glyphs.S); bname.put(Glyphs.S,"s");
        dict.put("1102",Glyphs.H); bname.put(Glyphs.H,"h");
        dict.put("1111",Glyphs.PLUS); bname.put(Glyphs.PLUS,"+");
        dict.put("1121",Glyphs.NG); bname.put(Glyphs.NG,".n");
        
        dict.put("1110",Glyphs.Y); bname.put(Glyphs.Y,"y");
        dict.put("1120",Glyphs.A); bname.put(Glyphs.A,"a");
        dict.put("1112",Glyphs.EIGHT); bname.put(Glyphs.EIGHT,"8");
        dict.put("1122",Glyphs.NINE); bname.put(Glyphs.NINE,"9");
        //-------
        dict.put("1201",Glyphs.ZERO); bname.put(Glyphs.ZERO,"0");
        dict.put("1202",Glyphs.ONE); bname.put(Glyphs.ONE,"1");
        dict.put("1211",Glyphs.TWO); bname.put(Glyphs.TWO,"2");
        dict.put("1221",Glyphs.THREE); bname.put(Glyphs.THREE,"3");
        
        dict.put("1210",Glyphs.FOUR); bname.put(Glyphs.FOUR,"4");
        dict.put("1220",Glyphs.FIVE); bname.put(Glyphs.FIVE,"5");
        dict.put("1212",Glyphs.SIX); bname.put(Glyphs.SIX,"6");
        dict.put("1222",Glyphs.SEVEN); bname.put(Glyphs.SEVEN,"7");
        //-------
        dict.put("2001",Glyphs.AA); bname.put(Glyphs.AA,"A");
        dict.put("2002",Glyphs.RRI); bname.put(Glyphs.RRI,"rri");
        dict.put("2011",Glyphs.I); bname.put(Glyphs.I,"i");
        dict.put("2021",Glyphs.U); bname.put(Glyphs.U,"u");
        
        dict.put("2010",Glyphs.E); bname.put(Glyphs.E,"e");
        dict.put("2020",Glyphs.OI); bname.put(Glyphs.OI,"\\oi");
        dict.put("2012",Glyphs.O); bname.put(Glyphs.O,"o");
        dict.put("2022",Glyphs.OU); bname.put(Glyphs.OU,"\\ou");
        //-------
        dict.put("2101",Glyphs.AA_KAR); bname.put(Glyphs.AA_KAR,"A");
        dict.put("2102",Glyphs.RRI_KAR); bname.put(Glyphs.RRI_KAR,"rri");
        dict.put("2111",Glyphs.I_KAR); bname.put(Glyphs.I_KAR,"i");
        dict.put("2121",Glyphs.U_KAR); bname.put(Glyphs.U_KAR,"u");
        
        dict.put("2110",Glyphs.E_KAR); bname.put(Glyphs.E_KAR,"e");
        dict.put("2120",Glyphs.OI_KAR); bname.put(Glyphs.OI_KAR,"\\oi");
        dict.put("2112",Glyphs.O_KAR); bname.put(Glyphs.O_KAR,"o");
        dict.put("2122",Glyphs.OU_KAR); bname.put(Glyphs.OU_KAR,"\\ou");
        //-------
        dict.put("2201",Glyphs.RPAR); bname.put(Glyphs.RPAR,")");
        dict.put("2202",Glyphs.MATH); bname.put(Glyphs.MATH,"$");
        dict.put("2211",Glyphs.QN); bname.put(Glyphs.QN,"?");
        dict.put("2221",Glyphs.X); bname.put(Glyphs.X,"x");
        
        dict.put("2210",Glyphs.LPAR); bname.put(Glyphs.LPAR,"(");
        dict.put("2220",Glyphs.BISARGA); bname.put(Glyphs.BISARGA,".H");
        dict.put("2212",Glyphs.YAPHALA); bname.put(Glyphs.YAPHALA,"y");
        dict.put("2222",Glyphs.PERIOD); bname.put(Glyphs.PERIOD,".");
        //-------
        // }}}
    }

    
    public String glyph(int lang) {
        return bname.get(gl);//        return (lang==BENG? bname: ename)[gl.ordinal()];
    }
}



