Artisan Numérique

/bureau/bureautique/windows/ Cracker les mots de passe de Trillian

Ma douce ayant reçu un nouveau portable pour fêter le proche printemps, se trouva fort dépourvu quant le moment de se souvenir de ses mots de passe fût venu. Vu qu'elle utilise le, pas mauvais du tout, Trillian dont j'avais acheté la licence il y a de cela bien longtemps, lorsque j'utilisais un machin nommé Windows, je me suis donc mis à rechercher, sans trop d'espoirs, si par hasard les identifiants étaient stockés en clairs. On peut toujours paradoxalement en rêver tout en espérant que ce ne soit pas le cas...

Déjà, mauvais point, Trillian stocke son bazar dans /Program Files/Trillian/Users/... et pas dans le dossier personnel comme il se doit. Pas terrible. En revanche, dans les divers fichier .ini, on trouve bien un mot de passe, mais encodé. Bon point là, même si cela ne va pas me simplifier la tache.

Je me met donc avec l'ami Gougueule à rechercher un cracker, et bien évidement j'en trouve un... L'exemple archétypale de ce qui me saoule dans le monde Windowsien, des pop-ups dans tout les sens, il faut laisser des mails en pagaille pour que le serveur daigne vous filer le binaire d'installation et l'installation qui demande une adresse courriel mail pour aller s'enregistrer je ne sais où, et au final un outil qui vous annonce fièrement qu'il a tout décodé mais que pour avoir le résultat, faut banquer $19... $19 pour un outil qui vaut tout au plus 3 sesterces, ça va po la tête ?

Je reprends donc les commandes du Gouguele en cherchant si par hasard il n'y aurait pas une doc qui explique comment s'y prendre. Et dans d'obscures groupes, je trouve mon bonheur. En gros, le codage de Trillian est bête comme choux. Le nombre maximum de caractères étant de 16, le mot de passe encodé est composé de 16 valeurs hexadécimales (2 digits chacune, soit 32 car. max.).

Trillian pour son encodage/décodage utilise de deux choses :

  1. Une liste de caractères autorisés dans les mots de passe (ex. a, b, c, d, etc...)
  2. 16 listes contenant chacune autant de valeurs hexadécimale qu'il y a de caractère dans liste (1). Ex. 0x92, 0x90, etc...

Armé de cela, le décodage est enfantin. Il suffit de faire correspondre la valeur hexa n°N dans le mot de passe encodé avec sa position P dans la liste n°N. Ensuite il suffit de regarder dans la liste (1) quel est le caractère à la position P, et ainsi de suite sur chaque valeur.

Tout le jeu est maintenant de trouver les fameuses listes (2) et la liste (1), et là aussi Gouguele est notre ami ;-) Et comme moi aussi je suis votre amis, j'ai écrit un petit code Java qui permet de faire ce décodage de manière automatique. Il s'utilise simplement comme cela :

javac TrillianPasswordDecoder.java
java -cp . TrillianPasswordDecoder 9844ECAF
Encoded password : {0x98, 0x44, 0xec, 0xaf}
Decoded password : kbmk

Economie de $19 donc... désolé pour le vendeur de shareware qui va devoir trouver des sujets un peu plus évolués pour faire banquer les pigeons. Le code qui suit est bien évidement sous licence GPL.

public class TrillianPasswordDecoder {
    /**
     * Fonction de décodage du mot de passe
     * 
     * @param string le mot de passe encodé
     */
    private void decodePassword(String password) {
        // Pour plus de simplicité on converti le mot de passe en une suite d'entiers hexa
        if (password.length() > 32) {
            System.err.println("Password too long, only 32 character max, this will be truncated.");
            password = password.substring(0, 31);
        }
        if (password.length() % 2 == 1) {
            System.err.println("Number of character in password should be odd, this will be truncated.");
        }

        // Pour plus de simplicité on converti le mot de passe en une suite d'entiers hexa
        System.out.print("Encoded password : {");
        int[] encodedPassword = new int[password.length() / 2];
        for (int iCharacter = 0; iCharacter < encodedPassword.length; iCharacter++) {
            encodedPassword[iCharacter] = Integer.parseInt(password.substring(2 * iCharacter, 2 * iCharacter + 2), 16);
            if (iCharacter > 0) {
                System.out.print(", ");
            }
            System.out.print("0x" + Integer.toHexString(encodedPassword[iCharacter]));
        }
        System.out.println("}");
        // Intération sur chaque caractère encodé
        String decodedPassword = "";
        for (int iEncoderCharacter = 0; iEncoderCharacter < encodedPassword.length; iEncoderCharacter++) {
            // Non trouvé par défaut
            char decoderCharacter = '\0';

            // Recherche du caractère encodé dans la ligne courrante de la table de décodage
            for (int iRosetaCharacter = 0; iRosetaCharacter < ROSETA_STONE[iEncoderCharacter].length; iRosetaCharacter++) {
                if (ROSETA_STONE[iEncoderCharacter][iRosetaCharacter] == encodedPassword[iEncoderCharacter]) {
                    decoderCharacter = CHARSET.charAt(iRosetaCharacter);
                }
            }

            // Ajout du caractère décodé si tout c'est bien passé, sinon, on ajoute un {?} pour que
            // puisse être répérée l'erreur.
            if (decoderCharacter == '\0') {
                System.err.println("Unable to decode this 0x" + Integer.toHexString(encodedPassword[iEncoderCharacter]));
                System.err.println("Replacing it with the pattern {?}");
                decodedPassword += "{?}";
            }
            else {
                decodedPassword += decoderCharacter;
            }

            // 
        }

        // C'est fini, affichage du résultat
        System.out.println("Decoded password : " + decodedPassword);
    }

