""" Python Character Mapping Codec generated from 'CP737.TXT' with gencodec.py.

Written by Marc-Andre Lemburg (mal@lemburg.com).

(c) Copyright CNRI, All Rights Reserved. NO WARRANTY.
(c) Copyright 2000 Guido van Rossum.

"""#"

import codecs

### Codec APIs

class Codec(codecs.Codec):

    def encode(self,input,errors='strict'):

        return codecs.charmap_encode(input,errors,encoding_map)
        
    def decode(self,input,errors='strict'):

        return codecs.charmap_decode(input,errors,decoding_map)

class StreamWriter(Codec,codecs.StreamWriter):
    pass
        
class StreamReader(Codec,codecs.StreamReader):
    pass

### encodings module API

def getregentry():

    return (Codec().encode,Codec().decode,StreamReader,StreamWriter)

### Decoding Map

decoding_map = codecs.make_identity_dict(range(256))
decoding_map.update({
	0x0080: 0x0391,	# GREEK CAPITAL LETTER ALPHA
	0x0081: 0x0392,	# GREEK CAPITAL LETTER BETA
	0x0082: 0x0393,	# GREEK CAPITAL LETTER GAMMA
	0x0083: 0x0394,	# GREEK CAPITAL LETTER DELTA
	0x0084: 0x0395,	# GREEK CAPITAL LETTER EPSILON
	0x0085: 0x0396,	# GREEK CAPITAL LETTER ZETA
	0x0086: 0x0397,	# GREEK CAPITAL LETTER ETA
	0x0087: 0x0398,	# GREEK CAPITAL LETTER THETA
	0x0088: 0x0399,	# GREEK CAPITAL LETTER IOTA
	0x0089: 0x039a,	# GREEK CAPITAL LETTER KAPPA
	0x008a: 0x039b,	# GREEK CAPITAL LETTER LAMDA
	0x008b: 0x039c,	# GREEK CAPITAL LETTER MU
	0x008c: 0x039d,	# GREEK CAPITAL LETTER NU
	0x008d: 0x039e,	# GREEK CAPITAL LETTER XI
	0x008e: 0x039f,	# GREEK CAPITAL LETTER OMICRON
	0x008f: 0x03a0,	# GREEK CAPITAL LETTER PI
	0x0090: 0x03a1,	# GREEK CAPITAL LETTER RHO
	0x0091: 0x03a3,	# GREEK CAPITAL LETTER SIGMA
	0x0092: 0x03a4,	# GREEK CAPITAL LETTER TAU
	0x0093: 0x03a5,	# GREEK CAPITAL LETTER UPSILON
	0x0094: 0x03a6,	# GREEK CAPITAL LETTER PHI
	0x0095: 0x03a7,	# GREEK CAPITAL LETTER CHI
	0x0096: 0x03a8,	# GREEK CAPITAL LETTER PSI
	0x0097: 0x03a9,	# GREEK CAPITAL LETTER OMEGA
	0x0098: 0x03b1,	# GREEK SMALL LETTER ALPHA
	0x0099: 0x03b2,	# GREEK SMALL LETTER BETA
	0x009a: 0x03b3,	# GREEK SMALL LETTER GAMMA
	0x009b: 0x03b4,	# GREEK SMALL LETTER DELTA
	0x009c: 0x03b5,	# GREEK SMALL LETTER EPSILON
	0x009d: 0x03b6,	# GREEK SMALL LETTER ZETA
	0x009e: 0x03b7,	# GREEK SMALL LETTER ETA
	0x009f: 0x03b8,	# GREEK SMALL LETTER THETA
	0x00a0: 0x03b9,	# GREEK SMALL LETTER IOTA
	0x00a1: 0x03ba,	# GREEK SMALL LETTER KAPPA
	0x00a2: 0x03bb,	# GREEK SMALL LETTER LAMDA
	0x00a3: 0x03bc,	# GREEK SMALL LETTER MU
	0x00a4: 0x03bd,	# GREEK SMALL LETTER NU
	0x00a5: 0x03be,	# GREEK SMALL LETTER XI
	0x00a6: 0x03bf,	# GREEK SMALL LETTER OMICRON
	0x00a7: 0x03c0,	# GREEK SMALL LETTER PI
	0x00a8: 0x03c1,	# GREEK SMALL LETTER RHO
	0x00a9: 0x03c3,	# GREEK SMALL LETTER SIGMA
	0x00aa: 0x03c2,	# GREEK SMALL LETTER FINAL SIGMA
	0x00ab: 0x03c4,	# GREEK SMALL LETTER TAU
	0x00ac: 0x03c5,	# GREEK SMALL LETTER UPSILON
	0x00ad: 0x03c6,	# GREEK SMALL LETTER PHI
	0x00ae: 0x03c7,	# GREEK SMALL LETTER CHI
	0x00af: 0x03c8,	# GREEK SMALL LETTER PSI
	0x00b0: 0x2591,	# LIGHT SHADE
	0x00b1: 0x2592,	# MEDIUM SHADE
	0x00b2: 0x2593,	# DARK SHADE
	0x00b3: 0x2502,	# BOX DRAWINGS LIGHT VERTICAL
	0x00b4: 0x2524,	# BOX DRAWINGS LIGHT VERTICAL AND LEFT
	0x00b5: 0x2561,	# BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
	0x00b6: 0x2562,	# BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
	0x00b7: 0x2556,	# BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
	0x00b8: 0x2555,	# BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
	0x00b9: 0x2563,	# BOX DRAWINGS DOUBLE VERTICAL AND LEFT
	0x00ba: 0x2551,	# BOX DRAWINGS DOUBLE VERTICAL
	0x00bb: 0x2557,	# BOX DRAWINGS DOUBLE DOWN AND LEFT
	0x00bc: 0x255d,	# BOX DRAWINGS DOUBLE UP AND LEFT
	0x00bd: 0x255c,	# BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
	0x00be: 0x255b,	# BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
	0x00bf: 0x2510,	# BOX DRAWINGS LIGHT DOWN AND LEFT
	0x00c0: 0x2514,	# BOX DRAWINGS LIGHT UP AND RIGHT
	0x00c1: 0x2534,	# BOX DRAWINGS LIGHT UP AND HORIZONTAL
	0x00c2: 0x252c,	# BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
	0x00c3: 0x251c,	# BOX DRAWINGS LIGHT VERTICAL AND RIGHT
	0x00c4: 0x2500,	# BOX DRAWINGS LIGHT HORIZONTAL
	0x00c5: 0x253c,	# BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
	0x00c6: 0x255e,	# BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
	0x00c7: 0x255f,	# BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
	0x00c8: 0x255a,	# BOX DRAWINGS DOUBLE UP AND RIGHT
	0x00c9: 0x2554,	# BOX DRAWINGS DOUBLE DOWN AND RIGHT
	0x00ca: 0x2569,	# BOX DRAWINGS DOUBLE UP AND HORIZONTAL
	0x00cb: 0x2566,	# BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
	0x00cc: 0x2560,	# BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
	0x00cd: 0x2550,	# BOX DRAWINGS DOUBLE HORIZONTAL
	0x00ce: 0x256c,	# BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
	0x00cf: 0x2567,	# BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
	0x00d0: 0x2568,	# BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
	0x00d1: 0x2564,	# BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
	0x00d2: 0x2565,	# BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
	0x00d3: 0x2559,	# BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
	0x00d4: 0x2558,	# BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
	0x00d5: 0x2552,	# BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
	0x00d6: 0x2553,	# BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
	0x00d7: 0x256b,	# BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
	0x00d8: 0x256a,	# BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
	0x00d9: 0x2518,	# BOX DRAWINGS LIGHT UP AND LEFT
	0x00da: 0x250c,	# BOX DRAWINGS LIGHT DOWN AND RIGHT
	0x00db: 0x2588,	# FULL BLOCK
	0x00dc: 0x2584,	# LOWER HALF BLOCK
	0x00dd: 0x258c,	# LEFT HALF BLOCK
	0x00de: 0x2590,	# RIGHT HALF BLOCK
	0x00df: 0x2580,	# UPPER HALF BLOCK
	0x00e0: 0x03c9,	# GREEK SMALL LETTER OMEGA
	0x00e1: 0x03ac,	# GREEK SMALL LETTER ALPHA WITH TONOS
	0x00e2: 0x03ad,	# GREEK SMALL LETTER EPSILON WITH TONOS
	0x00e3: 0x03ae,	# GREEK SMALL LETTER ETA WITH TONOS
	0x00e4: 0x03ca,	# GREEK SMALL LETTER IOTA WITH DIALYTIKA
	0x00e5: 0x03af,	# GREEK SMALL LETTER IOTA WITH TONOS
	0x00e6: 0x03cc,	# GREEK SMALL LETTER OMICRON WITH TONOS
	0x00e7: 0x03cd,	# GREEK SMALL LETTER UPSILON WITH TONOS
	0x00e8: 0x03cb,	# GREEK SMALL LETTER UPSILON WITH DIALYTIKA
	0x00e9: 0x03ce,	# GREEK SMALL LETTER OMEGA WITH TONOS
	0x00ea: 0x0386,	# GREEK CAPITAL LETTER ALPHA WITH TONOS
	0x00eb: 0x0388,	# GREEK CAPITAL LETTER EPSILON WITH TONOS
	0x00ec: 0x0389,	# GREEK CAPITAL LETTER ETA WITH TONOS
	0x00ed: 0x038a,	# GREEK CAPITAL LETTER IOTA WITH TONOS
	0x00ee: 0x038c,	# GREEK CAPITAL LETTER OMICRON WITH TONOS
	0x00ef: 0x038e,	# GREEK CAPITAL LETTER UPSILON WITH TONOS
	0x00f0: 0x038f,	# GREEK CAPITAL LETTER OMEGA WITH TONOS
	0x00f1: 0x00b1,	# PLUS-MINUS SIGN
	0x00f2: 0x2265,	# GREATER-THAN OR EQUAL TO
	0x00f3: 0x2264,	# LESS-THAN OR EQUAL TO
	0x00f4: 0x03aa,	# GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
	0x00f5: 0x03ab,	# GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
	0x00f6: 0x00f7,	# DIVISION SIGN
	0x00f7: 0x2248,	# ALMOST EQUAL TO
	0x00f8: 0x00b0,	# DEGREE SIGN
	0x00f9: 0x2219,	# BULLET OPERATOR
	0x00fa: 0x00b7,	# MIDDLE DOT
	0x00fb: 0x221a,	# SQUARE ROOT
	0x00fc: 0x207f,	# SUPERSCRIPT LATIN SMALL LETTER N
	0x00fd: 0x00b2,	# SUPERSCRIPT TWO
	0x00fe: 0x25a0,	# BLACK SQUARE
	0x00ff: 0x00a0,	# NO-BREAK SPACE
})

### Encoding Map

encoding_map = {}
for k,v in decoding_map.items():
    encoding_map[v] = k