    // Lancement de l'utilitaire
    public static void main(String[] args) {
        if (args.length == 0) {
            System.err.println("Syntax : trillianPasswordDecoder ENCODED_PASSWORD");
            System.exit(0);
        }
        new TrillianPasswordDecoder().decodePassword(args[0]);
    }

    // Les caractères reconnus par trillian
    private final String CHARSET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ~`!@#$%^&*()_-+={[}]|\\:;\"'<,>.?/¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ";

    // La table de conversion pour le décodage.
    private final int[][] ROSETA_STONE = {
            { 0x92, 0x91, 0x90, 0x97, 0x96, 0x95, 0x94, 0x9b, 0x9a, 0x99, 0x98, 0x9f, 0x9e, 0x9d, 0x9c, 0x83, 0x82, 0x81, 0x80, 0x87, 0x86, 0x85, 0x84, 0x8b, 0x8a, 0x89, 0xb2, 0xb1, 0xb0, 0xb7, 0xb6, 0xb5, 0xb4, 0xbb, 0xba, 0xb9, 0xb8, 0xbf, 0xbe, 0xbd,
                    0xbc, 0xa3, 0xa2, 0xa1, 0xa0, 0xa7, 0xa6, 0xa5, 0xa4, 0xab, 0xaa, 0xa9, 0xc3, 0xc2, 0xc1, 0xc0, 0xc7, 0xc6, 0xc5, 0xc4, 0xcb, 0xca, 0xd3, 0x8d, 0x93, 0xd2, 0xb3, 0xd0, 0xd7, 0xd6, 0xad, 0xd5, 0xd9, 0xdb, 0xda, 0xac, 0xde, 0xd8, 0xce,
                    0x88, 0xa8, 0x8e, 0xae, 0x8f, 0xaf, 0xc9, 0xc8, 0xd1, 0xd4, 0xcf, 0xdf, 0xcd, 0xdd, 0xcc, 0xdc, 0x52, 0x51, 0x50, 0x57, 0x56, 0x55, 0x54, 0x5b, 0x5a, 0x59, 0x58, 0x5f, 0x5d, 0x5c, 0x43, 0x42, 0x41, 0x40, 0x47, 0x46, 0x45, 0x44, 0x4b,
                    0x4a, 0x49, 0x48, 0x4f, 0x4e, 0x4d, 0x4c, 0x33, 0x32, 0x31, 0x30, 0x37, 0x36, 0x35, 0x34, 0x3b, 0x3a, 0x39, 0x38, 0x3f, 0x3e, 0x3d, 0x3c, 0x23, 0x22, 0x21, 0x20, 0x27, 0x26, 0x25, 0x24, 0x2b, 0x2a, 0x29, 0x28, 0x2f, 0x2e, 0x2d, 0x2c,
                    0x13, 0x12, 0x11, 0x10, 0x17, 0x16, 0x15, 0x14, 0x1b, 0x1a, 0x19, 0x18, 0x1f, 0x1e, 0x1d, 0x1c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c },
            { 0x47, 0x44, 0x45, 0x42, 0x43, 0x40, 0x41, 0x4e, 0x4f, 0x4c, 0x4d, 0x4a, 0x4b, 0x48, 0x49, 0x56, 0x57, 0x54, 0x55, 0x52, 0x53, 0x50, 0x51, 0x5e, 0x5f, 0x5c, 0x67, 0x64, 0x65, 0x62, 0x63, 0x60, 0x61, 0x6e, 0x6f, 0x6c, 0x6d, 0x6a, 0x6b, 0x68,
                    0x69, 0x76, 0x77, 0x74, 0x75, 0x72, 0x73, 0x70, 0x71, 0x7e, 0x7f, 0x7c, 0x16, 0x17, 0x14, 0x15, 0x12, 0x13, 0x10, 0x11, 0x1e, 0x1f, 0x06, 0x58, 0x46, 0x07, 0x66, 0x05, 0x02, 0x03, 0x78, 0x00, 0x0c, 0x0e, 0x0f, 0x79, 0x0b, 0x0d, 0x1b,
                    0x5d, 0x7d, 0x5b, 0x7b, 0x5a, 0x7a, 0x1c, 0x1d, 0x04, 0x01, 0x1a, 0x0a, 0x18, 0x08, 0x19, 0x09, 0x87, 0x84, 0x85, 0x82, 0x83, 0x80, 0x81, 0x8e, 0x8f, 0x8c, 0x8d, 0x8a, 0x88, 0x89, 0x96, 0x97, 0x94, 0x95, 0x92, 0x93, 0x90, 0x91, 0x9e,
                    0x9f, 0x9c, 0x9d, 0x9a, 0x9b, 0x98, 0x99, 0xe6, 0xe7, 0xe4, 0xe5, 0xe2, 0xe3, 0xe0, 0xe1, 0xee, 0xef, 0xec, 0xed, 0xea, 0xeb, 0xe8, 0xe9, 0xf6, 0xf7, 0xf4, 0xf5, 0xf2, 0xf3, 0xf0, 0xf1, 0xfe, 0xff, 0xfc, 0xfd, 0xfa, 0xfb, 0xf8, 0xf9,
                    0xc6, 0xc7, 0xc4, 0xc5, 0xc2, 0xc3, 0xc0, 0xc1, 0xce, 0xcf, 0xcc, 0xcd, 0xca, 0xcb, 0xc8, 0xc9, 0xd6, 0xd7, 0xd4, 0xd5, 0xd2, 0xd3, 0xd0, 0xd1, 0xde, 0xdf, 0xdc, 0xdd, 0xda, 0xdb, 0xd8, 0xd9 },
            { 0xe0, 0xe3, 0xe2, 0xe5, 0xe4, 0xe7, 0xe6, 0xe9, 0xe8, 0xeb, 0xea, 0xed, 0xec, 0xef, 0xee, 0xf1, 0xf0, 0xf3, 0xf2, 0xf5, 0xf4, 0xf7, 0xf6, 0xf9, 0xf8, 0xfb, 0xc0, 0xc3, 0xc2, 0xc5, 0xc4, 0xc7, 0xc6, 0xc9, 0xc8, 0xcb, 0xca, 0xcd, 0xcc, 0xcf,
                    0xce, 0xd1, 0xd0, 0xd3, 0xd2, 0xd5, 0xd4, 0xd7, 0xd6, 0xd9, 0xd8, 0xdb, 0xb1, 0xb0, 0xb3, 0xb2, 0xb5, 0xb4, 0xb7, 0xb6, 0xb9, 0xb8, 0xa1, 0xff, 0xe1, 0xa0, 0xc1, 0xa2, 0xa5, 0xa4, 0xdf, 0xa7, 0xab, 0xa9, 0xa8, 0xde, 0xac, 0xaa, 0xbc,
                    0xfa, 0xda, 0xfc, 0xdc, 0xfd, 0xdd, 0xbb, 0xba, 0xa3, 0xa6, 0xbd, 0xad, 0xbf, 0xaf, 0xbe, 0xae, 0x20, 0x23, 0x22, 0x25, 0x24, 0x27, 0x26, 0x29, 0x28, 0x2b, 0x2a, 0x2d, 0x2f, 0x2e, 0x31, 0x30, 0x33, 0x32, 0x35, 0x34, 0x37, 0x36, 0x39,
                    0x38, 0x3b, 0x3a, 0x3d, 0x3c, 0x3f, 0x3e, 0x41, 0x40, 0x43, 0x42, 0x45, 0x44, 0x47, 0x46, 0x49, 0x48, 0x4b, 0x4a, 0x4d, 0x4c, 0x4f, 0x4e, 0x51, 0x50, 0x53, 0x52, 0x55, 0x54, 0x57, 0x56, 0x59, 0x58, 0x5b, 0x5a, 0x5d, 0x5c, 0x5f, 0x5e,
                    0x61, 0x60, 0x63, 0x62, 0x65, 0x64, 0x67, 0x66, 0x69, 0x68, 0x6b, 0x6a, 0x6d, 0x6c, 0x6f, 0x6e, 0x71, 0x70, 0x73, 0x72, 0x75, 0x74, 0x77, 0x76, 0x79, 0x78, 0x7b, 0x7a, 0x7d, 0x7c, 0x7f, 0x7e },
            { 0xa5, 0xa6, 0xa7, 0xa0, 0xa1, 0xa2, 0xa3, 0xac, 0xad, 0xae, 0xaf, 0xa8, 0xa9, 0xaa, 0xab, 0xb4, 0xb5, 0xb6, 0xb7, 0xb0, 0xb1, 0xb2, 0xb3, 0xbc, 0xbd, 0xbe, 0x85, 0x86, 0x87, 0x80, 0x81, 0x82, 0x83, 0x8c, 0x8d, 0x8e, 0x8f, 0x88, 0x89, 0x8a,
                    0x8b, 0x94, 0x95, 0x96, 0x97, 0x90, 0x91, 0x92, 0x93, 0x9c, 0x9d, 0x9e, 0xf4, 0xf5, 0xf6, 0xf7, 0xf0, 0xf1, 0xf2, 0xf3, 0xfc, 0xfd, 0xe4, 0xba, 0xa4, 0xe5, 0x84, 0xe7, 0xe0, 0xe1, 0x9a, 0xe2, 0xee, 0xec, 0xed, 0x9b, 0xe9, 0xef, 0xf9,
                    0xbf, 0x9f, 0xb9, 0x99, 0xb8, 0x98, 0xfe, 0xff, 0xe6, 0xe3, 0xf8, 0xe8, 0xfa, 0xea, 0xfb, 0xeb, 0x65, 0x66, 0x67, 0x60, 0x61, 0x62, 0x63, 0x6c, 0x6d, 0x6e, 0x6f, 0x68, 0x6a, 0x6b, 0x74, 0x75, 0x76, 0x77, 0x70, 0x71, 0x72, 0x73, 0x7c,
                    0x7d, 0x7e, 0x7f, 0x78, 0x79, 0x7a, 0x7b, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x14, 0x15, 0x16, 0x17, 0x10, 0x11, 0x12, 0x13, 0x1c, 0x1d, 0x1e, 0x1f, 0x18, 0x19, 0x1a, 0x1b,
                    0x24, 0x25, 0x26, 0x27, 0x20, 0x21, 0x22, 0x23, 0x2c, 0x2d, 0x2e, 0x2f, 0x28, 0x29, 0x2a, 0x2b, 0x34, 0x35, 0x36, 0x37, 0x30, 0x31, 0x32, 0x33, 0x3c, 0x3d, 0x3e, 0x3f, 0x38, 0x39, 0x3a, 0x3b },
            { 0x58, 0x5b, 0x5a, 0x5d, 0x5c, 0x5f, 0x5e, 0x51, 0x50, 0x53, 0x52, 0x55, 0x54, 0x57, 0x56, 0x49, 0x48, 0x4b, 0x4a, 0x4d, 0x4c, 0x4f, 0x4e, 0x41, 0x40, 0x43, 0x78, 0x7b, 0x7a, 0x7d, 0x7c, 0x7f, 0x7e, 0x71, 0x70, 0x73, 0x72, 0x75, 0x74, 0x77,
                    0x76, 0x69, 0x68, 0x6b, 0x6a, 0x6d, 0x6c, 0x6f, 0x6e, 0x61, 0x60, 0x63, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01, 0x00, 0x19, 0x47, 0x59, 0x18, 0x79, 0x1a, 0x1d, 0x1c, 0x67, 0x1f, 0x13, 0x11, 0x10, 0x66, 0x14, 0x12, 0x04,
                    0x42, 0x62, 0x44, 0x64, 0x45, 0x65, 0x03, 0x02, 0x1b, 0x1e, 0x05, 0x15, 0x07, 0x17, 0x06, 0x16, 0x98, 0x9b, 0x9a, 0x9d, 0x9c, 0x9f, 0x9e, 0x91, 0x90, 0x93, 0x92, 0x95, 0x97, 0x96, 0x89, 0x88, 0x8b, 0x8a, 0x8d, 0x8c, 0x8f, 0x8e, 0x81,
                    0x80, 0x83, 0x82, 0x85, 0x84, 0x87, 0x86, 0xf9, 0xf8, 0xfb, 0xfa, 0xfd, 0xfc, 0xff, 0xfe, 0xf1, 0xf0, 0xf3, 0xf2, 0xf5, 0xf4, 0xf7, 0xf6, 0xe9, 0xe8, 0xeb, 0xea, 0xed, 0xec, 0xef, 0xee, 0xe1, 0xe0, 0xe3, 0xe2, 0xe5, 0xe4, 0xe7, 0xe6,
                    0xd9, 0xd8, 0xdb, 0xda, 0xdd, 0xdc, 0xdf, 0xde, 0xd1, 0xd0, 0xd3, 0xd2, 0xd5, 0xd4, 0xd7, 0xd6, 0xc9, 0xc8, 0xcb, 0xca, 0xcd, 0xcc, 0xcf, 0xce, 0xc1, 0xc0, 0xc3, 0xc2, 0xc5, 0xc4, 0xc7, 0xc6 },
            { 0xe7, 0xe4, 0xe5, 0xe2, 0xe3, 0xe0, 0xe1, 0xee, 0xef, 0xec, 0xed, 0xea, 0xeb, 0xe8, 0xe9, 0xf6, 0xf7, 0xf4, 0xf5, 0xf2, 0xf3, 0xf0, 0xf1, 0xfe, 0xff, 0xfc, 0xc7, 0xc4, 0xc5, 0xc2, 0xc3, 0xc0, 0xc1, 0xce, 0xcf, 0xcc, 0xcd, 0xca, 0xcb, 0xc8,
                    0xc9, 0xd6, 0xd7, 0xd4, 0xd5, 0xd2, 0xd3, 0xd0, 0xd1, 0xde, 0xdf, 0xdc, 0xb6, 0xb7, 0xb4, 0xb5, 0xb2, 0xb3, 0xb0, 0xb1, 0xbe, 0xbf, 0xa6, 0xf8, 0xe6, 0xa7, 0xc6, 0xa5, 0xa2, 0xa3, 0xd8, 0xa0, 0xac, 0xae, 0xaf, 0xd9, 0xab, 0xad, 0xbb,
                    0xfd, 0xdd, 0xfb, 0xdb, 0xfa, 0xda, 0xbc, 0xbd, 0xa4, 0xa1, 0xba, 0xaa, 0xb8, 0xa8, 0xb9, 0xa9, 0x27, 0x24, 0x25, 0x22, 0x23, 0x20, 0x21, 0x2e, 0x2f, 0x2c, 0x2d, 0x2a, 0x28, 0x29, 0x36, 0x37, 0x34, 0x35, 0x32, 0x33, 0x30, 0x31, 0x3e,
                    0x3f, 0x3c, 0x3d, 0x3a, 0x3b, 0x38, 0x39, 0x46, 0x47, 0x44, 0x45, 0x42, 0x43, 0x40, 0x41, 0x4e, 0x4f, 0x4c, 0x4d, 0x4a, 0x4b, 0x48, 0x49, 0x56, 0x57, 0x54, 0x55, 0x52, 0x53, 0x50, 0x51, 0x5e, 0x5f, 0x5c, 0x5d, 0x5a, 0x5b, 0x58, 0x59,
                    0x66, 0x67, 0x64, 0x65, 0x62, 0x63, 0x60, 0x61, 0x6e, 0x6f, 0x6c, 0x6d, 0x6a, 0x6b, 0x68, 0x69, 0x76, 0x77, 0x74, 0x75, 0x72, 0x73, 0x70, 0x71, 0x7e, 0x7f, 0x7c, 0x7d, 0x7a, 0x7b, 0x78, 0x79 },
            { 0xba, 0xb9, 0xb8, 0xbf, 0xbe, 0xbd, 0xbc, 0xb3, 0xb2, 0xb1, 0xb0, 0xb7, 0xb6, 0xb5, 0xb4, 0xab, 0xaa, 0xa9, 0xa8, 0xaf, 0xae, 0xad, 0xac, 0xa3, 0xa2, 0xa1, 0x9a, 0x99, 0x98, 0x9f, 0x9e, 0x9d, 0x9c, 0x93, 0x92, 0x91, 0x90, 0x97, 0x96, 0x95,
                    0x94, 0x8b, 0x8a, 0x89, 0x88, 0x8f, 0x8e, 0x8d, 0x8c, 0x83, 0x82, 0x81, 0xeb, 0xea, 0xe9, 0xe8, 0xef, 0xee, 0xed, 0xec, 0xe3, 0xe2, 0xfb, 0xa5, 0xbb, 0xfa, 0x9b, 0xf8, 0xff, 0xfe, 0x85, 0xfd, 0xf1, 0xf3, 0xf2, 0x84, 0xf6, 0xf0, 0xe6,
                    0xa0, 0x80, 0xa6, 0x86, 0xa7, 0x87, 0xe1, 0xe0, 0xf9, 0xfc, 0xe7, 0xf7, 0xe5, 0xf5, 0xe4, 0xf4, 0x7a, 0x79, 0x78, 0x7f, 0x7e, 0x7d, 0x7c, 0x73, 0x72, 0x71, 0x70, 0x77, 0x75, 0x74, 0x6b, 0x6a, 0x69, 0x68, 0x6f, 0x6e, 0x6d, 0x6c, 0x63,
                    0x62, 0x61, 0x60, 0x67, 0x66, 0x65, 0x64, 0x1b, 0x1a, 0x19, 0x18, 0x1f, 0x1e, 0x1d, 0x1c, 0x13, 0x12, 0x11, 0x10, 0x17, 0x16, 0x15, 0x14, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04,
                    0x3b, 0x3a, 0x39, 0x38, 0x3f, 0x3e, 0x3d, 0x3c, 0x33, 0x32, 0x31, 0x30, 0x37, 0x36, 0x35, 0x34, 0x2b, 0x2a, 0x29, 0x28, 0x2f, 0x2e, 0x2d, 0x2c, 0x23, 0x22, 0x21, 0x20, 0x27, 0x26, 0x25, 0x24 },
            { 0xf3, 0xf0, 0xf1, 0xf6, 0xf7, 0xf4, 0xf5, 0xfa, 0xfb, 0xf8, 0xf9, 0xfe, 0xff, 0xfc, 0xfd, 0xe2, 0xe3, 0xe0, 0xe1, 0xe6, 0xe7, 0xe4, 0xe5, 0xea, 0xeb, 0xe8, 0xd3, 0xd0, 0xd1, 0xd6, 0xd7, 0xd4, 0xd5, 0xda, 0xdb, 0xd8, 0xd9, 0xde, 0xdf, 0xdc,
                    0xdd, 0xc2, 0xc3, 0xc0, 0xc1, 0xc6, 0xc7, 0xc4, 0xc5, 0xca, 0xcb, 0xc8, 0xa2, 0xa3, 0xa0, 0xa1, 0xa6, 0xa7, 0xa4, 0xa5, 0xaa, 0xab, 0xb2, 0xec, 0xf2, 0xb3, 0xd2, 0xb1, 0xb6, 0xb7, 0xcc, 0xb4, 0xb8, 0xba, 0xbb, 0xcd, 0xbf, 0xb9, 0xaf,
                    0xe9, 0xc9, 0xef, 0xcf, 0xee, 0xce, 0xa8, 0xa9, 0xb0, 0xb5, 0xae, 0xbe, 0xac, 0xbc, 0xad, 0xbd, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35, 0x3a, 0x3b, 0x38, 0x39, 0x3e, 0x3c, 0x3d, 0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25, 0x2a,
                    0x2b, 0x28, 0x29, 0x2e, 0x2f, 0x2c, 0x2d, 0x52, 0x53, 0x50, 0x51, 0x56, 0x57, 0x54, 0x55, 0x5a, 0x5b, 0x58, 0x59, 0x5e, 0x5f, 0x5c, 0x5d, 0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45, 0x4a, 0x4b, 0x48, 0x49, 0x4e, 0x4f, 0x4c, 0x4d,
                    0x72, 0x73, 0x70, 0x71, 0x76, 0x77, 0x74, 0x75, 0x7a, 0x7b, 0x78, 0x79, 0x7e, 0x7f, 0x7c, 0x7d, 0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x6a, 0x6b, 0x68, 0x69, 0x6e, 0x6f, 0x6c, 0x6d },
            { 0x10, 0x13, 0x12, 0x15, 0x14, 0x17, 0x16, 0x19, 0x18, 0x1b, 0x1a, 0x1d, 0x1c, 0x1f, 0x1e, 0x01, 0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x09, 0x08, 0x0b, 0x30, 0x33, 0x32, 0x35, 0x34, 0x37, 0x36, 0x39, 0x38, 0x3b, 0x3a, 0x3d, 0x3c, 0x3f,
                    0x3e, 0x21, 0x20, 0x23, 0x22, 0x25, 0x24, 0x27, 0x26, 0x29, 0x28, 0x2b, 0x41, 0x40, 0x43, 0x42, 0x45, 0x44, 0x47, 0x46, 0x49, 0x48, 0x51, 0x0f, 0x11, 0x50, 0x31, 0x52, 0x55, 0x54, 0x2f, 0x57, 0x5b, 0x59, 0x58, 0x2e, 0x5c, 0x5a, 0x4c,
                    0x0a, 0x2a, 0x0c, 0x2c, 0x0d, 0x2d, 0x4b, 0x4a, 0x53, 0x56, 0x4d, 0x5d, 0x4f, 0x5f, 0x4e, 0x5e, 0xd0, 0xd3, 0xd2, 0xd5, 0xd4, 0xd7, 0xd6, 0xd9, 0xd8, 0xdb, 0xda, 0xdd, 0xdf, 0xde, 0xc1, 0xc0, 0xc3, 0xc2, 0xc5, 0xc4, 0xc7, 0xc6, 0xc9,
                    0xc8, 0xcb, 0xca, 0xcd, 0xcc, 0xcf, 0xce, 0xb1, 0xb0, 0xb3, 0xb2, 0xb5, 0xb4, 0xb7, 0xb6, 0xb9, 0xb8, 0xbb, 0xba, 0xbd, 0xbc, 0xbf, 0xbe, 0xa1, 0xa0, 0xa3, 0xa2, 0xa5, 0xa4, 0xa7, 0xa6, 0xa9, 0xa8, 0xab, 0xaa, 0xad, 0xac, 0xaf, 0xae,
                    0x91, 0x90, 0x93, 0x92, 0x95, 0x94, 0x97, 0x96, 0x99, 0x98, 0x9b, 0x9a, 0x9d, 0x9c, 0x9f, 0x9e, 0x81, 0x80, 0x83, 0x82, 0x85, 0x84, 0x87, 0x86, 0x89, 0x88, 0x8b, 0x8a, 0x8d, 0x8c, 0x8f, 0x8e },
            { 0xc2, 0xc1, 0xc0, 0xc7, 0xc6, 0xc5, 0xc4, 0xcb, 0xca, 0xc9, 0xc8, 0xcf, 0xce, 0xcd, 0xcc, 0xd3, 0xd2, 0xd1, 0xd0, 0xd7, 0xd6, 0xd5, 0xd4, 0xdb, 0xda, 0xd9, 0xe2, 0xe1, 0xe0, 0xe7, 0xe6, 0xe5, 0xe4, 0xeb, 0xea, 0xe9, 0xe8, 0xef, 0xee, 0xed,
                    0xec, 0xf3, 0xf2, 0xf1, 0xf0, 0xf7, 0xf6, 0xf5, 0xf4, 0xfb, 0xfa, 0xf9, 0x93, 0x92, 0x91, 0x90, 0x97, 0x96, 0x95, 0x94, 0x9b, 0x9a, 0x83, 0xdd, 0xc3, 0x82, 0xe3, 0x80, 0x87, 0x86, 0xfd, 0x85, 0x89, 0x8b, 0x8a, 0xfc, 0x8e, 0x88, 0x9e,
                    0xd8, 0xf8, 0xde, 0xfe, 0xdf, 0xff, 0x99, 0x98, 0x81, 0x84, 0x9f, 0x8f, 0x9d, 0x8d, 0x9c, 0x8c, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0d, 0x0c, 0x13, 0x12, 0x11, 0x10, 0x17, 0x16, 0x15, 0x14, 0x1b,
                    0x1a, 0x19, 0x18, 0x1f, 0x1e, 0x1d, 0x1c, 0x63, 0x62, 0x61, 0x60, 0x67, 0x66, 0x65, 0x64, 0x6b, 0x6a, 0x69, 0x68, 0x6f, 0x6e, 0x6d, 0x6c, 0x73, 0x72, 0x71, 0x70, 0x77, 0x76, 0x75, 0x74, 0x7b, 0x7a, 0x79, 0x78, 0x7f, 0x7e, 0x7d, 0x7c,
                    0x43, 0x42, 0x41, 0x40, 0x47, 0x46, 0x45, 0x44, 0x4b, 0x4a, 0x49, 0x48, 0x4f, 0x4e, 0x4d, 0x4c, 0x53, 0x52, 0x51, 0x50, 0x57, 0x56, 0x55, 0x54, 0x5b, 0x5a, 0x59, 0x58, 0x5f, 0x5e, 0x5d, 0x5c },
            { 0xd8, 0xdb, 0xda, 0xdd, 0xdc, 0xdf, 0xde, 0xd1, 0xd0, 0xd3, 0xd2, 0xd5, 0xd4, 0xd7, 0xd6, 0xc9, 0xc8, 0xcb, 0xca, 0xcd, 0xcc, 0xcf, 0xce, 0xc1, 0xc0, 0xc3, 0xf8, 0xfb, 0xfa, 0xfd, 0xfc, 0xff, 0xfe, 0xf1, 0xf0, 0xf3, 0xf2, 0xf5, 0xf4, 0xf7,
                    0xf6, 0xe9, 0xe8, 0xeb, 0xea, 0xed, 0xec, 0xef, 0xee, 0xe1, 0xe0, 0xe3, 0x89, 0x88, 0x8b, 0x8a, 0x8d, 0x8c, 0x8f, 0x8e, 0x81, 0x80, 0x99, 0xc7, 0xd9, 0x98, 0xf9, 0x9a, 0x9d, 0x9c, 0xe7, 0x9f, 0x93, 0x91, 0x90, 0xe6, 0x94, 0x92, 0x84,
                    0xc2, 0xe2, 0xc4, 0xe4, 0xc5, 0xe5, 0x83, 0x82, 0x9b, 0x9e, 0x85, 0x95, 0x87, 0x97, 0x86, 0x96, 0x18, 0x1b, 0x1a, 0x1d, 0x1c, 0x1f, 0x1e, 0x11, 0x10, 0x13, 0x12, 0x15, 0x17, 0x16, 0x09, 0x08, 0x0b, 0x0a, 0x0d, 0x0c, 0x0f, 0x0e, 0x01,
                    0x00, 0x03, 0x02, 0x05, 0x04, 0x07, 0x06, 0x79, 0x78, 0x7b, 0x7a, 0x7d, 0x7c, 0x7f, 0x7e, 0x71, 0x70, 0x73, 0x72, 0x75, 0x74, 0x77, 0x76, 0x69, 0x68, 0x6b, 0x6a, 0x6d, 0x6c, 0x6f, 0x6e, 0x61, 0x60, 0x63, 0x62, 0x65, 0x64, 0x67, 0x66,
                    0x59, 0x58, 0x5b, 0x5a, 0x5d, 0x5c, 0x5f, 0x5e, 0x51, 0x50, 0x53, 0x52, 0x55, 0x54, 0x57, 0x56, 0x49, 0x48, 0x4b, 0x4a, 0x4d, 0x4c, 0x4f, 0x4e, 0x41, 0x40, 0x43, 0x42, 0x45, 0x44, 0x47, 0x46 },
            { 0x87, 0x84, 0x85, 0x82, 0x83, 0x80, 0x81, 0x8e, 0x8f, 0x8c, 0x8d, 0x8a, 0x8b, 0x88, 0x89, 0x96, 0x97, 0x94, 0x95, 0x92, 0x93, 0x90, 0x91, 0x9e, 0x9f, 0x9c, 0xa7, 0xa4, 0xa5, 0xa2, 0xa3, 0xa0, 0xa1, 0xae, 0xaf, 0xac, 0xad, 0xaa, 0xab, 0xa8,
                    0xa9, 0xb6, 0xb7, 0xb4, 0xb5, 0xb2, 0xb3, 0xb0, 0xb1, 0xbe, 0xbf, 0xbc, 0xd6, 0xd7, 0xd4, 0xd5, 0xd2, 0xd3, 0xd0, 0xd1, 0xde, 0xdf, 0xc6, 0x98, 0x86, 0xc7, 0xa6, 0xc5, 0xc2, 0xc3, 0xb8, 0xc0, 0xcc, 0xce, 0xcf, 0xb9, 0xcb, 0xcd, 0xdb,
                    0x9d, 0xbd, 0x9b, 0xbb, 0x9a, 0xba, 0xdc, 0xdd, 0xc4, 0xc1, 0xda, 0xca, 0xd8, 0xc8, 0xd9, 0xc9, 0x47, 0x44, 0x45, 0x42, 0x43, 0x40, 0x41, 0x4e, 0x4f, 0x4c, 0x4d, 0x4a, 0x48, 0x49, 0x56, 0x57, 0x54, 0x55, 0x52, 0x53, 0x50, 0x51, 0x5e,
                    0x5f, 0x5c, 0x5d, 0x5a, 0x5b, 0x58, 0x59, 0x26, 0x27, 0x24, 0x25, 0x22, 0x23, 0x20, 0x21, 0x2e, 0x2f, 0x2c, 0x2d, 0x2a, 0x2b, 0x28, 0x29, 0x36, 0x37, 0x34, 0x35, 0x32, 0x33, 0x30, 0x31, 0x3e, 0x3f, 0x3c, 0x3d, 0x3a, 0x3b, 0x38, 0x39,
                    0x06, 0x07, 0x04, 0x05, 0x02, 0x03, 0x00, 0x01, 0x0e, 0x0f, 0x0c, 0x0d, 0x0a, 0x0b, 0x08, 0x09, 0x16, 0x17, 0x14, 0x15, 0x12, 0x13, 0x10, 0x11, 0x1e, 0x1f, 0x1c, 0x1d, 0x1a, 0x1b, 0x18, 0x19 },
            { 0x32, 0x31, 0x30, 0x37, 0x36, 0x35, 0x34, 0x3b, 0x3a, 0x39, 0x38, 0x3f, 0x3e, 0x3d, 0x3c, 0x23, 0x22, 0x21, 0x20, 0x27, 0x26, 0x25, 0x24, 0x2b, 0x2a, 0x29, 0x12, 0x11, 0x10, 0x17, 0x16, 0x15, 0x14, 0x1b, 0x1a, 0x19, 0x18, 0x1f, 0x1e, 0x1d,
                    0x1c, 0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x63, 0x62, 0x61, 0x60, 0x67, 0x66, 0x65, 0x64, 0x6b, 0x6a, 0x73, 0x2d, 0x33, 0x72, 0x13, 0x70, 0x77, 0x76, 0x0d, 0x75, 0x79, 0x7b, 0x7a, 0x0c, 0x7e, 0x78, 0x6e,
                    0x28, 0x08, 0x2e, 0x0e, 0x2f, 0x0f, 0x69, 0x68, 0x71, 0x74, 0x6f, 0x7f, 0x6d, 0x7d, 0x6c, 0x7c, 0xf2, 0xf1, 0xf0, 0xf7, 0xf6, 0xf5, 0xf4, 0xfb, 0xfa, 0xf9, 0xf8, 0xff, 0xfd, 0xfc, 0xe3, 0xe2, 0xe1, 0xe0, 0xe7, 0xe6, 0xe5, 0xe4, 0xeb,
                    0xea, 0xe9, 0xe8, 0xef, 0xee, 0xed, 0xec, 0x93, 0x92, 0x91, 0x90, 0x97, 0x96, 0x95, 0x94, 0x9b, 0x9a, 0x99, 0x98, 0x9f, 0x9e, 0x9d, 0x9c, 0x83, 0x82, 0x81, 0x80, 0x87, 0x86, 0x85, 0x84, 0x8b, 0x8a, 0x89, 0x88, 0x8f, 0x8e, 0x8d, 0x8c,
                    0xb3, 0xb2, 0xb1, 0xb0, 0xb7, 0xb6, 0xb5, 0xb4, 0xbb, 0xba, 0xb9, 0xb8, 0xbf, 0xbe, 0xbd, 0xbc, 0xa3, 0xa2, 0xa1, 0xa0, 0xa7, 0xa6, 0xa5, 0xa4, 0xab, 0xaa, 0xa9, 0xa8, 0xaf, 0xae, 0xad, 0xac },
            { 0x1b, 0x18, 0x19, 0x1e, 0x1f, 0x1c, 0x1d, 0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d, 0x02, 0x03, 0x00, 0x3b, 0x38, 0x39, 0x3e, 0x3f, 0x3c, 0x3d, 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34,
                    0x35, 0x2a, 0x2b, 0x28, 0x29, 0x2e, 0x2f, 0x2c, 0x2d, 0x22, 0x23, 0x20, 0x4a, 0x4b, 0x48, 0x49, 0x4e, 0x4f, 0x4c, 0x4d, 0x42, 0x43, 0x5a, 0x04, 0x1a, 0x5b, 0x3a, 0x59, 0x5e, 0x5f, 0x24, 0x5c, 0x50, 0x52, 0x53, 0x25, 0x57, 0x51, 0x47,
                    0x01, 0x21, 0x07, 0x27, 0x06, 0x26, 0x40, 0x41, 0x58, 0x5d, 0x46, 0x56, 0x44, 0x54, 0x45, 0x55, 0xdb, 0xd8, 0xd9, 0xde, 0xdf, 0xdc, 0xdd, 0xd2, 0xd3, 0xd0, 0xd1, 0xd6, 0xd4, 0xd5, 0xca, 0xcb, 0xc8, 0xc9, 0xce, 0xcf, 0xcc, 0xcd, 0xc2,
                    0xc3, 0xc0, 0xc1, 0xc6, 0xc7, 0xc4, 0xc5, 0xba, 0xbb, 0xb8, 0xb9, 0xbe, 0xbf, 0xbc, 0xbd, 0xb2, 0xb3, 0xb0, 0xb1, 0xb6, 0xb7, 0xb4, 0xb5, 0xaa, 0xab, 0xa8, 0xa9, 0xae, 0xaf, 0xac, 0xad, 0xa2, 0xa3, 0xa0, 0xa1, 0xa6, 0xa7, 0xa4, 0xa5,
                    0x9a, 0x9b, 0x98, 0x99, 0x9e, 0x9f, 0x9c, 0x9d, 0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0x8a, 0x8b, 0x88, 0x89, 0x8e, 0x8f, 0x8c, 0x8d, 0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85 },
            { 0xf4, 0xf7, 0xf6, 0xf1, 0xf0, 0xf3, 0xf2, 0xfd, 0xfc, 0xff, 0xfe, 0xf9, 0xf8, 0xfb, 0xfa, 0xe5, 0xe4, 0xe7, 0xe6, 0xe1, 0xe0, 0xe3, 0xe2, 0xed, 0xec, 0xef, 0xd4, 0xd7, 0xd6, 0xd1, 0xd0, 0xd3, 0xd2, 0xdd, 0xdc, 0xdf, 0xde, 0xd9, 0xd8, 0xdb,
                    0xda, 0xc5, 0xc4, 0xc7, 0xc6, 0xc1, 0xc0, 0xc3, 0xc2, 0xcd, 0xcc, 0xcf, 0xa5, 0xa4, 0xa7, 0xa6, 0xa1, 0xa0, 0xa3, 0xa2, 0xad, 0xac, 0xb5, 0xeb, 0xf5, 0xb4, 0xd5, 0xb6, 0xb1, 0xb0, 0xcb, 0xb3, 0xbf, 0xbd, 0xbc, 0xca, 0xb8, 0xbe, 0xa8,
                    0xee, 0xce, 0xe8, 0xc8, 0xe9, 0xc9, 0xaf, 0xae, 0xb7, 0xb2, 0xa9, 0xb9, 0xab, 0xbb, 0xaa, 0xba, 0x34, 0x37, 0x36, 0x31, 0x30, 0x33, 0x32, 0x3d, 0x3c, 0x3f, 0x3e, 0x39, 0x3b, 0x3a, 0x25, 0x24, 0x27, 0x26, 0x21, 0x20, 0x23, 0x22, 0x2d,
                    0x2c, 0x2f, 0x2e, 0x29, 0x28, 0x2b, 0x2a, 0x55, 0x54, 0x57, 0x56, 0x51, 0x50, 0x53, 0x52, 0x5d, 0x5c, 0x5f, 0x5e, 0x59, 0x58, 0x5b, 0x5a, 0x45, 0x44, 0x47, 0x46, 0x41, 0x40, 0x43, 0x42, 0x4d, 0x4c, 0x4f, 0x4e, 0x49, 0x48, 0x4b, 0x4a,
                    0x75, 0x74, 0x77, 0x76, 0x71, 0x70, 0x73, 0x72, 0x7d, 0x7c, 0x7f, 0x7e, 0x79, 0x78, 0x7b, 0x7a, 0x65, 0x64, 0x67, 0x66, 0x61, 0x60, 0x63, 0x62, 0x6d, 0x6c, 0x6f, 0x6e, 0x69, 0x68, 0x6b, 0x6a },
            { 0x1d, 0x1e, 0x1f, 0x18, 0x19, 0x1a, 0x1b, 0x14, 0x15, 0x16, 0x17, 0x10, 0x11, 0x12, 0x13, 0x0c, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0a, 0x0b, 0x04, 0x05, 0x06, 0x3d, 0x3e, 0x3f, 0x38, 0x39, 0x3a, 0x3b, 0x34, 0x35, 0x36, 0x37, 0x30, 0x31, 0x32,
                    0x33, 0x2c, 0x2d, 0x2e, 0x2f, 0x28, 0x29, 0x2a, 0x2b, 0x24, 0x25, 0x26, 0x4c, 0x4d, 0x4e, 0x4f, 0x48, 0x49, 0x4a, 0x4b, 0x44, 0x45, 0x5c, 0x02, 0x1c, 0x5d, 0x3c, 0x5f, 0x58, 0x59, 0x22, 0x5a, 0x56, 0x54, 0x55, 0x23, 0x51, 0x57, 0x41,
                    0x07, 0x27, 0x01, 0x21, 0x00, 0x20, 0x46, 0x47, 0x5e, 0x5b, 0x40, 0x50, 0x42, 0x52, 0x43, 0x53, 0xdd, 0xde, 0xdf, 0xd8, 0xd9, 0xda, 0xdb, 0xd4, 0xd5, 0xd6, 0xd7, 0xd0, 0xd2, 0xd3, 0xcc, 0xcd, 0xce, 0xcf, 0xc8, 0xc9, 0xca, 0xcb, 0xc4,
                    0xc5, 0xc6, 0xc7, 0xc0, 0xc1, 0xc2, 0xc3, 0xbc, 0xbd, 0xbe, 0xbf, 0xb8, 0xb9, 0xba, 0xbb, 0xb4, 0xb5, 0xb6, 0xb7, 0xb0, 0xb1, 0xb2, 0xb3, 0xac, 0xad, 0xae, 0xaf, 0xa8, 0xa9, 0xaa, 0xab, 0xa4, 0xa5, 0xa6, 0xa7, 0xa0, 0xa1, 0xa2, 0xa3,
                    0x9c, 0x9d, 0x9e, 0x9f, 0x98, 0x99, 0x9a, 0x9b, 0x94, 0x95, 0x96, 0x97, 0x90, 0x91, 0x92, 0x93, 0x8c, 0x8d, 0x8e, 0x8f, 0x88, 0x89, 0x8a, 0x8b, 0x84, 0x85, 0x86, 0x87, 0x80, 0x81, 0x82, 0x83 } };
}