• Tidak ada hasil yang ditemukan

D. Significance of Tess2Speech

VII. Conclusions 90

Tess2Speech is an Intelligent Character Recognition Android application which can recognize both computer-typed and non-cursive handwritten texts and convert it to either text or speech. With the help of Tess2Speech Trainer, which is a desktop application, Tess2Speech is re-trainable and can be personalized by the users with minimal effort.

Tess2Speech is developed to provide the speech impaired a way to commu- nicate, and also to provide researchers a free, open-source, non-proprietary ICR which is trainable.

This application also proves that Tesseract is indeed trainable for handwritten texts. Although, it is only limited to non-cursive handwritten texts since Tesseract relies on segmentation of characters. Because of this, it can be said that it is almost impossible to recognize cursive texts using Tesseract.

The development of this application also helped to determine the limitations and capabilities of Tesseract, and what training methods and configurations are effective for achieving high accuracy with Tesseract.

This application is currently at its Beta stage. Once it gains popularity, differ-

ent users and researchers may collaborate to improve the trained data for hand-

writing until such time that they create a generalized trained data for most, if not

all, handwritten texts.

VIII. Recommendations

It is suggested that in order to further improve the accuracy of Tess2Speech’

handwriting recognition, a higher number of sample handwritings (n-users) should be used. A higher number of characters and words are also suggested when creating training datasets.

Improving the canvas functionality of Tess2Speech that can rival Galaxy Note’s can greatly improve the accuracy of Tess2Speech when recognizing handwritten texts on the phone’s screen.

One of the main reason why the accuracy of Tesseract drops is because of image noises. Using open-source libraries for image pre-processing or developing an algorithm that can greatly reduce image noises can drastically improve Tesser- act’s accuracy. Such algorithms are adaptive thresholding and applying different binarization techniques.

Another improvement would be finding a way to train Tesseract in a smart phone so that Tess2Speech Trainer will not be needed. It can open a possibilty for Tesseract to learn handwritings dynamically without user intervention.

Adding functionality like language translator can also add usability to Tess2Speech.

Lastly, if there is an open-source OCR Engine which is better than Tesseract, you

can completely replace the OCR engine of this application.

IX. Bibliography

[1] P. Christensson, “Character Encoding Definition.” http://techterms.com, September 2010.

[2] K. Kumar.K, M. V. S. Muvvala, P. S. D. Sruthi, and P. Dinesh, “Intelligent Character Recognition (ICR): A Novel Algorithm to Extract Text from a Scanned Form Based Image,” International Journal of Advanced Trends in Computer Science and Engineering, vol. 2, no. 6, pp. 47–55, 2013.

[3] S. Rakshit and S. Basu, “Development of a Multi-User Handwriting Recog- nition System Using Tesseract Open Source OCR Engine,” PROC. Interna- tional Conference on C3IT, pp. 240–247, 2009.

[4] S. Ch, S. Mahna, and N. Kashyap, “Optical Character Recognition on Handheld Devices,” International Journal of Computer Applications IJCA, vol. 115, no. 22, pp. 10–13, 2015.

[5] Google, “Tesseract-OCR.” https://code.google.com/p/tesseract-ocr/, 2006 - 2016.

[6] Google, “Android OS.” http://www.android.com/ or http://developer.

android.com/, 2008.

[7] American Speech-Language-Hearing Association, “Aphasia.” http://www.

asha.org/public/speech/disorders/Aphasia/.

[8] Stroke Association, “Communication Aids and Computer-Based Therapy af- ter Stroke.” http://www.stroke.org.uk/, 2013.

[9] Free Press Journal, “2.5 bn smartphone users globally by 2015,” The Free Press Journal, July 2014.

[10] Stefan, “Samsung just bought 5stylus!,” Android Authority, January 2013.

[11] S. Vijiyarani and A. Sakila, “Performance Comparison of OCR Tools,” In- ternational Journal of UbiComp (IJU), vol. 6, pp. 19 – 30, July 2015.

[12] B. Verma, M. Blumenstein, and S. Kulkarni, “Recent Achievements in Off- line Handwriting Recognition Systems,”

[13] A2iA, “A2iA document reader ICR for handwritten text.”

http://www.a2ia.com/sites/default/files/product_files/a2ia_

documentreader_datasheet_en.pdf/, 2015.

[14] Y. Williams, “What is Speech impairment? - Defenitions, Causes and Charac- teristics.” http://www.a2ia.com/sites/default/files/product_files/

a2ia_documentreader_datasheet_en.pdf/.

[15] iSpeak4U, “Handyspeech.” https://itunes.apple.com/us/app/

handyspeech/id563600464?mt=8, 2014.

[16] A. Christie, “Multiple Benefits of Text to

Speech Applications.” http://www.lc2.ca/item/

85-multiple-benefits-of-text-to-speech-applications, Novem- ber 2012.

[17] A. Aparna and I. Muthumani, “Optical Character Recognition for Handwrit- ten Cursive English characters,” International Journal of Computer Science and Information Technologies (IJCSIT), vol. 5, no. 1, pp. 847 – 848, 2014.

[18] R. Smith, “An Overview of the Tesseract OCR Engine.” http:

//static.googleusercontent.com/media/research.google.com/en/

/pubs/archive/33418.pdf.

[19] S. Singh, “Optical Character Recognition Techniques: A Survey,” Journal of

Emerging Trends in Computing and Information Sciences, vol. 4, pp. 545 –

550, June 2013.

[20] S. Dhiman and A. Singh, “Tesseract Vs Gocr A Comparative Study,” In- ternational Journal of Recent Technology and Engineering (IJRTE), vol. 2, pp. 80 – 83, September 2013.

[21] M. Nayak and A. K. Nayak, “Odia Characters Recognition by Training Tesseract OCR Engine,” International Journal of Computer Applications (IJCA), pp. 25 – 30, December 2013.

[22] C. Patel, A. Patel, and D. Patel, “Optical Character Recognition by Open Source OCR Tool Tesseract: A Case Study,” International Journal of Com- puter Applications, vol. 55, pp. 50–56, October 2012.

[23] K. Ntirogiannis, “Performance Evaluation Methodology for Historical Docu- ment Image Binarization,” Institute of Electrical and Electronics Engineers (IEEE), vol. 22, pp. 595 – 609, September 2012.

[24] D. sasirekha and E. Chandra, “Text-to-Speech: A Simple Tutorial,” Interna- tional Journal of Soft Computing and Engineering (IJSCE), vol. 2, pp. 275 – 278, March 2012.

[25] R. Mithe and N. D. Supriya Indalkar, “Optical Character Recognition,” In- ternational Journal of Recent Technology and Engineering (IJRTE)), vol. 2, pp. 72 – 75, March 2013.

[26] S. Barve, “Optical Character Recognition Using Artificial Neural Network,”

International Journal of Advanced Research in Computer Engineering &

Technology), vol. 1, pp. 131 – 133, June 2012.

[27] S. Vijayarani and A. Sakila, “Performance Comparison of OCR Tools,” In- ternational Journal of UbiComp (IJU)), vol. 6, pp. 19 – 29, July 2015.

[28] R. Urbanowicz and J. Moore, “Learning Classier Systems: A Complete In-

troduction, Review, and Roadmap,” Journal of Articial Evolution and Ap-

plications, vol. 2009, June 2009.

[29] J. Brownlee, “Clever Algorithms: Nature-Inspired Programming Recipes.”

http://www.cleveralgorithms.com/nature-inspired/evolution/

learning_classifier_system.html, 2015.

[30] T. Helland, “Seven grayscale conversion.” http://www.tannerhelland.com/

3643/grayscale-image-algorithm-vb6/.

[31] B. Cigan, “Java image binarization using Otsu’s algorithm.” http:

//developer.bostjan-cigan.com/java-image-binarization/, December 2012.

[32] VietOCR, “jTessBoxEditor.” http://vietocr.sourceforge.net/

training.html, 2008 - 2016.

[33] Wutka, “Directed Acyclic Word Graphs.” http://www.wutka.com/dawg.

html.

[34] J. Gosling and et al., Java Language Specification. Java SE 8 Edition, Addison-Wesley Professional, 2014.

[35] R. Theis, “Tess-Two [Eclipse Android Library for Tesseract].” https://

github.com/rmtheis/tess-two, 2011.

[36] J. Polites, “GestureImageView.” https://github.com/jasonpolites/

gesture-imageview, 2012.

[37] ArthurHub, “Android-Image-Cropper.” https://github.com/ArthurHub/

Android-Image-Cropper/wiki, 2013.

[38] J. Zapata, “Android-pdfview.” https://github.com/JoanZapata/

android-pdfview, 2014.

[39] Google, “VuDroid.” https://code.google.com/archive/p/vudroid/.

[40] P. Siegman, “EPubLib.” https://github.com/psiegman/epublib.

[41] A. Kaloer, “Android-File-Picker-Activity.” https://github.com/

AndersKaloer/Android-File-Picker-Activity/tree/master/src/

com/kaloer/filepicker, 2011.

X. Appendix

A. Box File

A 2 8 3 3 2 0 8 3 7 2 3 3 2 9 0 A 4 4 0 3 2 1 3 5 2 9 3 3 4 3 0 A 6 0 5 3 2 2 0 6 8 9 3 3 5 3 0 A 7 6 7 3 2 2 3 8 5 7 3 3 5 3 0 A 9 3 0 3 2 4 0 1 0 1 6 3 3 6 5 0 A 1 0 9 2 3 2 5 8 1 1 8 1 3 3 7 0 0

a 1 2 8 2 3 2 6 7 1 3 7 1 3 3 3 9 0 a 1 4 1 5 3 2 6 5 1 5 1 0 3 3 3 9 0 a 1 5 5 0 3 2 6 5 1 6 4 2 3 3 4 0 0 a 1 7 0 4 3 2 7 0 1 7 8 9 3 3 4 9 0 a 1 8 4 0 3 2 8 7 1 9 2 9 3 3 5 0 0 a 1 9 9 5 3 2 8 1 2 0 8 5 3 3 5 6 0 a 2 1 2 8 3 2 8 5 2 2 1 6 3 3 5 7 0 a 2 2 7 1 3 2 9 3 2 3 5 1 3 3 5 7 0 a 2 3 8 6 3 3 0 1 2 4 7 8 3 3 7 1 0 B 2 8 7 3 0 4 2 3 6 4 3 1 6 6 0 B 4 5 4 3 0 5 2 5 2 7 3 1 6 8 0 B 6 0 9 3 0 5 9 6 8 8 3 1 7 2 0 B 7 7 3 3 0 6 9 8 6 5 3 1 8 3 0 B 9 4 6 3 0 8 3 1 0 2 9 3 2 0 3 0 B 1 1 0 9 3 0 8 3 1 1 9 5 3 2 0 5 0 b 1 2 9 9 3 1 0 1 1 3 6 9 3 2 1 4 0 b 1 4 3 4 3 0 9 3 1 5 0 6 3 2 1 7 0 b 1 5 7 3 3 0 9 8 1 6 4 1 3 2 0 5 0 b 1 7 1 1 3 0 9 4 1 7 8 0 3 2 1 1 0 b 1 8 5 1 3 0 9 6 1 9 2 5 3 2 1 0 0 b 2 0 0 1 3 0 8 6 2 0 7 2 3 2 0 6 0 b 2 1 3 7 3 0 7 2 2 2 1 3 3 2 0 0 0 b 2 2 8 2 3 0 6 7 2 3 5 4 3 1 8 1 0 b 2 4 0 7 3 0 4 8 2 4 8 7 3 1 7 7 0 C 2 7 2 2 8 5 2 3 6 0 2 9 6 7 0 C 4 4 3 2 8 5 7 5 3 0 2 9 7 3 0 C 6 0 6 2 8 5 8 6 9 0 2 9 7 8 0 C 7 7 4 2 8 6 5 8 7 0 2 9 8 5 0 C 9 4 0 2 8 6 7 1 0 3 5 2 9 9 0 0 C 1 1 0 6 2 8 7 8 1 2 0 5 2 9 9 3 0

c 1 3 0 3 2 8 9 6 1 3 7 0 2 9 6 7 0 c 1 4 3 2 2 9 0 4 1 4 9 8 2 9 7 5 0 c 1 5 6 8 2 9 1 1 1 6 3 7 2 9 8 0 0 c 1 6 9 9 2 9 0 9 1 7 7 2 2 9 8 3 0 c 1 8 3 8 2 8 9 9 1 9 0 8 2 9 7 6 0 c 1 9 8 6 2 9 0 7 2 0 5 4 2 9 7 4 0 c 2 1 3 1 2 9 1 7 2 2 0 1 2 9 8 8 0 c 2 2 7 1 2 9 2 1 2 3 4 1 2 9 8 6 0 c 2 4 0 2 2 9 1 8 2 4 8 3 2 9 8 4 0 D 2 8 5 2 6 7 5 3 5 4 2 8 0 0 0 D 4 5 4 2 6 7 4 5 2 3 2 8 0 2 0 D 6 1 4 2 6 8 0 6 8 8 2 8 0 4 0 D 7 7 9 2 6 8 7 8 5 1 2 8 2 1 0 D 9 3 7 2 6 9 0 1 0 0 7 2 8 1 8 0 D 1 1 1 3 2 6 8 6 1 1 8 1 2 8 2 2 0 d 1 2 8 7 2 7 0 2 1 3 5 4 2 8 2 4 0 d 1 4 0 9 2 7 0 5 1 4 7 6 2 8 2 4 0 d 1 5 4 5 2 6 9 5 1 6 1 9 2 8 1 3 0 d 1 6 7 8 2 7 0 1 1 7 5 1 2 8 3 2 0 d 1 8 3 6 2 7 0 8 1 9 0 7 2 8 3 5 0 d 1 9 7 2 2 7 0 5 2 0 4 9 2 8 3 6 0 d 2 1 1 5 2 6 9 4 2 1 9 2 2 8 3 9 0 d 2 2 4 0 2 7 1 4 2 3 1 0 2 8 4 5 0 d 2 3 5 4 2 7 0 8 2 4 3 0 2 8 4 0 0 E 2 7 5 2 5 0 4 3 5 2 2 6 1 7 0 E 4 4 9 2 5 0 3 5 3 4 2 6 2 1 0 E 6 2 1 2 5 1 2 7 1 0 2 6 2 2 0 E 7 9 3 2 5 1 5 8 7 5 2 6 2 9 0 E 9 4 9 2 5 1 2 1 0 3 3 2 6 2 5 0 E 1 1 1 0 2 5 1 6 1 1 8 9 2 6 4 0 0 e 1 2 7 9 2 5 3 1 1 3 5 4 2 6 0 6 0 e 1 4 0 4 2 5 3 7 1 4 7 9 2 6 1 0 0 e 1 5 4 8 2 5 4 3 1 6 2 2 2 6 3 4 0 e 1 6 9 0 2 5 4 8 1 7 6 1 2 6 2 0 0 e 1 8 2 7 2 5 4 5 1 8 9 8 2 6 3 0 0 e 1 9 5 1 2 5 4 8 2 0 2 6 2 6 4 2 0 e 2 0 7 3 2 5 5 0 2 1 3 6 2 6 3 7 0 e 2 1 9 1 2 5 4 6 2 2 7 0 2 6 2 4 0 e 2 3 0 0 2 5 4 9 2 3 7 9 2 6 2 4 0 e 2 4 2 1 2 5 6 1 2 4 9 9 2 6 3 4 0 F 2 9 3 2 3 1 2 3 5 9 2 4 4 0 0 F 4 4 5 2 3 2 4 5 3 8 2 4 2 3 0 F 6 2 7 2 3 1 6 7 0 3 2 4 1 4 0 F 8 1 2 2 3 1 9 8 8 4 2 4 3 1 0 F 9 6 4 2 3 2 9 1 0 3 6 2 4 4 3 0 F 1 1 0 9 2 3 1 2 1 1 7 6 2 4 4 3 0

f 1 2 8 2 2 3 4 6 1 3 3 8 2 4 5 7 0 f 1 4 0 8 2 3 5 3 1 4 7 3 2 4 6 4 0 f 1 5 2 2 2 3 4 7 1 5 9 5 2 4 6 1 0 f 1 6 5 1 2 3 5 2 1 7 2 3 2 4 6 0 0 f 1 7 8 5 2 3 5 5 1 8 4 6 2 4 6 8 0

f 1 9 1 7 2 3 5 7 1 9 8 6 2 4 6 6 0 f 2 0 6 4 2 3 4 5 2 1 1 8 2 4 6 4 0 f 2 2 0 5 2 3 5 7 2 2 5 9 2 4 6 8 0 f 2 3 2 0 2 3 4 9 2 3 8 2 2 4 7 2 0 f 2 4 2 0 2 3 5 7 2 4 9 8 2 4 6 6 0 G 2 7 3 2 1 2 9 3 6 1 2 2 6 7 0 G 4 5 8 2 1 3 0 5 3 4 2 2 6 4 0 G 6 2 0 2 1 3 6 6 9 7 2 2 6 7 0 G 7 9 7 2 1 3 5 8 7 3 2 2 6 8 0 G 9 4 8 2 1 2 8 1 0 1 9 2 2 7 1 0 G 1 0 8 5 2 1 2 2 1 1 6 4 2 2 5 9 0 h 1 2 9 4 2 1 6 0 1 3 6 8 2 2 6 8 0 h 1 4 2 4 2 1 4 7 1 4 8 3 2 2 7 7 0 h 1 5 4 2 2 1 5 8 1 6 1 7 2 2 8 0 0 h 1 6 7 2 2 1 5 7 1 7 2 7 2 2 8 4 0 h 1 7 9 6 2 1 4 9 1 8 6 2 2 2 8 7 0 h 1 9 2 4 2 1 5 6 1 9 8 6 2 2 8 3 0 h 2 0 5 6 2 1 4 5 2 1 2 4 2 2 8 7 0 h 2 1 9 1 2 1 4 6 2 2 7 0 2 2 7 7 0 h 2 3 1 5 2 1 5 2 2 3 8 3 2 2 6 8 0 h 2 4 2 5 2 1 4 6 2 5 0 8 2 2 8 3 0 H 2 8 2 1 9 4 7 3 6 6 2 0 9 0 0 H 4 5 3 1 9 4 9 5 3 6 2 0 7 7 0 H 6 1 0 1 9 5 3 7 2 9 2 0 8 1 0 H 7 9 6 1 9 4 7 8 9 4 2 0 8 6 0 H 9 4 8 1 9 3 3 1 0 3 6 2 0 8 2 0 H 1 0 9 0 1 9 5 2 1 1 7 4 2 0 8 6 0 g 1 2 8 5 1 9 1 3 1 3 5 8 2 0 3 0 0 g 1 4 0 7 1 9 2 0 1 4 7 5 2 0 4 2 0 g 1 5 4 8 1 9 0 9 1 6 2 2 2 0 3 5 0 g 1 6 6 9 1 9 1 3 1 7 4 9 2 0 4 3 0 g 1 8 0 0 1 9 3 2 1 8 6 9 2 0 4 5 0 g 1 9 3 1 1 9 2 2 2 0 0 0 2 0 3 9 0 g 2 0 5 6 1 9 3 0 2 1 2 9 2 0 4 4 0 g 2 1 9 5 1 9 3 0 2 2 5 7 2 0 4 6 0 g 2 3 0 4 1 9 1 7 2 3 8 2 2 0 4 5 0 g 2 4 3 0 1 9 2 2 2 4 9 7 2 0 4 8 0 I 2 8 0 1 7 8 3 3 5 5 1 8 9 2 0 I 4 4 4 1 7 7 9 5 3 0 1 8 8 9 0 I 6 1 0 1 7 9 8 7 0 4 1 8 9 1 0 I 7 8 9 1 7 9 4 8 7 4 1 8 8 5 0 I 9 4 2 1 7 8 8 1 0 3 0 1 8 8 6 0 I 1 0 7 7 1 7 7 1 1 1 6 0 1 8 8 7 0 i 1 3 0 7 1 7 9 9 1 3 2 9 1 8 8 4 0 i 1 4 0 4 1 7 9 2 1 4 2 4 1 8 8 5 0 i 1 4 9 4 1 7 8 9 1 5 2 3 1 8 9 2 0 i 1 5 7 7 1 7 7 4 1 6 2 8 1 8 8 0 0 i 1 6 7 2 1 7 7 3 1 6 9 8 1 8 8 9 0 i 1 7 7 3 1 7 8 9 1 8 0 0 1 8 9 5 0 i 1 8 6 3 1 7 9 6 1 8 8 5 1 9 0 1 0 i 1 9 4 8 1 8 0 3 1 9 8 8 1 8 9 7 0 i 2 0 5 8 1 7 9 5 2 0 9 9 1 8 8 8 0 i 2 1 4 6 1 8 0 6 2 1 7 8 1 8 9 5 0 i 2 2 2 3 1 8 1 1 2 2 5 7 1 8 9 9 0 i 2 3 0 9 1 8 0 6 2 3 5 5 1 8 9 2 0 i 2 4 1 5 1 8 0 0 2 4 4 4 1 9 0 2 0 J 2 9 0 1 6 4 3 3 4 6 1 7 4 0 0 J 4 6 1 1 6 3 3 5 2 4 1 7 4 4 0 J 6 1 8 1 6 4 0 6 9 3 1 7 3 9 0 J 8 0 3 1 6 4 0 8 6 1 1 7 3 3 0 J 9 5 3 1 6 1 1 1 0 0 9 1 7 3 6 0 J 1 0 9 1 1 6 2 8 1 1 4 6 1 7 3 6 0 j 1 2 9 2 1 6 2 2 1 3 2 4 1 7 2 1 0 j 1 3 7 0 1 6 0 9 1 4 1 0 1 7 2 1 0 j 1 4 6 9 1 5 9 5 1 5 1 2 1 7 2 9 0 j 1 5 8 3 1 5 8 8 1 6 2 7 1 7 1 4 0 j 1 6 8 8 1 5 8 3 1 7 2 1 1 7 2 1 0 j 1 7 5 8 1 5 8 6 1 8 1 6 1 7 1 8 0 j 1 8 9 7 1 5 6 9 1 9 4 4 1 7 2 6 0 j 2 0 1 2 1 5 7 2 2 0 4 8 1 7 2 3 0 j 2 1 1 5 1 5 7 7 2 1 6 0 1 7 3 7 0 j 2 2 1 4 1 5 9 0 2 2 5 6 1 6 9 7 0 j 2 3 1 3 1 5 8 3 2 3 5 3 1 7 2 8 0 j 2 3 9 5 1 5 8 3 2 4 3 6 1 7 3 3 0 K 2 8 6 1 4 3 5 3 6 0 1 5 6 5 0 K 4 5 4 1 4 4 1 5 4 3 1 5 5 4 0 K 6 2 4 1 4 4 2 7 1 2 1 5 5 2 0 K 7 8 8 1 4 3 1 8 9 0 1 5 5 2 0 K 9 5 0 1 4 3 0 1 0 3 7 1 5 5 2 0 K 1 0 8 4 1 4 3 5 1 1 6 6 1 5 5 3 0 k 1 2 6 0 1 4 2 6 1 3 2 0 1 5 1 2 0 k 1 3 5 9 1 4 3 0 1 4 1 6 1 4 9 5 0 k 1 4 5 4 1 4 2 0 1 5 0 7 1 4 9 2 0 k 1 5 5 3 1 4 2 6 1 6 0 8 1 4 9 8 0 k 1 6 4 9 1 4 2 6 1 7 1 6 1 5 0 2 0 k 1 7 6 4 1 4 3 2 1 8 3 4 1 5 0 6 0 k 1 8 8 5 1 4 2 7 1 9 6 9 1 5 0 7 0

k 2 0 3 8 1 4 2 4 2 1 1 2 1 5 0 7 0 k 2 1 9 2 1 4 2 4 2 2 6 1 1 4 9 9 0 k 2 3 2 2 1 4 0 6 2 3 9 1 1 4 9 1 0 L 2 7 9 1 2 7 3 3 5 3 1 4 0 3 0 L 4 4 3 1 2 8 5 5 1 6 1 3 9 6 0 L 5 9 4 1 2 7 9 6 7 9 1 3 9 5 0 L 7 5 6 1 2 8 2 8 3 4 1 3 8 9 0 L 9 0 2 1 2 8 2 9 7 7 1 3 9 7 0 L 1 0 2 7 1 2 7 7 1 0 9 1 1 3 9 5 0 L 1 1 4 2 1 2 6 9 1 1 9 9 1 3 9 2 0 l 1 2 9 5 1 2 7 4 1 3 1 8 1 3 7 6 0 l 1 3 8 0 1 2 6 5 1 4 0 4 1 3 7 3 0 l 1 4 8 0 1 2 7 2 1 5 2 2 1 3 6 1 0 l 1 5 8 5 1 2 7 9 1 6 0 6 1 3 6 6 0 l 1 6 6 0 1 2 6 5 1 7 1 9 1 3 6 1 0 l 1 7 8 7 1 2 6 7 1 8 0 6 1 3 6 8 0 l 1 8 7 8 1 2 6 9 1 9 0 2 1 3 6 9 0 l 1 9 8 8 1 2 7 0 2 0 1 3 1 3 7 3 0 l 2 1 1 0 1 2 8 3 2 1 3 2 1 3 7 0 0 l 2 2 3 6 1 2 7 5 2 2 6 8 1 3 7 8 0 l 2 3 6 2 1 2 7 4 2 3 8 1 1 3 6 9 0 M 2 7 3 1 0 9 5 3 7 0 1 2 2 5 0 M 4 3 9 1 1 1 4 5 3 9 1 2 3 1 0 M 6 0 3 1 1 0 6 7 0 2 1 2 3 8 0 M 7 7 6 1 0 9 8 8 8 6 1 2 2 0 0 M 9 4 2 1 1 1 5 1 0 4 8 1 2 2 5 0 M 1 0 9 5 1 1 0 7 1 1 9 7 1 2 3 2 0 m 1 2 8 6 1 1 0 9 1 3 7 9 1 1 8 8 0 m 1 4 2 8 1 0 9 9 1 5 2 6 1 1 7 8 0 m 1 5 8 2 1 0 9 0 1 6 8 9 1 1 7 8 0 m 1 7 4 9 1 0 8 9 1 8 5 6 1 1 7 2 0 m 1 9 0 9 1 0 8 6 2 0 2 0 1 1 6 9 0 m 2 0 9 0 1 0 7 5 2 1 9 3 1 1 5 7 0 m 2 2 5 6 1 0 7 1 2 3 6 1 1 1 5 8 0 N 2 6 3 9 0 7 3 5 0 1 0 3 5 0 N 4 3 6 9 1 1 5 4 1 1 0 2 9 0 N 6 0 9 9 1 1 6 8 5 1 0 3 1 0 N 7 7 5 9 0 1 8 5 8 1 0 4 4 0 N 9 4 4 9 2 3 1 0 2 2 1 0 7 1 0 N 1 0 8 3 9 1 7 1 1 7 0 1 0 6 6 0 n 1 2 6 9 9 4 7 1 3 4 3 1 0 2 3 0 n 1 4 2 5 9 5 0 1 5 1 6 1 0 3 1 0 n 1 5 8 8 9 4 3 1 6 6 9 1 0 2 8 0 n 1 7 5 5 9 5 0 1 8 4 5 1 0 3 1 0 n 1 9 2 9 9 4 7 2 0 0 2 1 0 3 9 0 n 2 0 9 3 9 4 6 2 1 7 6 1 0 3 7 0 n 2 2 6 9 9 3 4 2 3 6 1 1 0 2 6 0 O 2 6 0 7 2 5 3 5 8 8 7 0 0 O 4 2 4 7 2 3 5 3 5 8 6 3 0 O 5 9 1 7 1 8 7 0 4 8 5 8 0 O 7 6 5 7 2 1 8 8 5 8 6 1 0 O 9 3 8 7 1 9 1 0 5 6 8 5 3 0 O 1 0 8 5 7 3 4 1 2 0 7 8 5 7 0

o 1 2 7 4 7 3 4 1 3 4 6 8 1 2 0 o 1 4 3 9 7 3 7 1 5 0 7 8 0 6 0 o 1 5 9 6 7 2 7 1 6 6 8 7 9 9 0 o 1 7 6 5 7 2 7 1 8 3 7 7 9 8 0 o 1 9 2 2 7 2 5 1 9 9 8 7 9 0 0 o 2 0 8 7 7 1 3 2 1 6 0 7 8 3 0 o 2 2 8 9 7 0 8 2 3 5 9 7 7 4 0 P 2 7 9 5 0 1 3 4 3 6 6 2 0 P 4 3 5 4 9 6 5 0 2 6 7 0 0 P 5 9 9 4 7 7 6 7 1 6 6 3 0 P 7 7 9 4 7 5 8 5 0 6 6 8 0 P 9 5 9 4 9 3 1 0 3 3 6 7 4 0 P 1 1 2 0 5 0 4 1 1 9 8 6 6 8 0 p 1 2 9 2 4 6 7 1 3 6 5 6 0 2 0 P 1 4 4 5 4 6 6 1 5 1 7 6 1 0 0 P 1 6 0 5 4 9 0 1 6 8 1 6 0 4 0 P 1 7 7 2 4 6 5 1 8 4 5 5 9 7 0 P 1 9 2 6 4 7 1 2 0 0 0 5 9 4 0 P 2 1 0 4 4 7 3 2 1 7 1 5 9 2 0 P 2 2 8 3 4 7 1 2 3 5 0 6 0 1 0 Q 80 3 2 4 8 1 7 1 3 3 6 2 1 Q 2 7 0 3 2 4 2 3 6 7 3 3 6 1 1 Q 4 5 5 3 2 5 8 5 5 2 3 3 6 6 1 Q 6 3 7 3 2 7 0 7 3 7 3 3 7 8 1 Q 8 0 1 3 2 7 7 9 1 4 3 3 8 2 1 Q 9 9 0 3 2 8 3 1 0 8 7 3 3 8 6 1

q 1 1 8 6 3 2 2 8 1 2 6 8 3 3 5 2 1 q 1 3 3 0 3 2 4 3 1 4 2 8 3 3 6 3 1 q 1 5 0 0 3 2 6 9 1 5 8 7 3 3 7 0 1 q 1 6 4 6 3 2 5 4 1 7 4 6 3 3 6 7 1 q 1 8 0 0 3 2 6 1 1 9 0 0 3 3 7 8 1 q 1 9 5 6 3 2 5 2 2 0 4 2 3 3 7 4 1 q 2 1 1 2 3 2 5 3 2 1 9 6 3 3 6 9 1 R 85 3 0 3 5 1 7 0 3 1 3 0 1

R 2 7 3 3 0 2 6 3 5 6 3 1 3 3 1 R 4 6 2 3 0 3 8 5 5 1 3 1 4 3 1 R 6 4 1 3 0 4 2 7 3 2 3 1 5 2 1 R 8 0 7 3 0 4 8 8 9 1 3 1 5 7 1 R 9 7 4 3 0 6 5 1 0 6 0 3 1 6 9 1

r 1 2 0 7 3 0 6 1 1 2 5 8 3 1 2 4 1 r 1 3 5 2 3 0 7 4 1 4 1 1 3 1 3 7 1 r 1 5 0 5 3 0 8 4 1 5 6 7 3 1 4 4 1 r 1 6 5 0 3 0 8 7 1 7 1 0 3 1 4 7 1 r 1 8 0 4 3 1 0 3 1 8 6 7 3 1 6 6 1 r 1 9 7 5 3 1 2 0 2 0 4 1 3 1 8 9 1 r 2 1 1 3 3 1 2 6 2 1 7 6 3 1 9 3 1 S 1 0 1 2 8 1 1 1 7 2 2 9 1 7 1 S 2 7 9 2 8 0 8 3 4 8 2 9 2 1 1 S 4 6 8 2 8 0 9 5 2 9 2 9 1 6 1 S 6 6 1 2 8 3 4 7 2 8 2 9 3 3 1 S 8 3 4 2 8 4 0 8 9 1 2 9 4 5 1 S 9 9 1 2 8 4 3 1 0 4 7 2 9 4 5 1 s 1 1 9 8 2 8 4 9 1 2 4 7 2 9 1 8 1 s 1 3 5 2 2 8 5 9 1 3 9 2 2 9 2 7 1 s 1 5 0 2 2 8 7 0 1 5 5 4 2 9 3 4 1 s 1 6 4 1 2 8 7 2 1 6 8 7 2 9 4 0 1 s 1 7 8 0 2 8 7 4 1 8 2 5 2 9 4 6 1 s 1 9 2 6 2 8 7 1 1 9 7 9 2 9 5 5 1 s 2 0 7 6 2 8 7 7 2 1 2 1 2 9 6 0 1 T 90 2 5 8 6 1 8 2 2 6 8 1 1 T 2 5 4 2 5 9 8 3 5 5 2 6 8 5 1 T 4 2 7 2 5 9 7 5 2 4 2 6 9 4 1 T 6 3 4 2 5 8 5 7 2 0 2 6 9 3 1 T 8 0 1 2 5 9 9 9 0 2 2 7 1 1 1 T 9 6 9 2 6 0 2 1 0 7 2 2 7 0 8 1

t 1 1 8 3 2 6 0 8 1 2 6 6 2 7 3 5 1 t 1 3 2 0 2 6 1 1 1 3 8 1 2 7 1 1 1 t 1 4 7 7 2 6 2 0 1 5 3 1 2 7 1 1 1 t 1 6 1 9 2 6 0 9 1 6 7 3 2 7 2 2 1 t 1 7 6 3 2 6 2 3 1 8 3 1 2 7 1 8 1 t 1 9 2 2 2 6 1 6 1 9 7 7 2 7 2 0 1 t 2 0 7 1 2 6 1 4 2 1 2 8 2 7 0 4 1 U 94 2 3 6 7 1 7 8 2 4 7 1 1 U 2 6 1 2 3 7 8 3 5 8 2 4 8 0 1 U 4 4 7 2 3 7 8 5 3 5 2 4 8 7 1 U 6 4 3 2 3 8 1 7 3 2 2 4 8 1 1 U 8 1 9 2 3 6 8 9 1 3 2 4 8 7 1 U 9 9 1 2 3 7 9 1 0 8 5 2 4 9 6 1 u 1 1 9 0 2 3 8 8 1 2 4 5 2 4 4 1 1 u 1 3 1 6 2 3 7 8 1 3 7 6 2 4 3 9 1 u 1 4 4 4 2 3 8 4 1 5 1 3 2 4 3 6 1 u 1 5 7 8 2 3 9 2 1 6 5 3 2 4 4 8 1 u 1 7 1 0 2 3 8 8 1 7 8 5 2 4 4 4 1 v 1 8 3 0 2 3 9 3 1 8 7 2 2 4 4 5 1 v 1 9 1 1 2 3 8 9 1 9 6 2 2 4 4 6 1 u 1 9 9 2 2 3 8 7 2 0 6 1 2 4 3 9 1 u 2 0 9 1 2 3 8 8 2 1 4 5 2 4 5 1 1 V 89 2 1 3 3 1 6 8 2 2 4 7 1 V 2 5 9 2 1 4 4 3 3 5 2 2 4 0 1 V 4 3 0 2 1 3 4 5 1 1 2 2 5 3 1 V 6 3 7 2 1 3 6 7 2 4 2 2 5 4 1 V 8 0 8 2 1 4 2 8 9 5 2 2 6 1 1 V 9 8 5 2 1 4 1 1 0 8 4 2 2 6 7 1 v 1 1 6 8 2 1 4 5 1 2 2 6 2 2 0 4 1 v 1 2 7 3 2 1 4 4 1 3 3 4 2 2 0 3 1 v 1 3 8 7 2 1 4 3 1 4 5 0 2 2 0 9 1 v 1 5 1 7 2 1 4 7 1 5 8 2 2 2 1 3 1 v 1 6 3 3 2 1 4 9 1 7 0 6 2 2 1 8 1 v 1 7 4 4 2 1 5 4 1 8 1 8 2 2 2 6 1 v 1 8 7 6 2 1 5 9 1 9 4 4 2 2 2 4 1 v 1 9 9 7 2 1 6 0 2 0 6 5 2 2 3 3 1 v 2 0 9 7 2 1 6 4 2 1 6 4 2 2 2 7 1 v 2 2 0 6 2 1 6 1 2 2 6 1 2 2 2 0 1 v 2 2 9 7 2 1 5 1 2 3 4 5 2 2 1 2 1 W 61 1 9 1 9 1 7 8 2 0 2 8 1 W 2 3 1 1 9 1 5 3 5 2 2 0 3 9 1 W 4 0 3 1 9 2 3 5 3 8 2 0 4 0 1 W 6 0 6 1 9 2 9 7 2 0 2 0 5 8 1 W 7 8 3 1 9 3 7 9 0 4 2 0 6 1 1 W 9 5 8 1 9 4 1 1 0 8 1 2 0 5 8 1 w 1 1 4 6 1 9 5 6 1 2 3 3 2 0 0 9 1 w 1 2 8 3 1 9 5 8 1 3 7 5 2 0 0 9 1 w 1 4 3 6 1 9 5 9 1 5 3 3 2 0 1 1 1 w 1 5 8 5 1 9 6 9 1 6 8 6 2 0 1 9 1 w 1 7 5 0 1 9 7 4 1 8 5 9 2 0 2 7 1 w 1 9 1 7 1 9 7 4 2 0 2 8 2 0 3 2 1 w 2 0 8 4 1 9 7 4 2 1 7 9 2 0 3 5 1 w 2 2 2 3 1 9 8 4 2 3 1 6 2 0 4 4 1 X 82 1 7 0 3 1 8 1 1 8 1 9 1 X 2 3 3 1 6 9 3 3 4 2 1 8 2 9 1 X 4 0 3 1 6 9 8 4 9 8 1 8 2 9 1 X 6 3 4 1 6 9 1 7 2 1 1 8 3 3 1 X 7 8 5 1 7 0 2 8 9 5 1 8 2 5 1 X 9 6 9 1 7 1 8 1 0 7 2 1 8 3 3 1 x 1 1 6 1 1 7 1 3 1 2 2 3 1 7 9 0 1 x 1 2 8 7 1 7 0 4 1 3 5 7 1 7 9 0 1 x 1 4 3 2 1 7 0 2 1 4 9 7 1 7 9 1 1 x 1 5 7 3 1 7 1 7 1 6 3 5 1 7 9 8 1 x 1 6 9 6 1 7 2 3 1 7 6 7 1 7 9 9 1 x 1 8 3 6 1 7 0 1 1 9 0 4 1 8 0 1 1 x 1 9 6 9 1 7 2 0 2 0 4 9 1 8 1 0 1 x 2 0 9 4 1 7 2 2 2 1 8 1 1 8 0 7 1 x 2 2 2 3 1 7 0 2 2 3 0 1 1 7 9 7 1

Y 93 1 4 2 7 1 9 1 1 5 9 1 1 Y 2 2 7 1 4 6 1 3 2 0 1 5 9 4 1 Y 3 8 2 1 4 8 4 4 9 4 1 5 9 8 1 Y 6 1 0 1 4 6 4 7 0 5 1 5 9 7 1 Y 7 9 5 1 4 7 2 9 0 6 1 6 0 2 1 Y 9 7 3 1 4 6 6 1 0 6 4 1 6 1 2 1 y 1 1 3 0 1 4 9 4 1 2 0 0 1 6 0 7 1 y 1 2 8 0 1 4 9 8 1 3 4 9 1 6 0 2 1 y 1 4 2 9 1 5 1 0 1 4 9 6 1 6 0 7 1 y 1 5 7 1 1 4 9 8 1 6 3 7 1 5 9 8 1 y 1 6 9 4 1 4 8 7 1 7 6 8 1 5 9 3 1 y 1 8 3 4 1 4 8 2 1 9 0 1 1 5 8 0 1 y 1 9 6 1 1 4 7 0 2 0 1 9 1 5 6 3 1 y 2 0 7 8 1 4 7 5 2 1 5 4 1 5 8 1 1 y 2 2 2 0 1 4 6 0 2 2 8 2 1 5 7 6 1 Z 82 1 2 7 4 1 5 9 1 3 8 7 1 Z 2 4 2 1 2 7 9 3 1 5 1 3 8 8 1 Z 3 9 5 1 2 6 3 4 6 6 1 3 7 8 1 Z 5 9 1 1 2 6 8 6 6 9 1 3 7 2 1 Z 7 4 9 1 2 5 2 8 4 5 1 3 7 0 1 Z 9 0 6 1 2 4 9 9 9 4 1 3 6 2 1 z 1 1 3 9 1 2 3 5 1 1 9 7 1 3 1 1 1 z 1 2 6 0 1 2 3 7 1 3 1 2 1 3 0 3 1 z 1 3 7 5 1 2 2 8 1 4 2 5 1 2 9 7 1 z 1 4 8 7 1 2 2 0 1 5 4 3 1 2 9 4 1 z 1 5 8 7 1 2 3 1 1 6 4 9 1 2 9 1 1 z 1 7 0 0 1 2 3 4 1 7 5 4 1 2 9 1 1 z 1 7 8 3 1 2 2 8 1 8 3 4 1 2 9 5 1 z 1 8 8 8 1 2 3 1 1 9 6 1 1 2 9 7 1 z 2 0 0 3 1 2 3 2 2 0 6 6 1 2 9 1 1 z 2 1 1 3 1 2 3 3 2 1 7 0 1 2 9 2 1 z 2 2 1 2 1 2 2 8 2 2 7 1 1 2 9 2 1 Z 65 1 0 2 1 1 4 7 1 1 3 5 1 Z 2 1 7 1 0 2 2 3 1 3 1 1 3 0 1 Z 3 8 3 1 0 2 9 5 0 4 1 1 2 6 1 Z 5 6 9 1 0 2 3 6 6 2 1 1 2 8 1 Z 7 4 6 1 0 2 1 8 5 6 1 1 2 9 1 Z 8 9 2 1 0 1 2 1 0 0 6 1 1 3 2 1 z 1 1 0 8 1 0 0 5 1 1 6 5 1 0 7 7 1 z 1 2 2 2 9 9 4 1 2 8 5 1 0 7 3 1 z 1 3 4 2 1 0 0 3 1 4 1 0 1 0 7 2 1 z 1 4 6 0 9 9 8 1 5 2 8 1 0 7 0 1 z 1 5 9 5 1 0 0 2 1 6 5 6 1 0 6 9 1 z 1 7 0 5 1 0 0 5 1 7 7 9 1 0 7 1 1 z 1 8 2 5 1 0 1 0 1 9 0 6 1 0 7 6 1 z 1 9 4 3 1 0 1 5 2 0 1 4 1 0 8 2 1 z 2 0 6 0 1 0 1 8 2 1 3 3 1 0 8 5 1 z 2 1 6 3 1 0 1 4 2 2 5 8 1 0 7 8 1 T 90 3 3 2 0 1 4 1 3 4 1 8 2 h 1 7 2 3 3 1 1 2 2 3 3 4 1 8 2 e 2 3 7 3 3 1 1 2 9 5 3 3 6 7 2 ( 3 9 9 3 3 1 4 4 4 8 3 4 0 8 2 q 4 7 2 3 2 7 3 5 3 6 3 3 6 3 2 u 5 3 3 3 3 1 3 5 8 4 3 3 6 3 2 i 5 9 7 3 3 1 8 6 1 5 3 3 8 2 2 c 6 3 8 3 3 0 6 6 9 5 3 3 6 1 2 k 7 0 3 3 3 1 6 7 8 1 3 4 1 4 2 ) 8 0 2 3 3 0 1 8 5 3 3 4 1 7 2 b 9 4 8 3 2 9 9 1 0 0 9 3 4 0 8 2 r 1 0 2 0 3 3 0 6 1 0 6 7 3 3 5 2 2 o 1 0 7 5 3 3 0 3 1 1 2 2 3 3 5 2 2 w 1 1 4 1 3 3 0 5 1 2 1 3 3 3 5 4 2 n 1 2 3 9 3 3 0 2 1 2 9 5 3 3 6 0 2 f 1 3 8 8 3 3 0 1 1 4 3 6 3 4 0 0 2 o 1 4 4 3 3 3 0 3 1 4 9 4 3 3 5 7 2 x 1 5 0 7 3 2 9 4 1 5 4 7 3 3 5 2 2 j 1 6 2 8 3 2 3 6 1 6 6 4 3 3 5 7 2 w 1 6 9 3 3 2 9 1 1 7 6 0 3 3 4 1 2 u 1 7 9 7 3 2 7 7 1 8 5 9 3 3 5 7 2 m 1 8 8 5 3 3 0 1 1 9 6 1 3 3 6 0 2 p 1 9 7 9 3 2 4 8 2 0 3 2 3 3 5 9 2 s 2 0 3 3 3 2 9 4 2 0 6 8 3 3 5 3 2

! 2 0 8 0 3 2 9 0 2 1 0 2 3 3 8 3 2 o 2 1 5 6 3 2 9 6 2 2 0 2 3 3 4 9 2 v 2 2 0 9 3 2 9 9 2 2 5 4 3 3 5 0 2 e 2 2 5 3 3 2 9 3 2 2 9 4 3 3 4 9 2 r 2 3 1 0 3 3 0 0 2 3 4 9 3 3 4 7 2 { 1 1 5 3 0 9 5 1 7 1 3 2 0 9 2 t 2 0 1 3 1 1 5 2 4 3 3 2 0 1 2 h 2 5 5 3 1 1 2 3 0 8 3 1 9 2 2 e 3 1 6 3 1 1 3 3 7 2 3 1 6 0 2 } 3 8 6 3 0 8 9 4 2 9 3 1 9 4 2

$ 5 5 5 3 0 8 6 6 2 3 3 2 1 2 2 3 6 5 2 3 0 9 7 6 9 7 3 1 9 0 2 , 7 1 5 3 0 7 9 7 3 0 3 1 2 3 2 4 7 5 2 3 0 8 9 8 0 5 3 1 8 1 2 5 8 3 2 3 0 9 3 8 7 5 3 1 8 4 2 6 8 8 2 3 0 9 8 9 4 0 3 1 7 7 2 . 9 6 7 3 1 0 9 9 8 4 3 1 2 8 2 7 1 0 1 5 3 0 9 3 1 0 6 8 3 1 7 7 2 8 1 0 8 8 3 0 9 2 1 1 3 6 3 1 7 5 2 1 1 1 4 6 3 0 8 8 1 1 9 7 3 1 7 1 2 2 1 2 2 4 3 0 9 1 1 2 7 6 3 1 6 4 2

< 1 3 3 9 3 0 9 4 1 3 9 1 3 1 5 2 2 l 1 4 1 3 3 0 8 8 1 4 3 2 3 1 6 5 2 a 1 4 4 8 3 0 8 2 1 5 0 8 3 1 3 8 2 z 1 5 1 9 3 0 8 2 1 5 6 9 3 1 3 9 2 y 1 5 7 6 3 0 4 9 1 6 2 9 3 1 3 3 2

> 1 6 3 8 3 0 8 8 1 6 8 1 3 1 4 5 2

# 1 7 2 1 3 0 7 2 1 8 0 7 3 1 4 8 2 9 1 8 3 3 3 0 6 8 1 8 8 7 3 1 5 0 2 0 1 8 8 7 3 0 7 0 1 9 4 4 3 1 3 6 2 d 1 9 9 4 3 0 4 9 2 0 5 0 3 1 4 6 2 o 2 0 5 8 3 0 4 7 2 1 0 8 3 0 9 9 2 g 2 1 1 6 3 0 1 4 2 1 7 0 3 0 9 9 2

& 2 2 3 0 3 0 4 8 2 2 8 8 3 1 4 1 2 d 1 2 4 2 8 7 0 1 7 6 2 9 8 7 2 u 2 1 3 2 8 7 2 2 6 0 2 9 3 2 2 o 2 8 5 2 8 7 3 3 3 6 2 9 2 8 2 k 3 5 5 2 8 6 6 4 2 6 2 9 6 2 2 , 4 7 4 2 8 4 8 4 9 8 2 8 9 1 2 d 5 8 9 2 8 6 0 6 4 3 2 9 6 8 2 u 6 6 9 2 8 5 1 7 2 5 2 9 1 9 2 c 7 4 8 2 8 6 8 7 9 7 2 9 1 7 2 k 8 2 2 2 8 7 0 8 8 9 2 9 4 8 2 / 8 8 5 2 8 3 3 9 9 5 2 9 4 1 2 g 1 0 2 4 2 8 4 1 1 0 8 6 2 9 2 5 2 o 1 0 9 1 2 8 6 1 1 1 4 2 2 9 2 7 2 o 1 1 5 6 2 8 6 1 1 2 1 8 2 9 1 9 2 s 1 2 4 1 2 8 6 5 1 2 8 3 2 9 2 5 2 e 1 2 8 8 2 8 5 7 1 3 5 7 2 9 1 6 2 , 1 3 9 4 2 8 3 7 1 4 1 3 2 8 7 6 2 a 1 4 9 3 2 8 5 1 1 5 7 3 2 9 1 8 2 s 1 5 9 9 2 8 3 6 1 6 4 5 2 9 1 0 2 l 1 7 4 0 2 8 4 2 1 7 6 0 2 9 2 0 2 2 1 7 6 1 2 8 4 2 1 8 1 6 2 9 2 0 2 . 1 8 2 3 2 8 5 7 1 8 4 1 2 8 7 3 2 5 1 8 7 9 2 8 4 0 1 9 3 4 2 9 1 7 2

% 1 9 8 0 2 8 3 9 2 0 7 9 2 9 3 3 2 o 2 1 7 3 2 8 4 8 2 2 2 5 2 9 0 0 2 f 2 2 4 2 2 8 4 8 2 2 8 9 2 9 3 0 2 E 1 3 0 2 6 5 4 1 9 2 2 7 5 6 2

− 2 2 7 2 6 8 8 2 6 3 2 7 0 0 2 m 3 0 2 2 6 5 2 3 7 1 2 7 2 0 2 a 3 9 1 2 6 4 5 4 4 0 2 7 0 0 2 i 4 4 9 2 6 4 6 4 6 8 2 7 2 3 2 l 4 9 7 2 6 3 5 5 1 3 2 7 4 3 2 f 6 6 5 2 6 3 8 7 3 2 2 7 5 0 2 r 7 4 1 2 6 5 0 7 9 4 2 6 9 3 2 o 8 1 5 2 6 4 7 8 6 3 2 7 0 1 2 m 8 8 4 2 6 5 6 9 6 0 2 7 0 2 2

a 1 0 4 6 2 6 4 4 1 1 1 1 2 7 1 1 2 s 1 1 1 9 2 6 3 8 1 1 5 5 2 7 0 8 2 p 1 1 6 1 2 6 1 3 1 2 1 6 2 7 0 8 2 a 1 2 1 6 2 6 4 8 1 2 7 7 2 7 0 2 2 m 1 2 7 9 2 6 5 2 1 3 5 2 2 7 1 2 2 m 1 3 5 6 2 6 5 1 1 4 4 2 2 7 0 8 2 e 1 4 5 7 2 6 4 6 1 5 1 4 2 7 0 6 2 r 1 5 1 9 2 6 5 2 1 5 7 8 2 7 0 2 2

@ 1 6 1 7 2 6 2 8 1 7 0 2 2 7 2 0 2 w 1 7 3 1 2 6 3 5 1 8 0 5 2 6 9 1 2 e 1 8 0 3 2 6 4 2 1 8 4 9 2 6 9 3 2 b 1 8 5 8 2 6 3 3 1 9 1 5 2 7 2 3 2 . 1 9 2 6 2 6 4 8 1 9 4 4 2 6 6 7 2 c 1 9 7 8 2 6 3 1 2 0 2 8 2 6 8 7 2 o 2 0 3 1 2 6 2 5 2 0 7 7 2 6 7 4 2 m 2 0 8 4 2 6 2 3 2 1 8 5 2 6 7 6 2 i 2 2 7 1 2 6 2 1 2 3 0 0 2 6 9 3 2 s 2 3 0 5 2 6 1 9 2 3 4 2 2 6 6 9 2 s 1 2 1 2 4 4 7 1 6 0 2 5 1 7 2 p 1 7 5 2 4 1 0 2 2 8 2 4 9 6 2 a 2 2 9 2 4 3 1 2 9 1 2 4 8 7 2 m 2 9 6 2 4 3 2 3 7 9 2 4 9 6 2

? 3 9 7 2 4 3 7 4 5 0 2 5 3 0 2 L 5 0 6 2 4 3 1 5 5 6 2 5 2 0 2 o 5 6 0 2 4 2 5 6 1 6 2 4 7 3 2 l 6 4 2 2 4 2 6 6 6 2 2 5 2 7 2

’ 6 8 8 2 4 9 7 7 0 6 2 5 3 9 2 s 7 3 9 2 4 3 9 7 7 8 2 4 9 7 2 8 1 5 2 4 2 4 9 2 6 2 4 4 1 2 W 9 8 3 2 4 3 2 1 0 6 9 2 5 0 0 2

o 1 0 8 7 2 4 3 3 1 1 4 5 2 4 8 3 2 w 1 1 6 6 2 4 3 2 1 2 5 3 2 4 8 8 2

! 1 2 8 7 2 4 0 6 1 3 0 9 2 4 9 8 2

? 1 3 5 5 2 4 0 2 1 4 0 0 2 4 9 9 2

” 1 4 3 1 2 4 6 6 1 4 7 7 2 5 1 0 2 ˆ 1 5 3 2 2 4 5 6 1 5 9 6 2 5 0 2 2 + 1 6 3 5 2 3 8 8 1 7 0 2 2 4 7 6 2

˜ 1 7 6 6 2 4 1 4 1 8 5 9 2 4 5 7 2

− 1 9 2 7 2 4 3 2 1 9 7 1 2 4 4 6 2

= 2 0 3 8 2 3 9 8 2 1 0 2 2 4 4 2 2 : 2 1 6 3 2 3 8 9 2 1 8 0 2 4 5 4 2

; 2 2 3 4 2 3 6 9 2 2 5 7 2 4 4 5 2 [ 2 3 1 9 2 3 7 4 2 3 6 1 2 4 7 2 2 ] 2 4 1 9 2 3 6 5 2 4 6 2 2 4 6 1 2 H 1 3 4 2 2 0 7 1 8 7 2 3 1 3 2 e 1 9 6 2 2 1 3 2 4 3 2 2 5 9 2 i 2 6 1 2 2 1 3 2 8 0 2 2 8 4 2 k 2 9 4 2 2 1 3 3 3 9 2 2 9 4 2 o 3 5 3 2 2 0 7 3 9 5 2 2 6 0 2 , 4 4 0 2 1 7 6 4 5 8 2 2 1 6 2 f 5 1 2 2 2 0 7 5 6 1 2 3 0 0 2 e 5 6 6 2 2 1 2 6 1 1 2 2 5 7 2 i 6 2 5 2 2 0 7 6 4 5 2 2 7 5 2 g 6 6 2 2 1 7 0 7 1 1 2 2 5 7 2 n 7 2 1 2 2 0 7 7 6 5 2 2 5 5 2 i 7 7 6 2 2 0 6 7 9 6 2 2 6 7 2 n 8 1 1 2 2 0 7 8 6 5 2 2 5 1 2

g 8 6 7 2 1 5 9 9 2 6 2 2 4 7 2 s 9 8 8 2 2 0 0 1 0 3 1 2 2 6 2 2 l 1 0 5 1 2 2 0 2 1 0 6 9 2 2 7 7 2 e 1 0 8 7 2 1 9 9 1 1 3 4 2 2 5 4 2 e 1 1 5 0 2 1 9 5 1 2 0 4 2 2 5 2 2 p 1 2 3 0 2 1 5 7 1 2 7 9 2 2 4 7 2 , 1 3 0 7 2 1 7 2 1 3 2 4 2 2 1 0 2 k 1 3 8 4 2 2 0 0 1 4 3 6 2 2 8 1 2 e 1 4 5 4 2 1 8 6 1 5 0 1 2 2 4 7 2 p 1 5 0 7 2 1 6 5 1 5 5 8 2 2 4 1 2 t 1 5 6 5 2 1 8 5 1 6 1 7 2 2 6 7 2 h 1 6 9 6 2 1 9 0 1 7 5 1 2 2 7 3 2 e 1 7 5 9 2 1 8 8 1 8 0 6 2 2 3 2 2 r 1 8 1 1 2 1 9 4 1 8 5 7 2 2 3 1 2 b 1 9 4 2 2 1 8 8 1 9 9 4 2 2 7 4 2 r 2 0 0 2 2 1 9 1 2 0 6 2 2 2 3 9 2 e 2 0 5 8 2 1 8 8 2 1 0 8 2 2 3 9 2 a 2 1 0 9 2 1 8 4 2 1 5 6 2 2 3 4 2 t 2 1 6 0 2 1 8 1 2 2 0 6 2 2 6 0 2 h 2 2 0 4 2 1 9 3 2 2 5 3 2 2 7 2 2 i 2 2 5 9 2 1 8 8 2 2 7 7 2 2 4 3 2 n 2 2 9 2 2 1 8 2 2 3 4 3 2 2 3 1 2 g 2 3 5 2 2 1 5 1 2 4 0 8 2 2 2 7 2 d 1 1 8 1 9 5 4 1 6 8 2 0 6 8 2 e 1 9 9 1 9 7 2 2 4 2 2 0 3 3 2 e 2 6 7 1 9 7 3 3 2 8 2 0 5 4 2 p 3 5 6 1 9 5 0 4 0 5 2 0 3 8 2 a 4 9 9 1 9 7 0 5 5 8 2 0 2 5 2 n 5 7 6 1 9 7 2 6 3 1 2 0 2 8 2 d 6 5 6 1 9 7 0 7 1 0 2 0 5 7 2 s 8 1 2 1 9 6 5 8 5 6 2 0 3 3 2 l 8 8 4 1 9 7 7 9 0 2 2 0 6 8 2 o 9 2 0 1 9 6 5 9 7 8 2 0 2 4 2 w 1 0 0 5 1 9 6 9 1 0 8 8 2 0 2 7 2

, 1 1 2 0 1 9 4 1 1 1 4 3 1 9 9 6 2 h 1 2 0 7 1 9 7 3 1 2 5 9 2 0 6 3 2 e 1 2 6 8 1 9 7 5 1 3 1 7 2 0 2 7 2 r 1 3 3 1 1 9 7 2 1 3 9 1 2 0 2 7 2 m 1 4 5 6 1 9 8 1 1 5 4 7 2 0 4 4 2 u 1 5 5 9 1 9 7 6 1 6 1 3 2 0 3 9 2 s 1 6 1 7 1 9 7 5 1 6 5 6 2 0 3 5 2 c 1 6 6 7 1 9 8 2 1 7 2 1 2 0 3 5 2 l 1 7 3 6 1 9 8 5 1 7 5 4 2 0 6 9 2 e 1 7 7 4 1 9 9 2 1 8 3 2 2 0 4 6 2 s 1 8 4 6 1 9 7 6 1 8 8 9 2 0 4 2 2 r 1 9 6 3 1 9 7 0 2 0 1 4 2 0 2 6 2 e 2 0 1 5 1 9 7 1 2 0 6 3 2 0 4 8 2 l 2 0 8 1 1 9 7 5 2 1 0 0 2 0 5 1 2 a 2 1 1 4 1 9 6 9 2 1 6 4 2 0 1 7 2 x 2 1 7 4 1 9 5 4 2 2 2 5 2 0 2 8 2 e 2 2 3 3 1 9 6 4 2 2 8 4 2 0 2 8 2 d 2 2 8 4 1 9 6 3 2 3 3 5 2 0 5 4 2 b 1 1 3 1 7 4 2 1 6 9 1 8 4 3 2 u 1 9 7 1 7 4 1 2 5 5 1 7 9 5 2 t 2 7 3 1 7 4 7 3 1 3 1 8 3 1 2 n 3 8 7 1 7 5 4 4 4 2 1 8 0 9 2 o 4 4 3 1 7 4 6 4 8 4 1 8 0 5 2 t 5 0 0 1 7 4 3 5 3 4 1 8 3 4 2 S 6 1 2 1 7 5 0 6 5 0 1 8 2 0 2 l 6 6 1 1 7 4 6 6 7 8 1 8 3 4 2 a 6 9 4 1 7 4 4 7 4 8 1 7 9 5 2 c 7 7 4 1 7 5 0 8 2 0 1 7 9 5 2 k 8 3 1 1 7 5 6 8 9 2 1 8 2 5 2 e 9 0 5 1 7 5 3 9 5 7 1 8 0 9 2 d 9 7 1 1 7 4 0 1 0 2 7 1 8 3 3 2

, 1 0 6 8 1 7 2 4 1 0 9 3 1 7 7 1 2 h 1 1 5 2 1 7 5 3 1 2 0 4 1 8 3 9 2 e 1 2 2 2 1 7 4 8 1 2 7 1 1 8 0 2 2 r 1 2 7 9 1 7 5 4 1 3 2 5 1 8 0 1 2 l 1 3 8 9 1 7 4 6 1 4 0 7 1 8 3 7 2 i 1 4 2 4 1 7 4 1 1 4 4 2 1 8 1 5 2 p 1 4 6 4 1 7 0 6 1 5 2 2 1 8 0 6 2 s 1 5 2 9 1 7 4 2 1 5 7 0 1 8 0 5 2 , 1 5 8 7 1 7 1 2 1 6 1 7 1 7 6 4 2 c 1 6 8 6 1 7 5 4 1 7 3 1 1 8 0 6 2 l 1 7 3 3 1 7 4 7 1 7 5 4 1 8 3 2 2 o 1 7 6 4 1 7 4 5 1 8 0 5 1 7 9 3 2 s 1 8 2 1 1 7 4 5 1 8 5 9 1 7 9 7 2 e 1 8 5 7 1 7 4 1 1 9 0 9 1 7 9 0 2 d 1 9 2 8 1 7 3 5 1 9 7 4 1 8 2 4 2 , 2 0 0 2 1 7 2 1 2 0 2 0 1 7 6 6 2 a 2 0 8 7 1 7 4 4 2 1 4 3 1 8 0 1 2 t 2 1 5 5 1 7 4 3 2 1 8 9 1 8 3 0 2 t 2 2 5 3 1 7 5 1 2 2 9 2 1 8 3 7 2 h 2 2 9 6 1 7 4 5 2 3 4 9 1 8 3 2 2 e 2 3 5 1 1 7 4 0 2 4 2 1 1 8 1 5 2 v 1 1 0 1 5 2 7 1 6 0 1 6 0 2 2 e 1 7 7 1 5 4 1 2 2 0 1 5 9 3 2 r 2 4 2 1 5 4 2 2 8 2 1 5 9 1 2 y 3 0 2 1 5 0 6 3 6 5 1 5 9 1 2 e 4 5 1 1 5 3 4 5 0 1 1 6 0 5 2 d 5 2 0 1 5 1 6 5 7 4 1 6 0 4 2 g 5 9 2 1 5 0 1 6 5 0 1 5 7 2 2 e 6 6 4 1 5 3 2 7 1 9 1 5 9 3 2 o 8 3 2 1 5 4 2 8 7 6 1 5 8 9 2 f 8 8 4 1 5 3 9 9 3 2 1 6 2 3 2 P 9 8 6 1 5 0 6 1 0 4 1 1 5 9 4 2 a 1 0 5 0 1 5 3 6 1 1 0 7 1 5 8 6 2 r 1 1 1 3 1 5 4 6 1 1 5 4 1 5 9 2 2

t 1 1 7 6 1 5 3 7 1 2 2 0 1 6 3 8 2 i 1 2 4 3 1 5 3 8 1 2 6 2 1 6 0 6 2 n 1 2 8 2 1 5 3 6 1 3 3 8 1 5 8 6 2 g 1 3 5 5 1 4 9 7 1 4 1 2 1 5 8 6 2 , 1 4 5 5 1 5 1 2 1 4 7 5 1 5 6 3 2 h 1 5 3 9 1 5 4 0 1 5 9 4 1 6 3 0 2 e 1 6 0 5 1 5 3 8 1 6 5 2 1 5 9 5 2 r 1 6 6 5 1 5 3 8 1 7 1 7 1 5 9 0 2 e 1 7 7 1 1 5 4 0 1 8 1 7 1 5 9 7 2 y 1 8 2 9 1 5 0 7 1 8 7 8 1 5 9 0 2 e 1 8 9 6 1 5 3 8 1 9 4 4 1 5 9 1 2 s 1 9 5 6 1 5 3 5 1 9 9 2 1 5 9 4 2 s 2 0 7 2 1 5 2 8 2 1 0 5 1 5 8 9 2 o 2 1 2 0 1 5 3 0 2 1 7 4 1 5 8 5 2 f 2 1 8 6 1 5 2 2 2 2 2 9 1 6 1 3 2 t 2 2 4 7 1 5 2 2 2 2 9 8 1 6 0 6 2 b 1 0 7 1 3 1 9 1 7 0 1 4 2 3 2 e 1 8 7 1 3 2 8 2 3 2 1 3 8 0 2 n 2 5 4 1 3 2 3 3 0 7 1 3 8 2 2 e 3 2 3 1 3 1 8 3 7 1 1 3 8 0 2 a 3 8 5 1 3 2 3 4 4 9 1 3 7 5 2 t 4 6 7 1 3 2 8 5 1 2 1 4 1 3 2 h 5 2 5 1 3 2 3 5 9 7 1 4 2 0 2 u 7 2 0 1 3 2 3 7 7 1 1 3 8 0 2 n 7 7 6 1 3 2 3 8 2 8 1 3 7 9 2 f 8 4 8 1 3 2 1 8 9 4 1 4 0 8 2 l 9 1 0 1 3 2 2 9 3 0 1 4 1 1 2 u 9 5 7 1 3 1 5 1 0 1 4 1 3 7 2 2 t 1 0 1 4 1 3 2 1 1 0 5 0 1 4 0 8 2 t 1 0 6 2 1 3 2 5 1 0 9 7 1 4 1 0 2 e 1 1 1 1 1 3 2 5 1 1 6 1 1 3 8 1 2 r 1 1 7 1 1 3 2 8 1 2 1 3 1 3 7 6 2 i 1 2 2 2 1 3 2 5 1 2 4 0 1 3 9 7 2 n 1 2 5 7 1 3 2 7 1 3 1 5 1 3 7 8 2 g 1 3 3 8 1 2 7 4 1 3 9 1 1 3 7 9 2 e 1 4 5 7 1 3 3 3 1 5 0 5 1 3 9 6 2 y 1 5 0 8 1 3 0 4 1 5 6 0 1 3 8 6 2 e 1 5 6 7 1 3 2 5 1 6 2 2 1 3 8 6 2 l 1 6 3 2 1 3 2 4 1 6 5 2 1 4 0 4 2 i 1 6 5 9 1 3 3 0 1 6 7 7 1 4 0 1 2 d 1 6 9 6 1 3 2 2 1 7 4 8 1 4 0 5 2 s 1 7 7 2 1 3 1 9 1 8 0 4 1 3 7 6 2 , 1 8 3 8 1 3 0 4 1 8 6 3 1 3 5 2 2 h 1 9 2 6 1 3 0 2 1 9 9 0 1 4 1 0 2 e 2 0 0 5 1 3 0 7 2 0 5 4 1 3 6 5 2 r 2 0 6 6 1 3 1 4 2 1 1 6 1 3 6 3 2 h 2 1 8 9 1 3 1 2 2 2 4 4 1 4 1 3 2 o 2 2 5 6 1 3 0 8 2 3 0 9 1 3 6 4 2 o 2 3 2 0 1 3 1 1 2 3 6 6 1 3 6 8 2 d 2 3 8 3 1 3 0 7 2 4 3 3 1 3 9 4 2 e 2 4 3 4 1 3 0 2 2 4 8 3 1 3 6 6 2 d 2 4 8 5 1 3 0 0 2 5 3 3 1 3 9 4 2 g 1 2 8 1 0 5 1 1 9 1 1 1 6 1 2 a 2 1 5 1 0 8 9 2 8 0 1 1 5 4 2 z 3 0 9 1 0 9 1 3 7 6 1 1 5 7 2 e 4 0 3 1 0 8 7 4 6 6 1 1 5 6 2 t 5 4 9 1 0 8 6 5 9 8 1 1 8 6 2 u 6 2 3 1 0 9 1 6 7 6 1 1 4 9 2 r 6 8 7 1 0 9 4 7 2 9 1 1 4 6 2 n 7 3 9 1 0 9 2 7 8 9 1 1 5 0 2 e 7 9 8 1 0 9 0 8 5 1 1 1 5 1 2 d 8 6 1 1 0 8 7 9 1 7 1 1 8 6 2 w 1 0 0 8 1 0 9 6 1 1 0 0 1 1 5 7 2

i 1 1 3 7 1 0 9 5 1 1 6 0 1 1 9 3 2 t 1 1 7 5 1 0 8 1 1 2 2 9 1 1 8 2 2 h 1 2 2 9 1 0 9 5 1 2 8 8 1 1 9 4 2 i 1 3 0 6 1 0 9 9 1 3 2 4 1 1 7 1 2 n 1 3 4 9 1 1 0 2 1 4 1 1 1 1 5 6 2 , 1 4 6 8 1 0 6 4 1 4 8 6 1 1 3 0 2 t 1 5 4 8 1 0 9 4 1 5 9 0 1 1 8 2 2 o 1 6 1 8 1 0 9 7 1 6 6 7 1 1 5 5 2 t 1 7 3 0 1 1 0 1 1 7 7 7 1 1 7 9 2 h 1 7 8 1 1 1 0 0 1 8 3 2 1 1 8 6 2 e 1 8 4 9 1 1 0 3 1 8 9 6 1 1 6 1 2 c 1 9 9 8 1 1 0 0 2 0 4 0 1 1 6 0 2 a 2 0 6 4 1 0 9 9 2 1 1 9 1 1 5 4 2 l 2 1 3 8 1 0 9 5 2 1 6 3 1 1 8 5 2 m 2 1 8 5 1 0 9 8 2 2 8 4 1 1 5 0 2

p 1 3 9 8 3 3 1 9 8 9 3 9 2 l 2 1 2 8 7 6 2 3 0 9 6 3 2 a 2 6 4 8 7 3 3 2 5 9 3 1 2 c 3 4 6 8 7 3 3 9 4 9 3 2 2 e 4 1 6 8 7 6 4 6 9 9 4 2 2 a 5 9 0 8 7 4 6 5 4 9 3 3 2 t 6 8 1 8 7 2 7 2 5 9 6 2 2 t 8 0 5 8 6 4 8 6 0 9 7 5 2 h 8 6 9 8 8 2 9 2 7 9 7 5 2 e 9 4 6 8 7 9 9 9 9 9 4 1 2 c 1 1 1 1 8 8 6 1 1 6 6 9 4 2 2 e 1 1 6 8 8 8 2 1 2 1 1 9 4 6 2 n 1 2 3 0 8 8 4 1 2 8 4 9 4 2 2 t 1 3 0 3 8 8 8 1 3 4 8 9 7 3 2 e 1 3 5 5 8 8 3 1 4 1 4 9 4 2 2 r 1 4 3 9 8 8 4 1 4 8 7 9 4 0 2 o 1 5 9 4 8 7 8 1 6 4 6 9 3 7 2 f 1 6 5 7 8 7 6 1 6 9 7 9 5 5 2 h 1 7 6 3 8 7 9 1 8 2 3 9 6 3 2 e 1 8 3 5 8 7 5 1 8 8 9 9 3 0 2 r 1 9 0 1 8 8 2 1 9 5 8 9 3 1 2

b 2 0 2 7 8 8 4 2 0 8 1 9 7 3 2 e 2 0 9 4 8 8 2 2 1 3 8 9 3 5 2 i 2 1 6 3 8 8 4 2 1 8 1 9 5 5 2 n 2 2 0 2 8 8 4 2 2 5 9 9 3 4 2 g 2 2 7 9 8 3 5 2 3 3 2 9 2 9 2 . 2 3 7 0 8 8 9 2 3 8 8 9 0 8 2 S 1 6 7 6 5 2 2 1 1 7 5 5 2 h 2 3 6 6 6 1 2 9 7 7 5 4 2 e 3 0 7 6 5 1 3 6 0 7 1 3 2 s 4 3 0 6 5 0 4 6 9 7 2 5 2 e 4 7 6 6 5 5 5 3 5 7 1 8 2 n 5 4 8 6 6 0 6 0 6 7 1 5 2 s 6 2 8 6 5 7 6 6 2 7 2 5 2 e 6 8 2 6 6 0 7 4 5 7 2 2 2 d 7 5 9 6 4 7 8 1 5 7 4 0 2 r 8 8 0 6 5 0 9 4 2 7 0 7 2 a 9 5 3 6 5 0 1 0 1 6 7 0 8 2 t 1 0 3 5 6 6 1 1 0 7 8 7 5 8 2 h 1 0 8 7 6 5 3 1 1 5 0 7 5 0 2 e 1 1 6 3 6 5 2 1 2 2 3 7 1 5 2 r 1 2 3 6 6 6 6 1 2 8 3 7 1 0 2 t 1 3 4 4 6 4 8 1 3 9 6 7 5 6 2 h 1 4 0 4 6 6 1 1 4 6 2 7 5 3 2 a 1 4 7 6 6 6 2 1 5 3 9 7 1 3 2 n 1 5 3 9 6 5 4 1 5 9 7 7 1 0 2 f 1 6 6 1 6 5 5 1 7 1 5 7 5 2 2 e 1 7 3 6 6 5 8 1 7 8 5 7 2 2 2 l 1 8 0 4 6 5 8 1 8 2 6 7 5 1 2 t 1 8 5 0 6 5 5 1 9 0 3 7 5 0 2 h 1 9 5 5 6 6 9 2 0 1 1 7 5 2 2 i 2 0 2 1 6 6 6 2 0 4 1 7 3 6 2 m 2 0 6 0 6 5 3 2 1 5 4 7 1 6 2

a 1 3 8 4 2 4 2 1 0 5 0 5 2 w 2 4 2 4 2 9 3 3 4 4 9 2 2 a 3 6 7 4 2 4 4 4 3 4 9 1 2 k 4 6 3 4 3 0 5 3 5 5 1 0 2 e 5 4 8 4 3 2 6 1 6 5 0 3 2 n 6 3 9 4 2 6 7 0 1 4 9 7 2 b 8 2 2 4 3 0 8 9 2 5 2 4 2 e 9 2 0 4 3 2 9 7 9 4 9 6 2 s 1 0 3 2 4 3 1 1 0 7 6 4 9 7 2 i 1 1 0 4 4 3 6 1 1 2 6 5 1 7 2 d 1 1 6 4 4 3 2 1 2 2 3 5 1 9 2 e 1 2 5 5 4 2 9 1 3 1 7 5 0 2 2 h 1 4 2 0 4 3 6 1 4 9 1 5 3 2 2 e 1 5 0 4 4 3 2 1 5 7 2 5 0 8 2 r 1 5 9 3 4 4 3 1 6 5 0 5 0 1 2 . 1 6 7 3 4 5 7 1 6 9 1 4 7 7 2 W 1 3 3 3 3 1 0 2 3 3 3 4 1 2 3 h 2 6 3 3 3 0 4 3 1 7 3 4 0 8 3 e 3 4 2 3 3 0 8 3 9 4 3 3 6 4 3 n 4 1 9 3 3 1 4 4 8 0 3 3 7 0 3 h 5 8 7 3 3 1 5 6 4 4 3 4 1 4 3 e 6 6 4 3 3 1 1 7 1 8 3 3 7 8 3 t 7 9 7 3 3 1 5 8 4 1 3 4 1 0 3 u 8 6 1 3 3 0 6 9 0 8 3 3 6 8 3 r 9 3 3 3 3 1 6 9 8 8 3 3 6 7 3 n 1 0 0 9 3 3 1 0 1 0 7 1 3 3 7 8 3 e 1 0 8 1 3 3 0 8 1 1 3 2 3 3 7 2 3 d 1 1 4 0 3 2 9 9 1 1 8 6 3 4 0 3 3 t 1 2 6 5 3 3 0 5 1 3 0 9 3 3 9 7 3 o 1 3 2 5 3 3 0 5 1 3 7 6 3 3 5 5 3 l 1 4 7 2 3 3 1 3 1 4 9 4 3 3 9 6 3 o 1 5 2 0 3 3 0 9 1 5 6 4 3 3 6 1 3 o 1 5 8 7 3 3 0 0 1 6 3 2 3 3 5 9 3 k 1 6 5 4 3 3 0 3 1 7 1 7 3 3 8 3 3 a 1 7 7 3 3 2 9 8 1 8 3 2 3 3 5 6 3 t 1 8 4 8 3 3 0 1 1 8 8 7 3 3 8 7 3 h 1 9 6 2 3 2 9 8 2 0 1 9 3 3 9 4 3 e 2 0 3 6 3 2 9 7 2 0 8 7 3 3 5 8 3 r 2 0 9 9 3 3 0 3 2 1 5 6 3 3 5 4 3 , 2 1 8 8 3 2 8 1 2 2 0 3 3 3 1 8 3 s 2 2 5 9 3 2 9 1 2 2 9 7 3 3 6 7 3 h 2 3 1 9 3 2 9 8 2 3 7 9 3 3 8 0 3 e 2 3 8 5 3 2 9 1 2 4 4 1 3 3 5 1 3 h 1 2 5 3 1 0 4 1 8 2 3 2 1 0 3 o 1 8 7 3 0 9 9 2 3 7 3 1 5 5 3 p 2 5 1 3 0 6 7 3 0 8 3 1 5 8 3 e 3 1 9 3 1 0 3 3 6 8 3 1 7 3 3 d 3 8 8 3 0 8 6 4 3 2 3 1 7 9 3 h 4 6 7 3 0 8 6 5 2 9 3 1 7 4 3 e 5 3 7 3 0 8 0 5 9 2 3 1 5 0 3 w 6 8 2 3 0 9 0 7 6 7 3 1 5 2 3 o 7 7 7 3 0 8 8 8 2 8 3 1 4 6 3 u 8 4 2 3 0 6 8 8 9 6 3 1 4 1 3 l 9 1 3 3 0 8 5 9 3 2 3 1 7 0 3 d 9 4 8 3 0 7 9 1 0 0 0 3 1 6 2 3 s 1 0 5 0 3 0 8 2 1 0 8 6 3 1 3 8 3 e 1 1 0 2 3 0 8 3 1 1 5 6 3 1 3 7 3 e 1 1 6 5 3 0 7 8 1 2 2 5 3 1 4 1 3 : 1 2 4 7 3 0 8 6 1 2 7 3 3 1 5 2 3 H 1 5 0 2 8 6 5 2 2 6 2 9 9 0 3 e 2 6 2 2 8 8 0 3 0 9 2 9 4 4 3 r 3 3 2 2 8 8 8 3 7 6 2 9 4 2 3 h 4 7 1 2 8 8 0 5 3 0 2 9 8 1 3 a 5 4 4 2 8 7 6 5 9 4 2 9 3 0 3 i 6 1 2 2 8 7 6 6 2 8 2 9 5 6 3 r 6 4 6 2 8 8 4 6 9 9 2 9 2 9 3 : 7 2 8 2 8 9 0 7 4 6 2 9 5 2 3

t 8 0 5 2 8 7 8 8 5 3 2 9 6 4 3 h 8 6 8 2 8 8 1 9 1 9 2 9 6 5 3 e 9 2 6 2 8 7 5 9 8 1 2 9 3 9 3 u 1 0 6 4 2 8 6 1 1 1 2 1 2 9 3 0 3 t 1 1 4 0 2 8 6 6 1 1 8 6 2 9 6 0 3 t 1 2 0 1 2 8 7 5 1 2 4 0 2 9 4 9 3 e 1 2 6 4 2 8 6 7 1 3 2 0 2 9 2 6 3 r 1 3 2 6 2 8 7 6 1 3 8 0 2 9 1 8 3 d 1 4 7 8 2 8 5 0 1 5 2 9 2 9 5 4 3 a 1 5 4 3 2 8 4 5 1 6 0 1 2 8 9 8 3 r 1 6 1 3 2 8 5 2 1 6 7 1 2 8 9 9 3 k 1 6 9 2 2 8 5 2 1 7 6 2 2 9 3 3 3 o 1 8 5 1 2 8 5 1 1 8 9 2 2 9 0 4 3 f 1 9 1 5 2 8 5 1 1 9 5 4 2 9 3 4 3 s 2 0 3 2 2 8 4 1 2 0 7 9 2 9 1 1 3 t 2 0 9 2 2 8 4 6 2 1 3 2 2 9 2 8 3 a 2 1 4 2 2 8 4 3 2 2 0 1 2 8 9 9 3 r 2 2 0 4 2 8 4 7 2 2 5 8 2 8 9 2 3 l 2 2 8 6 2 8 4 2 2 3 0 7 2 9 3 2 3 e 2 3 2 1 2 8 4 2 2 3 7 9 2 9 0 7 3 s 2 3 9 6 2 8 4 0 2 4 3 2 2 8 9 6 3 s 2 4 3 7 2 8 2 2 2 4 7 6 2 8 9 3 3 n 1 4 4 2 6 6 4 2 1 2 2 7 3 6 3

i 2 2 7 2 6 6 0 2 4 8 2 7 3 5 3 g 2 7 7 2 6 3 3 3 3 9 2 7 1 3 3 h 3 4 7 2 6 6 5 4 1 5 2 7 4 8 3 t 4 3 4 2 6 6 2 4 7 4 2 7 4 7 3 s 5 9 1 2 6 5 5 6 3 3 2 7 1 8 3 p 6 6 0 2 6 2 4 7 1 2 2 7 1 3 3 i 7 4 3 2 6 5 3 7 6 2 2 7 2 5 3 l 7 9 0 2 6 5 5 8 1 3 2 7 3 1 3 l 8 2 0 2 6 5 3 8 4 2 2 7 4 4 3 i 8 6 7 2 6 5 0 8 9 2 2 7 1 9 3 n 9 2 5 2 6 4 7 9 8 1 2 6 9 5 3 g 1 0 0 1 2 6 1 2 1 0 5 5 2 6 9 4 3 a 1 1 5 2 2 6 4 6 1 2 2 3 2 7 0 4 3 c 1 2 4 0 2 6 3 4 1 2 9 2 2 6 9 0 3 r 1 3 0 2 2 6 4 4 1 3 4 9 2 6 9 2 3 o 1 3 6 0 2 6 4 1 1 4 0 3 2 6 8 7 3 s 1 4 2 2 2 6 3 9 1 4 5 6 2 6 9 5 3 s 1 4 7 1 2 6 3 4 1 5 0 3 2 6 9 0 3 t 1 5 8 8 2 6 2 2 1 6 3 4 2 7 1 9 3 h 1 6 5 6 2 6 2 9 1 7 0 7 2 7 1 5 3 e 1 7 2 0 2 6 2 4 1 7 7 0 2 6 8 4 3 b 1 8 4 7 2 6 2 6 1 9 0 9 2 7 1 3 3 l 1 9 2 4 2 6 2 9 1 9 4 2 2 7 1 4 3 u 1 9 7 3 2 6 1 5 2 0 3 0 2 6 7 5 3 e 2 0 5 3 2 6 1 7 2 1 0 4 2 6 7 8 3 s 2 1 6 0 2 6 1 6 2 1 9 8 2 6 8 0 3 i 2 2 3 4 2 6 1 8 2 2 5 1 2 6 9 3 3 l 2 2 8 1 2 6 1 2 2 3 0 9 2 7 0 5 3 k 2 3 2 1 2 6 1 7 2 3 8 4 2 6 9 7 3 U 1 3 4 2 4 4 1 2 0 3 2 5 2 6 3 n 2 0 0 2 4 3 7 2 5 7 2 4 9 2 3 d 2 6 7 2 4 2 9 3 0 7 2 5 1 1 3 e 3 0 9 2 4 3 5 3 5 1 2 4 8 4 3 r 3 5 2 2 4 4 0 3 9 7 2 4 9 2 3 s 4 1 5 2 4 3 9 4 4 8 2 4 9 8 3 h 4 5 5 2 4 4 2 5 0 7 2 5 2 1 3 e 5 2 0 2 4 4 5 5 6 3 2 4 9 2 3 e 5 7 3 2 4 4 3 6 1 3 2 4 9 1 3 t 6 3 0 2 4 4 0 6 6 8 2 5 2 8 3 . 6 8 8 2 4 4 6 7 0 4 2 4 6 3 3 H 1 5 3 2 2 0 4 2 2 2 2 3 2 4 3 e 2 4 4 2 2 1 7 2 9 4 2 2 8 8 3 r 3 2 3 2 2 3 2 3 6 5 2 2 8 3 3 f 4 2 7 2 2 1 6 4 7 1 2 3 1 6 3 a 4 9 0 2 2 1 8 5 5 4 2 2 7 9 3 c 5 6 2 2 2 1 9 6 0 8 2 2 7 7 3 e 6 1 7 2 2 1 5 6 6 9 2 2 7 9 3 : 6 8 2 2 2 0 5 7 0 2 2 2 5 9 3 p 7 6 5 2 1 7 0 8 2 6 2 2 7 0 3 a 8 3 6 2 2 0 6 8 9 5 2 2 5 9 3 l 9 0 5 2 2 1 2 9 2 5 2 2 9 4 3 e 9 3 8 2 2 0 6 9 8 6 2 2 7 3 3 a 1 0 6 8 2 2 0 0 1 1 3 2 2 2 5 5 3 s 1 1 5 4 2 1 9 5 1 1 8 5 2 2 5 4 3 s 1 2 7 8 2 1 8 0 1 3 1 3 2 2 5 4 3 p 1 3 3 2 2 1 6 0 1 3 9 0 2 2 5 5 3 r 1 4 0 0 2 1 9 9 1 4 4 6 2 2 4 9 3 i 1 4 6 9 2 2 0 0 1 4 8 7 2 2 6 4 3 n 1 5 0 9 2 1 9 9 1 5 6 6 2 2 4 9 3 g 1 5 8 3 2 1 5 9 1 6 4 5 2 2 4 8 3 s 1 7 1 7 2 1 9 2 1 7 5 0 2 2 5 9 3 n 1 7 7 1 2 1 8 5 1 8 2 7 2 2 4 1 3 o 1 8 4 4 2 1 8 6 1 8 8 5 2 2 3 7 3 w 1 8 9 9 2 1 8 8 1 9 8 2 2 2 3 6 3 , 2 0 0 7 2 1 6 4 2 0 2 3 2 2 0 6 3 g 2 0 8 7 2 1 5 2 2 1 4 3 2 2 3 2 3 l 2 1 5 3 2 1 7 8 2 1 7 8 2 2 6 3 3 o 2 1 9 5 2 1 7 1 2 2 4 0 2 2 2 7 3 w 2 2 5 8 2 1 7 2 2 3 2 6 2 2 2 6 3 i 2 3 4 7 2 1 7 8 2 3 6 3 2 2 4 6 3 n 2 3 8 3 2 1 7 2 2 4 3 8 2 2 3 0 3 g 2 4 5 6 2 1 4 0 2 5 1 1 2 2 1 9 3 w 1 6 5 1 9 7 7 2 4 2 2 0 4 2 3

i 2 6 3 1 9 8 1 2 8 4 2 0 6 3 3 t 2 9 7 1 9 7 3 3 4 3 2 0 5 9 3 h 3 4 6 1 9 6 7 4 1 3 2 0 6 7 3

l 5 0 3 1 9 8 0 5 2 7 2 0 7 5 3 i 5 3 8 1 9 8 0 5 5 9 2 0 5 0 3 g 5 8 6 1 9 4 4 6 4 8 2 0 3 5 3 h 6 4 4 1 9 6 7 7 0 9 2 0 6 1 3 t 7 1 5 1 9 8 1 7 5 3 2 0 6 9 3 s 8 4 6 1 9 7 8 8 7 8 2 0 4 3 3 t 8 9 4 1 9 7 4 9 3 5 2 0 7 5 3 o 9 5 7 1 9 7 5 1 0 0 0 2 0 3 5 3 l 1 0 3 3 1 9 8 4 1 0 5 1 2 0 6 5 3 e 1 0 7 1 1 9 7 5 1 1 3 4 2 0 4 7 3 n 1 1 4 5 1 9 8 5 1 2 0 3 2 0 4 7 3 f 1 2 8 2 1 9 7 2 1 3 3 6 2 0 6 8 3 r 1 3 4 0 1 9 7 6 1 3 9 0 2 0 3 0 3 o 1 3 9 4 1 9 6 6 1 4 4 3 2 0 2 6 3 m 1 4 5 7 1 9 6 6 1 5 3 3 2 0 2 7 3 t 1 6 0 5 1 9 6 6 1 6 5 7 2 0 6 2 3 h 1 6 6 0 1 9 6 9 1 7 1 2 2 0 6 3 3 e 1 7 1 7 1 9 7 0 1 7 7 3 2 0 3 6 3 m 1 8 4 6 1 9 5 8 1 9 5 1 2 0 3 8 3 o 1 9 7 7 1 9 6 5 2 0 2 9 2 0 1 7 3 o 2 0 5 2 1 9 6 1 2 1 0 7 2 0 1 6 3 n 2 1 2 6 1 9 6 6 2 1 9 6 2 0 2 2 3 . 2 2 2 8 1 9 8 7 2 2 4 3 2 0 0 5 3 H 1 5 6 1 7 4 9 2 3 1 1 8 6 2 3 e 2 4 8 1 7 4 8 3 0 2 1 8 2 4 3 r 3 0 8 1 7 5 4 3 6 9 1 8 0 7 3 b 4 2 6 1 7 5 2 4 9 1 1 8 5 4 3 o 5 1 0 1 7 5 0 5 6 0 1 8 0 6 3 d 5 9 0 1 7 5 0 6 4 4 1 8 4 1 3 y 6 6 9 1 7 2 3 7 3 0 1 8 0 7 3 : 7 4 3 1 7 6 2 7 6 5 1 8 3 5 3 s 8 5 5 1 7 5 2 8 9 3 1 8 2 9 3 u 9 0 4 1 7 5 8 9 5 5 1 8 0 8 3 g 9 6 8 1 7 2 7 1 0 3 0 1 8 1 2 3 g 1 0 4 5 1 7 2 2 1 1 0 0 1 8 1 0 3 e 1 1 1 8 1 7 5 8 1 1 7 4 1 8 2 0 3 s 1 1 9 4 1 7 5 4 1 2 3 3 1 8 2 3 3 t 1 2 5 0 1 7 6 0 1 2 9 7 1 8 5 5 3 i 1 3 1 9 1 7 6 6 1 3 3 7 1 8 3 1 3 v 1 3 6 1 1 7 5 6 1 4 1 3 1 8 1 4 3 e 1 4 1 8 1 7 5 8 1 4 7 5 1 8 2 2 3 c 1 5 6 9 1 7 4 4 1 6 2 0 1 8 1 9 3 u 1 6 2 9 1 7 4 5 1 6 9 3 1 8 1 1 3 r 1 7 1 4 1 7 5 4 1 7 7 5 1 8 1 1 3 v 1 7 9 6 1 7 5 2 1 8 4 9 1 8 1 3 3 a 1 8 5 3 1 7 3 9 1 9 1 6 1 8 0 2 3 t 1 9 3 2 1 7 4 6 1 9 7 5 1 8 3 8 3 u 1 9 9 5 1 7 4 3 2 0 5 7 1 8 0 3 3 r 2 0 7 7 1 7 5 2 2 1 2 8 1 8 0 3 3 e 2 1 3 9 1 7 4 5 2 1 8 8 1 8 0 7 3 s 2 2 0 5 1 7 4 1 2 2 4 1 1 8 0 5 3 b 1 4 6 1 5 2 9 2 1 2 1 6 4 3 3 e 2 2 7 1 5 2 6 2 8 0 1 5 9 0 3 n 2 8 5 1 5 3 4 3 4 5 1 5 9 3 3 e 3 5 7 1 5 3 4 4 0 9 1 5 9 7 3 a 4 1 9 1 5 3 4 4 8 1 1 5 9 0 3 t 4 9 0 1 5 3 5 5 3 2 1 6 2 3 3 h 5 4 5 1 5 2 5 6 1 0 1 6 2 7 3 t 6 8 5 1 5 2 4 7 4 7 1 6 2 9 3 h 7 3 6 1 5 2 4 7 9 9 1 6 2 6 3 e 8 0 4 1 5 1 7 8 7 3 1 5 8 8 3 c 9 6 1 1 5 2 0 1 0 1 7 1 5 9 0 3 o 1 0 2 1 1 5 2 1 1 0 7 1 1 5 7 6 3 v 1 0 8 7 1 5 2 4 1 1 4 3 1 5 8 4 3 e 1 1 4 8 1 5 2 4 1 2 0 3 1 5 8 6 3 r 1 2 0 9 1 5 2 9 1 2 5 1 1 5 7 7 3 l 1 2 6 4 1 5 2 5 1 2 9 0 1 6 1 3 3 e 1 3 1 0 1 5 2 1 1 3 6 6 1 5 8 5 3 t 1 3 8 5 1 5 2 7 1 4 2 7 1 6 0 8 3 , 1 4 7 7 1 5 0 3 1 4 9 5 1 5 3 9 3 a 1 5 6 0 1 5 0 9 1 6 2 4 1 5 8 3 3 l 1 6 3 4 1 5 2 3 1 6 5 8 1 6 0 8 3 s 1 6 7 0 1 5 0 6 1 7 1 0 1 5 8 1 3 o 1 7 3 1 1 5 0 6 1 7 8 1 1 5 6 6 3 o 1 8 5 3 1 4 9 9 1 9 0 2 1 5 5 8 3 f 1 9 2 5 1 5 0 6 1 9 7 2 1 5 9 6 3 s 2 0 5 1 1 5 0 3 2 0 9 1 1 5 6 9 3 i 2 1 1 2 1 5 0 1 2 1 3 0 1 5 8 8 3 l 2 1 5 6 1 5 0 2 2 1 7 7 1 5 8 7 3 k 2 1 8 8 1 5 0 4 2 2 5 7 1 5 8 8 3 , 2 2 8 0 1 4 8 2 2 2 9 6 1 5 1 2 3 e 1 6 2 1 3 1 6 2 2 7 1 3 8 9 3 m 2 5 9 1 3 1 4 3 4 2 1 3 8 5 3 b 3 6 8 1 3 0 7 4 2 3 1 4 0 6 3 l 4 4 1 1 3 1 4 4 6 3 1 4 1 2 3 a 4 9 5 1 2 9 5 5 6 2 1 3 6 4 3 z 5 8 2 1 2 9 7 6 4 2 1 3 6 9 3 o 6 6 1 1 3 0 5 7 1 6 1 3 6 3 3 n 7 2 4 1 3 1 0 7 9 1 1 3 7 0 3 e 8 0 7 1 3 0 6 8 7 2 1 3 6 8 3 d 8 9 5 1 2 9 7 9 5 3 1 3 9 0 3 w 1 0 5 2 1 2 9 8 1 1 2 4 1 3 5 9 3

i 1 1 5 2 1 3 0 4 1 1 7 4 1 3 9 7 3 t 1 1 9 3 1 3 0 2 1 2 4 3 1 3 8 5 3 h 1 2 5 4 1 2 9 3 1 3 1 3 1 3 9 1 3 a 1 4 0 0 1 3 0 3 1 4 6 4 1 3 5 4 3 f 1 5 2 7 1 2 8 8 1 5 7 7 1 3 8 5 3 a 1 5 9 4 1 2 9 3 1 6 5 1 1 3 4 5 3 i 1 6 6 5 1 2 9 3 1 6 8 4 1 3 6 2 3

r 1 7 0 5 1 2 9 4 1 7 5 6 1 3 4 3 3 l 1 7 7 0 1 2 9 3 1 7 9 4 1 3 7 8 3 y 1 8 1 7 1 2 5 7 1 8 7 5 1 3 4 6 3 e 1 9 5 0 1 2 7 5 2 0 1 5 1 3 4 3 3 m 2 0 2 9 1 2 6 9 2 1 0 1 1 3 3 8 3 b 2 1 2 0 1 2 7 5 2 1 6 7 1 3 6 1 3 r 2 1 8 4 1 2 7 4 2 2 3 4 1 3 2 7 3 o 2 2 4 7 1 2 6 3 2 2 9 0 1 3 2 5 3 i 2 3 0 4 1 2 7 7 2 3 2 2 1 3 5 6 3 d 2 3 4 5 1 2 6 8 2 3 9 0 1 3 4 9 3 e 2 3 9 7 1 2 6 8 2 4 4 5 1 3 3 0 3 d 2 4 5 2 1 2 6 1 2 5 0 0 1 3 5 5 3 p 1 3 7 1 0 4 2 1 9 4 1 1 6 4 3 a 2 0 9 1 0 8 5 2 7 4 1 1 4 5 3 i 2 9 4 1 0 8 9 3 2 2 1 1 9 4 3 r 3 5 2 1 0 9 0 4 1 0 1 1 4 4 3 o 5 0 9 1 0 7 5 5 6 0 1 1 3 8 3 f 5 7 5 1 0 7 0 6 1 6 1 1 6 0 3 w 7 0 2 1 0 7 5 7 8 4 1 1 2 9 3 h 7 8 1 1 0 7 5 8 3 9 1 1 6 8 3 i 8 5 6 1 0 7 2 8 7 7 1 1 5 5 3 t 8 9 8 1 0 7 4 9 4 3 1 1 6 2 3 e 9 6 3 1 0 7 3 1 0 1 9 1 1 4 2 3 c 1 1 3 0 1 0 7 2 1 1 8 8 1 1 4 5 3 r 1 2 0 6 1 0 7 7 1 2 6 1 1 1 3 1 3 a 1 2 7 6 1 0 7 1 1 3 4 1 1 1 2 9 3 n 1 3 5 2 1 0 7 5 1 4 0 6 1 1 3 3 3 e 1 4 2 6 1 0 7 2 1 4 8 7 1 1 3 3 3 s 1 5 1 1 1 0 6 8 1 5 5 4 1 1 3 9 3 , 1 6 1 0 1 0 5 5 1 6 2 9 1 0 9 9 3 t 1 6 9 0 1 0 6 4 1 7 3 0 1 1 6 0 3 h 1 7 4 3 1 0 5 7 1 7 9 9 1 1 5 8 3 e 1 8 0 8 1 0 5 8 1 8 6 8 1 1 2 3 3 i 1 8 9 5 1 0 7 0 1 9 1 5 1 1 4 1 3 r 1 9 2 7 1 0 6 9 1 9 8 2 1 1 2 0 3 t 2 0 8 7 1 0 5 6 2 1 2 6 1 1 5 8 3 h 2 1 3 9 1 0 5 1 2 2 0 6 1 1 5 0 3 r 2 2 1 0 1 0 4 9 2 2 5 8 1 1 0 3 3 o 2 2 7 6 1 0 4 2 2 3 1 5 1 0 9 9 3 a 2 3 3 0 1 0 4 2 2 3 8 2 1 0 9 8 3 t 2 3 8 7 1 0 4 9 2 4 2 8 1 1 3 9 3 s 2 4 4 9 1 0 3 8 2 4 8 0 1 1 1 2 3 c 1 1 4 8 6 7 1 7 9 9 5 9 3 r 1 8 0 8 7 1 2 2 7 9 2 5 3 i 2 2 7 8 7 1 2 4 5 9 5 2 3 m 2 6 4 8 6 5 3 5 3 9 2 7 3 s 3 8 1 8 6 1 4 1 7 9 3 2 3 o 4 3 5 8 6 7 4 9 1 9 2 1 3 n 5 0 9 8 6 3 5 7 1 9 2 2 3 w 6 5 7 8 6 0 7 4 1 9 2 1 3 i 7 5 6 8 5 7 7 7 6 9 4 3 3 t 7 9 4 8 5 0 8 3 8 9 3 6 3 h 8 4 8 8 4 6 9 2 6 9 4 5 3 m 1 0 0 8 8 4 2 1 1 1 0 9 1 4 3

a 1 1 2 4 8 4 5 1 1 7 9 9 0 6 3 t 1 1 9 8 8 4 3 1 2 3 3 9 4 1 3 i 1 2 6 2 8 5 0 1 2 8 5 9 2 8 3 n 1 3 1 1 8 4 5 1 3 7 6 9 1 2 3 g 1 3 9 3 8 1 7 1 4 5 7 9 0 3 3 f 1 5 5 4 8 3 7 1 6 0 6 9 3 5 3 r 1 6 2 2 8 4 1 1 6 7 6 8 9 8 3 e 1 6 8 9 8 4 2 1 7 4 8 9 0 4 3 n 1 7 6 4 8 4 2 1 8 2 1 9 0 3 3 z 1 8 4 9 8 4 5 1 9 0 7 9 0 5 3 y 1 9 4 8 8 0 8 2 0 1 2 8 9 9 3 , 2 0 5 7 8 2 3 2 0 7 5 8 6 2 3 d 2 1 4 6 8 3 2 2 2 0 0 9 2 4 3 a 2 2 2 8 8 3 4 2 2 8 6 8 9 2 3 n 2 3 0 0 8 3 3 2 3 5 2 8 9 1 3 c 2 3 6 2 8 2 5 2 4 1 2 8 9 0 3 i 2 4 2 8 8 2 5 2 4 4 9 9 0 5 3 n 1 1 7 6 4 7 1 8 2 7 1 8 3 g 2 0 4 6 1 4 2 7 1 7 1 2 3 a 4 1 2 6 4 4 4 8 7 7 1 2 3 n 5 0 5 6 4 9 5 6 7 7 0 4 3 d 5 9 9 6 3 1 6 5 1 7 2 9 3 d 7 7 9 6 3 0 8 3 5 7 3 6 3 u 8 4 2 6 2 5 9 2 3 6 9 0 3 e 9 3 9 6 2 7 9 8 8 6 9 1 3 l 1 0 0 1 6 2 4 1 0 2 4 7 2 6 3 i 1 0 4 1 6 3 4 1 0 6 7 7 0 9 3 n 1 0 8 9 6 3 6 1 1 5 1 6 9 0 3 g 1 1 6 5 6 0 3 1 2 2 3 6 8 9 3 i 1 3 0 5 6 3 9 1 3 2 6 7 2 3 3 n 1 3 3 5 6 3 3 1 3 9 6 6 9 6 3 m 1 4 7 4 6 2 6 1 5 6 6 6 9 4 3 i 1 5 7 4 6 3 3 1 5 9 5 7 1 3 3 d 1 6 1 0 6 2 1 1 6 6 0 7 1 0 3 a 1 6 9 2 6 2 5 1 7 5 4 6 8 5 3 i 1 7 6 3 6 3 1 1 7 8 4 6 9 4 3 r 1 8 0 6 6 2 8 1 8 6 8 6 7 9 3 , 1 9 0 5 6 1 2 1 9 2 2 6 4 8 3 a 2 0 0 8 6 2 2 2 0 7 4 6 8 4 3 g 2 0 9 0 5 8 4 2 1 5 2 6 7 4 3 a 2 1 7 3 6 0 3 2 2 4 0 6 6 6 3 i 2 2 3 9 6 1 2 2 2 6 4 6 9 0 3 n 2 2 8 3 6 1 2 2 3 4 1 6 7 0 3 s 2 3 6 2 6 0 1 2 3 9 5 6 6 6 3 t 2 4 1 9 6 1 1 2 4 6 0 6 9 8 3

a 1 3 8 4 4 2 2 0 9 5 0 3 3 f 2 7 4 4 2 4 3 2 7 5 3 2 3 i 3 4 4 4 3 6 3 6 6 5 0 7 3 e 3 7 8 4 2 4 4 3 9 4 8 9 3 l 4 5 5 4 2 2 4 7 6 5 1 7 3

d 4 9 1 4 2 0 5 3 5 5 0 9 3 o 6 4 1 4 1 3 6 9 3 4 8 2 3 f 7 1 2 4 1 2 7 5 0 5 1 1 3 g 8 2 4 3 7 9 8 9 0 4 8 5 3 o 9 0 6 4 0 8 9 5 4 4 7 6 3

l 9 8 6 4 0 5 1 0 1 0 5 0 7 3 d 1 0 4 1 4 0 2 1 0 9 7 5 0 6 3

B. Source Codes

B..1 Tess2Speech Mobile Application Base Path = Tess2Speech/

Path = Tess2Speech/build.gradle

// Top−l e v e l b u i l d f i l e w h e r e you c a n add c o n f i g u r a t i o n o p t i o n s common t o a l l sub−p r o j e c t s / m o d u l e s . b u i l d s c r i p t {

r e p o s i t o r i e s { j c e n t e r ( ) }

d e p e n d e n c i e s {

c l a s s p a t h ’ com . a n d r o i d . t o o l s . b u i l d : g r a d l e : 1 . 5 . 0 ’

// NOTE: Do n o t p l a c e y o u r a p p l i c a t i o n d e p e n d e n c i e s h e r e ; t h e y b e l o n g // i n t h e i n d i v i d u a l module b u i l d . g r a d l e f i l e s

} }

a l l p r o j e c t s { r e p o s i t o r i e s {

j c e n t e r ( ) }

}

Path = Tess2Speech/settings.gradle

i n c l u d e ’ : t e s s 2 s p e e c h ’

i n c l u d e ’ : l i b r a r i e s : a n d r o i d−p d f v i e w−m a s t e r : a n d r o i d−p d f v i e w ’ i n c l u d e ’ : l i b r a r i e s : t e s s−two ’

i n c l u d e ’ : l i b r a r i e s : g e s t u r e−i m a g e v i e w ’ i n c l u d e ’ : l i b r a r i e s : c r o p p e r−m a s t e r : c r o p p e r ’ i n c l u d e ’ : l i b r a r i e s : a n d r o i d−f i l e−p i c k e r a c t i v i t y ’

Path = Tess2Speech/libraries

This folder contains different open-source libraries used in developing Tess2Speech:

1. android-file-picker activity by Anders Kaloer [41]

2. android-pdfview-master by Joan Zapata [38]

3. cropper-master by ArthurHub [37]

4. epublib by Paul Siegman [40]

5. gesture-imageview by Jason Polites [36]

6. tess-two by Robert Theis [35]

Path = Tess2Speech/tess2Speech/build.gradle

a p p l y p l u g i n : ’ com . a n d r o i d . a p p l i c a t i o n ’ a n d r o i d {

c o m p i l e S d k V e r s i o n 23 b u i l d T o o l s V e r s i o n ’ 2 3 . 0 . 2 ’ d e f a u l t C o n f i g {

a p p l i c a t i o n I d ” a n t e r a a r o n . t e s s 2 s p e e c h ” m i n S d k V e r s i o n 16

t a r g e t S d k V e r s i o n 23 v e r s i o n C o d e 1 v e r s i o n N a m e ” 1 . 0 ”

s i g n i n g C o n f i g s i g n i n g C o n f i g s . r e l e a s e }

b u i l d T y p e s { r e l e a s e {

d e b u g g a b l e f a l s e m i n i f y E n a b l e d f a l s e p r o g u a r d F i l e s

g e t D e f a u l t P r o g u a r d F i l e ( ’ p r o g u a r d−a n d r o i d . t x t ’ ) , ’ p r o g u a r d−r u l e s . pro ’ s i g n i n g C o n f i g s i g n i n g C o n f i g s .

r e l e a s e }

}

p r o d u c t F l a v o r s { }

}

// r e p o s i t o r i e s { // m a v e n C e n t r a l ( )

//}

d e p e n d e n c i e s {

c o m p i l e f i l e T r e e ( i n c l u d e : [ ’∗. j a r ’ ] , d i r :

’ l i b s ’ )

t e s t C o m p i l e ’ j u n i t : j u n i t : 4 . 1 2 ’

c o m p i l e p r o j e c t ( ’ : l i b r a r i e s : t e s s−two ’ ) c o m p i l e p r o j e c t ( ’ : l i b r a r i e s : g e s t u r e−

i m a g e v i e w ’ )

c o m p i l e p r o j e c t ( ’ : l i b r a r i e s : a n d r o i d−

p d f v i e w−m a s t e r : a n d r o i d−p d f v i e w ’ ) c o m p i l e p r o j e c t ( ’ : l i b r a r i e s : c r o p p e r−m a s t e r

: c r o p p e r ’ )

c o m p i l e p r o j e c t ( ’ : l i b r a r i e s : a n d r o i d−f i l e− p i c k e r a c t i v i t y ’ )

c o m p i l e ’ com . a n d r o i d . s u p p o r t : appcompat−v7 : 2 3 . 1 . 1 ’

c o m p i l e ’ com . a n d r o i d . s u p p o r t : d e s i g n : 2 3 . 1 . 1 ’

c o m p i l e ’ com . a n d r o i d . s u p p o r t : s u p p o r t−v4 : 2 3 . 1 . 1 ’

c o m p i l e ’ commons−i o : commons−i o : 2 . 4 ’ c o m p i l e f i l e s ( ’ E : / Aaron / Dropbox / Workspace /

T e s s 2 S p e e c h / l i b r a r i e s / e p u b l i b / e p u b l i b

−c o r e−l a t e s t . j a r ’ )

c o m p i l e f i l e s ( ’ E : / Aaron / Dropbox / Workspace / T e s s 2 S p e e c h / l i b r a r i e s / e p u b l i b / s l f 4 j− a n d r o i d−1.6.1−RC1 . j a r ’ )

}

Path = Tess2Speech/tess2Speech/proguard-rules.pro

# Add p r o j e c t s p e c i f i c ProGuard r u l e s h e r e .

# By d e f a u l t , t h e f l a g s i n t h i s f i l e a r e appended t o f l a g s s p e c i f i e d

# i n E :\Aaron\A n d r o i d\s d k / t o o l s / p r o g u a r d / p r o g u a r d−a n d r o i d . t x t

# You c a n e d i t t h e i n c l u d e p a t h and o r d e r by c h a n g i n g t h e p r o g u a r d F i l e s

# d i r e c t i v e i n b u i l d . g r a d l e .

#

# For more d e t a i l s , s e e

# h t t p : / / d e v e l o p e r . a n d r o i d . com/ g u i d e / d e v e l o p i n g / t o o l s / p r o g u a r d . html

# Add any p r o j e c t s p e c i f i c k e e p o p t i o n s h e r e :

# I f y o u r p r o j e c t u s e s WebView w i t h JS , uncomment t h e f o l l o w i n g

# and s p e c i f y t h e f u l l y q u a l i f i e d c l a s s name t o t h e J a v a S c r i p t i n t e r f a c e

# c l a s s :

#−k e e p c l a s s m e m b e r s c l a s s f q c n . o f . j a v a s c r i p t . i n t e r f a c e . f o r . webview {

# p u b l i c ∗;

#}

Path = Tess2Speech/tess2Speech/src/main/AndroidManifest.xml

<?xml v e r s i o n=” 1 . 0 ” e n c o d i n g=” u t f−8”?>

<!−−

C o p y r i g h t 2 0 1 6 A n t e r Aaron M. C u s t o d i o L i c e n s e d u n d e r t h e Apache L i c e n s e , V e r s i o n

2 . 0 ( t h e ” L i c e n s e ”) ;

you may n o t u s e t h i s f i l e e x c e p t i n c o m p l i a n c e w i t h t h e L i c e n s e . You may o b t a i n a c o p y o f t h e L i c e n s e a t h t t p : //www. a p a c h e . o r g / l i c e n s e s /LICENSE−2.0 U n l e s s r e q u i r e d by a p p l i c a b l e l a w o r a g r e e d

t o i n w r i t i n g , s o f t w a r e

d i s t r i b u t e d u n d e r t h e L i c e n s e i s d i s t r i b u t e d on an ”AS I S ” BASIS ,

WITHOUT WARRANTIES OR CONDITIONS OFANYKIND ,

e i t h e r e x p r e s s o r i m p l i e d .

S e e t h e L i c e n s e f o r t h e s p e c i f i c l a n g u a g e g o v e r n i n g p e r m i s s i o n s and

l i m i t a t i o n s u n d e r t h e L i c e n s e .

−−>

<m a n i f e s t x m l n s : a n d r o i d=” h t t p : // s c h e m a s . a n d r o i d . com/ apk / r e s / a n d r o i d ” p a c k a g e=” a n t e r a a r o n . t e s s 2 s p e e c h ”>

<u s e s−p e r m i s s i o n a n d r o i d : n a m e=” a n d r o i d .

p e r m i s s i o n . READ EXTERNAL STORAGE” />

<u s e s−p e r m i s s i o n a n d r o i d : n a m e=” a n d r o i d .

p e r m i s s i o n . WRITE EXTERNAL STORAGE” />

<u s e s−p e r m i s s i o n a n d r o i d : n a m e=” a n d r o i d .

p e r m i s s i o n . READ INTERNAL STORAGE” />

<u s e s−p e r m i s s i o n a n d r o i d : n a m e=” a n d r o i d .

p e r m i s s i o n . WRITE INTERNAL STORAGE” />

<u s e s−p e r m i s s i o n a n d r o i d : n a m e=” a n d r o i d .

p e r m i s s i o n . READ USER DICTIONARY” />

<u s e s−p e r m i s s i o n a n d r o i d : n a m e=” a n d r o i d .

p e r m i s s i o n . READ PHONE STATE” />

<u s e s−f e a t u r e

a n d r o i d : n a m e=” a n d r o i d . h a r d w a r e . camera ” a n d r o i d : r e q u i r e d=” t r u e ” />

<a p p l i c a t i o n

a n d r o i d : a l l o w B a c k u p=” t r u e ” a n d r o i d : i c o n=”@mipmap/ l o g o ” a n d r o i d : l a b e l=” @ s t r i n g / app name ” a n d r o i d : l a r g e H e a p=” t r u e ”

a n d r o i d : s u p p o r t s R t l=” t r u e ” a n d r o i d : t h e m e=” @ s t y l e /AppTheme”>

<!−− S p l a s h S c r e e n A c t i v i t y −−>

<a c t i v i t y a n d r o i d : n a m e=” a n t e r a a r o n . t e s s 2 s p e e c h . A c t i v i t y S p l a s h S c r e e n ”

a n d r o i d : t h e m e=” @ s t y l e /AppTheme . NoActionBar ”

a n d r o i d : s c r e e n O r i e n t a t i o n=” p o r t r a i t ”>

<i n t e n t−f i l t e r>

<a c t i o n a n d r o i d : n a m e=” a n d r o i d . i n t e n t .

a c t i o n . MAIN” />

<c a t e g o r y a n d r o i d : n a m e=” a n d r o i d . i n t e n t . c a t e g o r y .LAUNCHER” />

</ i n t e n t−f i l t e r>

</ a c t i v i t y>

<!−−Main A c t i v i t y −−>

<a c t i v i t y

a n d r o i d : n a m e=” a n t e r a a r o n . t e s s 2 s p e e c h . A c t i v i t y M a i n ”

a n d r o i d : l a b e l=” @ s t r i n g / app name ” a n d r o i d : t h e m e=” @ s t y l e /AppTheme . NoActionBar ”>

</ a c t i v i t y>

<!−− R o t a t e A c t i v i t y −−>

<a c t i v i t y a n d r o i d : n a m e=” a n t e r a a r o n . t e s s 2 s p e e c h . A c t i v i t y R o t a t e ”

a n d r o i d : l a b e l=” R o t a t e Image ”

a n d r o i d : s c r e e n O r i e n t a t i o n=” p o r t r a i t ”>

</ a c t i v i t y>

<!−− P r e f e r e n c e A c t i v i t y −−>

<a c t i v i t y a n d r o i d : n a m e=” a n t e r a a r o n . t e s s 2 s p e e c h . A c t i v i t y S e t t i n g s ”>

</ a c t i v i t y>

<!−− Crop A c t i v i t y −−>

<a c t i v i t y a n d r o i d : n a m e=” a n t e r a a r o n . t e s s 2 s p e e c h . A c t i v i t y C r o p ”

a n d r o i d : l a b e l=” Crop Image ”>

</ a c t i v i t y>

<!−− F i l e B r o w s e r−−>

<a c t i v i t y a n d r o i d : n a m e=” k a l o e r . f i l e p i c k e r . F i l e P i c k e r A c t i v i t y ”

a n d r o i d : i c o n=”@mipmap/ l o g o ” a n d r o i d : e n a b l e d=” t r u e ” a n d r o i d : l a b e l=” Browse F i l e ” a n d r o i d : e x p o r t e d=” t r u e ”>

<i n t e n t−f i l t e r>

<a c t i o n a n d r o i d : n a m e=” a n d r o i d . i n t e n t . a c t i o n . GET CONTENT” />

<c a t e g o r y a n d r o i d : n a m e=” a n d r o i d . i n t e n t . c a t e g o r y . DEFAULT” />

<c a t e g o r y a n d r o i d : n a m e=” a n d r o i d . i n t e n t . c a t e g o r y .OPENABLE” />

<d a t a a n d r o i d : m i m e T y p e=”∗/∗” />

</ i n t e n t−f i l t e r>

</ a c t i v i t y>

</ a p p l i c a t i o n>

</ m a n i f e s t>

Path = Tess2Speech/tess2Speech/src/main/java/anteraaron/tess2speech/

Activity\_Crop.java

p a c k a g e a n t e r a a r o n . t e s s 2 s p e e c h ; i m p o r t a n d r o i d . c o n t e n t . I n t e n t ; i m p o r t a n d r o i d . n e t . U r i ; i m p o r t a n d r o i d . s u p p o r t . v7 . app .

AppCompatActivity ; i m p o r t a n d r o i d . o s . B u n d l e ; i m p o r t a n d r o i d . v i e w . View ; i m p o r t a n d r o i d . w i d g e t . B u t t o n ;

i m p o r t com . t h e a r t o f d e v . edmodo . c r o p p e r . CropImageView ;

i m p o r t j a v a . i o . F i l e ; /∗ ∗

∗ A c t i v i t y f o r c r o p p i n g I m a g e s u s i n g Edmodo C r o p p e r ( s e e . . . h t t p s : / / g i t h u b . com/

ArthurHub / Android−Image−C r o p p e r / w i k i ) .

∗ @author A n t e r Aaron M. C u s t o d i o

∗ @ v e r s i o n 2 0 1 6 . 3 . 2 2

∗/

p u b l i c c l a s s A c t i v i t y C r o p e x t e n d s

AppCompatActivity {

@ O v e r r i d e

p r o t e c t e d v o i d o n C r e a t e (f i n a l B u n d l e s a v e d I n s t a n c e S t a t e ) {

s u p e r. o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w (R . l a y o u t . a c t i v i t y c r o p ) ; // R e t r i e v e U r i o f t h e p a s s e d i m a g e f r o m

A c t i v i t y M a i n .

f i n a l U r i i m a g e U r i = g e t I n t e n t ( ) . g e t P a r c e l a b l e E x t r a (” i m a g e U r i ”) ; // C r e a t e Edmodo C r o p p e r ImageView . f i n a l CropImageView i m a g e V i e w c r o p = (

CropImageView ) f i n d V i e w B y I d (R . i d . CropImageView ) ;

i m a g e V i e w c r o p . s e t F i x e d A s p e c t R a t i o (f a l s e) ; i m a g e V i e w c r o p . s e t G u i d e l i n e s ( CropImageView .

G u i d e l i n e s . ON TOUCH) ;

i m a g e V i e w c r o p . s e t I m a g e U r i A s y n c ( i m a g e U r i ) ; // C r e a t e c o n f i r m c r o p b u t t o n

f i n a l B u t t o n b u t t o n c r o p c o n f i r m = ( B u t t o n ) f i n d V i e w B y I d (R . i d . b u t t o n c r o p c o n f i r m ) ; b u t t o n c r o p c o n f i r m . s e t O n C l i c k L i s t e n e r (new

View . O n C l i c k L i s t e n e r ( ) {

@ O v e r r i d e

p u b l i c v o i d o n C l i c k ( View v ) { // C a l l s an AsyncTask t h a t s a v e s t h e

c r o p p e d i m a g e t o a f i l e

new T a s k S a v e C r o p p e d I m a g e ( A c t i v i t y C r o p . t h i s, new T a s k S a v e C r o p p e d I m a g e . A s y n c R e s p o n s e ( ) {

@ O v e r r i d e

p u b l i c v o i d p r o c e s s F i n i s h e d ( F i l e f i l e ) { // R e t u r n f i l e a f t e r s a v i n g t h e c r o p p e d i m a g e t o g e t f i l e p a t h .

f i n a l U r i f i l e U r i = U r i . f r o m F i l e ( f i l e ) ; //Add t h e c r o p p e d i m a g e f i l e t o g a l l e r y . L i b r a r i e s . g a l l e r y A d d P i c ( f i l e U r i ) ; // P a s s t h e f i l e u r i b a c k t o A c t i v i t y M a i n w i t h OK r e s u l t .

f i n a l I n t e n t i n t e n t = new I n t e n t ( ) ; i n t e n t . p u t E x t r a (” i m a g e U r i ”, f i l e U r i ) ; s e t R e s u l t (RESULT OK, i n t e n t ) ;

// C l e a r imageView

i m a g e V i e w c r o p . c l e a r I m a g e ( ) ;

i m a g e V i e w c r o p . d e s t r o y D r a w i n g C a c h e ( ) ; i m a g e V i e w c r o p . r e m o v e A l l V i e w s ( ) ; f i n i s h ( ) ;

}

}) . e x e c u t e ( i m a g e V i e w c r o p . g e t C r o p p e d I m a g e ( ) ) ;// t h e p a r a m e t e r f o r d o I n B a c k g r o u n d i n

T a s k C r o p i s t h e c r o p p e d i m a g e . }

}) ;

// C r e a t e c a n c e l c r o p b u t t o n .

f i n a l B u t t o n b u t t o n c r o p c a n c e l = ( B u t t o n ) f i n d V i e w B y I d (R . i d . b u t t o n c r o p c a n c e l ) ; b u t t o n c r o p c a n c e l . s e t O n C l i c k L i s t e n e r (new

View . O n C l i c k L i s t e n e r ( ) {

@ O v e r r i d e

p u b l i c v o i d o n C l i c k ( View v ) {

// R e t u r n s c a n c e l r e s u l t t o A c t i v i t y M a i n . s e t R e s u l t (RESULT CANCELED) ;

f i n i s h ( ) ; }

}) ; } }

Path = Tess2Speech/tess2Speech/src/main/java/anteraaron/tess2speech/

Activity\_Main.java

/∗

∗ C o p y r i g h t 2 0 1 6 A n t e r Aaron M. C u s t o d i o

∗ L i c e n s e d u n d e r t h e Apache L i c e n s e , V e r s i o n 2 . 0 ( t h e ” L i c e n s e ” ) ;

∗ you may n o t u s e t h i s f i l e e x c e p t i n c o m p l i a n c e w i t h t h e L i c e n s e .

∗ You may o b t a i n a c o p y o f t h e L i c e n s e a t

∗ h t t p : / /www. a p a c h e . o r g / l i c e n s e s /LICENSE

−2.0

∗ U n l e s s r e q u i r e d by a p p l i c a b l e l a w o r a g r e e d t o i n w r i t i n g , s o f t w a r e

∗ d i s t r i b u t e d u n d e r t h e L i c e n s e i s d i s t r i b u t e d on an ”AS I S ” BASIS ,

∗ WITHOUT WARRANTIES OR CONDITIONS OF ANY

KIND , e i t h e r e x p r e s s o r i m p l i e d .

∗ S e e t h e L i c e n s e f o r t h e s p e c i f i c l a n g u a g e g o v e r n i n g p e r m i s s i o n s and

∗ l i m i t a t i o n s u n d e r t h e L i c e n s e .

∗/

p a c k a g e a n t e r a a r o n . t e s s 2 s p e e c h ; i m p o r t a n d r o i d . app . A c t i v i t y ; i m p o r t a n d r o i d . c o n t e n t . I n t e n t ; i m p o r t a n d r o i d . g r a p h i c s . Bitmap ; i m p o r t a n d r o i d . media . AudioManager ; i m p o r t a n d r o i d . n e t . U r i ;

i m p o r t a n d r o i d . o s . AsyncTask ; i m p o r t a n d r o i d . o s . S y s t e m C l o c k ;

i m p o r t a n d r o i d . s u p p o r t . v4 . app . F r a g m e n t T r a n s a c t i o n ;

i m p o r t a n d r o i d . s u p p o r t . v7 . app . A c t i o n B a r ; i m p o r t a n d r o i d . o s . B u n d l e ;

i m p o r t a n d r o i d . s u p p o r t . v7 . app . AppCompatActivity ;

i m p o r t a n d r o i d . s u p p o r t . v7 . w i d g e t . T o o l b a r ; i m p o r t a n d r o i d . u t i l . Log ;

i m p o r t a n d r o i d . v i e w . Menu ; i m p o r t a n d r o i d . v i e w . MenuItem ; i m p o r t a n d r o i d . v i e w . View ; i m p o r t a n d r o i d . w i d g e t . B u t t o n ; i m p o r t a n d r o i d . w i d g e t . ImageView ; i m p o r t a n d r o i d . w i d g e t . T o a s t ;

i m p o r t com . j o a n z a p a t a . p d f v i e w . PDFView ; i m p o r t com . p o l i t e s . a n d r o i d . G e s t u r e I m a g e V i e w ; i m p o r t j a v a . i o . F i l e ;

i m p o r t j a v a . n e t . MalformedURLException ; i m p o r t k a l o e r . f i l e p i c k e r . F i l e P i c k e r A c t i v i t y ; /∗ ∗

∗ Main A c t i v i t y f o r T e s s 2 S p e e c h .

∗ I n c l u d e s d i s p l a y i n g o f Fragments , T o o l b a r , Logo , c a l l i n g I n t e n t s , I n t e n t R e s u l t s e t c .

∗ @author A n t e r Aaron M. C u s t o d i o

∗ U n i v e r s i t y o f t h e P h i l i p p i n e s M a n i l a

∗ B . S . Computer S c i e n c e S t u d e n t

∗ @ s i n c e 2 0 1 6 . 3 . 2 2

∗/

p u b l i c c l a s s A c t i v i t y M a i n e x t e n d s

AppCompatActivity{

/∗ ∗

∗ An i n n e r c l a s s t h a t c o n t a i n s C o n s t a n t s f o r a c t i v i t y R e s u l t s .

∗/

p u b l i c s t a t i c f i n a l c l a s s A c t i v i t y R e s u l t { p u b l i c s t a t i c f i n a l i n t

CAPTURE IMAGE ACTIVITY REQUEST CODE = 1 0 0 ; // R e q u e s t c o d e f o r c a p t u r e i m a g e p u b l i c s t a t i c f i n a l i n t

BROWSE IMAGE ACTIVITY REQUEST CODE = 2 0 0 ; // R e q u e s t c o d e f o r b r o w s e i m a g e

p u b l i c s t a t i c f i n a l i n t

BROWSE MULTIPLE IMAGE ACTIVITY REQUEST CODE

= 2 0 1 ; // R e q u e s t c o d e f o r b r o w s e m u l t i p l e i m a g e

p u b l i c s t a t i c f i n a l i n t

BROWSE PDF ACTIVITY REQUEST CODE = 2 0 2 ; // R e q u e s t c o d e f o r b r o w s e p d f

p u b l i c s t a t i c f i n a l i n t

BROWSE PDF CONVERT TO IMAGE ACTIVITY REQUEST CODE

= 2 0 3 ; // R e q u e s t c o d e f o r b r o w s e p d f p u b l i c s t a t i c f i n a l i n t

BROWSE EPUB ACTIVITY REQUEST CODE = 2 0 4 ; // R e q u e s t c o d e f o r b r o w s e p d f

p u b l i c s t a t i c f i n a l i n t

ROTATE BITMAP ACTIVITY REQUEST CODE = 3 0 0 ; // R e q u e s t c o d e f o r r o t a t e i m a g e p u b l i c s t a t i c f i n a l i n t

CROP IMAGE ACTIVITY REQUEST CODE = 4 0 0 ; // R e q u e s t c o d e f o r c r o p i m a g e

} /∗ ∗

∗ An i n n e r c l a s s t h a t c o n t a i n s C o n s t a n t s f o r A p p l i c a t i o n S t a t e s .

∗/

p u b l i c s t a t i c f i n a l c l a s s S t a t e {

p u b l i c s t a t i c f i n a l i n t IS CANVAS = 0 ; //

A p p l i c a t i o n i s d i s p l a y i n g t h e c o n v e r t e d t e x t .

p u b l i c s t a t i c f i n a l i n t IS IMAGE = 1 ; //

A p p l i c a t i o n i s d i s p l a y i n g t h e i n p u t i m a g e p u b l i c s t a t i c f i n a l i n t IS PDF = 2 ; //

A p p l i c a t i o n i s d i s p l a y i n g PDF p u b l i c s t a t i c f i n a l i n t IS EPUB = 3 ; //

A p p l i c a t i o n i s d i s p l a y i n g EPUB

p u b l i c s t a t i c f i n a l i n t IS TEXT FROM CANVAS

= 4 ; // A p p l i c a t i o n i s d i s p l a y i n g t h e c o n v e r t e d t e x t f r o m c a n v a s .

p u b l i c s t a t i c f i n a l i n t IS TEXT FROM IMAGE = 5 ; // A p p l i c a t i o n i s d i s p l a y i n g t h e c o n v e r t e d t e x t f r o m i m a g e f r a g m e n t . p u b l i c s t a t i c f i n a l i n t IS TEXT FROM PDF =

6 ; // A p p l i c a t i o n i s d i s p l a y i n g t h e c o n v e r t e d t e x t f r o m PDF f r a g m e n t .

p u b l i c s t a t i c f i n a l i n t IS TEXT FROM EPUB = 7 ; // A p p l i c a t i o n i s d i s p l a y i n g t h e c o n v e r t e d t e x t f r o m Epub f r a g m e n t . }

p u b l i c s t a t i c B u t t o n b u t t o n p l a y , b u t t o n t e x t

;

p r i v a t e AsyncTask<B o o l e a n , B o o l e a n , B o o l e a n>

s a v e ;

p r i v a t e AsyncTask<S t r i n g , Void , Void> s p e a k ; p r i v a t e s t a t i c U r i i m a g e U r i , p d f U r i , e p u b U r i ;

// Image , PDF o r , Epub u r i b e i n g d i s p l a y e d

p u b l i c s t a t i c i n t s t a t e ; // D e t e r m i n e t h e c u r r e n t s t a t e o r Fragment d i s p l a y e d i n t h e App

p r i v a t e l o n g l a s t C l i c k T i m e ; // v a r i a b l e t h a t s a v e s t h e l a s t c l i c k e d t i m e .

@ O v e r r i d e

p r o t e c t e d v o i d o n C r e a t e (f i n a l B u n d l e s a v e d I n s t a n c e S t a t e ) {

s u p e r. o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w (R . l a y o u t . a c t i v i t y m a i n ) ; f i n a l T o o l b a r t o o l b a r = ( T o o l b a r )

f i n d V i e w B y I d (R . i d . t o o l b a r ) ; t o o l b a r . s e t N a v i g a t i o n I c o n (n u l l) ; s e t S u p p o r t A c t i o n B a r ( t o o l b a r ) ; // l o g o i n a c t i o n b a r

f i n a l A c t i o n B a r ab = g e t S u p p o r t A c t i o n B a r ( ) ; i f ( ab != n u l l) {

ab . s e t L o g o (R . mipmap . l o g o ) ;

ab . s e t D i s p l a y U s e L o g o E n a b l e d (t r u e) ; // remove b a c k b u t t o n i n t o o l b a r ab . s e t D i s p l a y H o m e A s U p E n a b l e d (f a l s e) ; ab . s e t H o m e B u t t o n E n a b l e d (f a l s e) ; }

// I n i t i a l i z e v a r i a b l e s s t a t e = S t a t e . IS CANVAS ; t h i s. l a s t C l i c k T i m e = 0 ;

// a l w a y s c h a n g e t h e m u s i c volume when p r e s s i n g b u t t o n

s e t V o l u m e C o n t r o l S t r e a m ( AudioManager . STREAM MUSIC) ;

// C a s t U I s c r e a t e U I ( ) ; }

@ O v e r r i d e

p u b l i c v o i d o n S t a r t ( ){ // c o n s t r u c t l i b r a r i e s new L i b r a r i e s (t h i s) ; s u p e r. o n S t a r t ( ) ; }

@ O v e r r i d e

p u b l i c b o o l e a n o n C r e a t e O p t i o n s M e n u (f i n a l Menu menu ){

// I n f l a t e t h e menu ; t h i s a d d s i t e m s t o t h e a c t i o n b a r i f i t i s p r e s e n t .

g e t M e n u I n f l a t e r ( ) . i n f l a t e (R . menu . menu main , menu ) ;

f i n a l MenuItem s a v e T e x t = menu . f i n d I t e m (R . i d . s a v e T e x t ) ;

f i n a l MenuItem s a v e P d f = menu . f i n d I t e m (R . i d . s a v e P d f ) ;

f i n a l MenuItem s a v e A u d i o = menu . f i n d I t e m (R . i d . s a v e A u d i o ) ;

i f ( s t a t e == S t a t e . IS CANVAS | | s t a t e ==

S t a t e . IS IMAGE | | s t a t e == S t a t e . IS PDF

| | s t a t e == S t a t e . IS EPUB ) { // D i s a b l e s a v e a s . t x t menu s a v e T e x t . s e t E n a b l e d (f a l s e) ;

s a v e T e x t . s e t T i t l e (” S a v e a s . t x t ( C o n v e r t t e x t f i r s t ) ”) ;

// D i s a b l e s a v e a s . p d f menu s a v e P d f . s e t E n a b l e d (f a l s e) ;

s a v e P d f . s e t T i t l e (” S a v e a s . p d f ( C o n v e r t t e x t f i r s t ) ”) ;

// D i s a b l e s a v e a u d i o menu s a v e A u d i o . s e t E n a b l e d (f a l s e) ;

s a v e A u d i o . s e t T i t l e (” S a v e Audio ( C o n v e r t t e x t f i r s t ) ”) ;

} e l s e {

// E n a b l e s a v e a s . t x t menu s a v e T e x t . s e t E n a b l e d (t r u e) ;

s a v e T e x t . s e t T i t l e (” S a v e a s . t x t ”) ; // E n a b l e s a v e a s . p d f menu

s a v e P d f . s e t E n a b l e d (t r u e) ;

s a v e P d f . s e t T i t l e (” S a v e a s . p d f ”) ; // E n a b l e s a v e a u d i o menu

s a v e A u d i o . s e t E n a b l e d (t r u e) ; s a v e A u d i o . s e t T i t l e (” S a v e Audio ”) ; }

r e t u r n t r u e; }

@ O v e r r i d e

p u b l i c b o o l e a n o n O p t i o n s I t e m S e l e c t e d (f i n a l MenuItem i t e m ) {

/∗H a n d l e a c t i o n b a r i t e m c l i c k s h e r e . The a c t i o n b a r w i l l

a u t o m a t i c a l l y h a n d l e c l i c k s on t h e Home/Up b u t t o n , s o l o n g a s you s p e c i f y a p a r e n t a c t i v i t y i n

A n d r o i d M a n i f e s t . xml .∗/

// S t o p t e x t t o s p e e c h and t e s s e r a c t L i b r a r i e s . t t s . s t o p ( ) ;

L i b r a r i e s . t e s s e r a c t . c l e a r ( ) ;

b u t t o n p l a y . s e t T e x t (R . s t r i n g . b u t t o n p l a y ) ; f i n a l i n t i d = i t e m . g e t I t e m I d ( ) ;

s w i t c h ( i d ) {

// T o o l b a r camera i c o n on C l i c k c a s e R . i d . camera : {

// i f camera b u t t o n i s c l i c k e d f i n a l I n t e n t C a m e r a camera =new

I n t e n t C a m e r a (t h i s) ;

f i n a l I n t e n t i n t e n t = camera . t a k e P i c t u r e ( )

;

i f ( i n t e n t != n u l l) {

// S t a r t i n t e n t a c t i v i t y f o r camera s t a r t A c t i v i t y F o r R e s u l t ( i n t e n t , A c t i v i t y R e s u l t .

CAPTURE IMAGE ACTIVITY REQUEST CODE) ; } e l s e {

// E r r o r n o t i f i c a t i o n

T o a s t . makeText (t h i s, ”An e r r o r h a s o c c u r e d ”, T o a s t . LENGTH SHORT) . show ( ) ; }

b r e a k; }

// T o o l b a r b r o w s e i m a g e i c o n on C l i c k c a s e R . i d . b r o w s e : {

// I f b r o w s e i m a g e b u t t o n i s c l i c k e d f i n a l I n t e n t i n t e n t = I n t e n t B r o w s e F i l e s .

b r o w s e I m a g e ( ) ; i f ( i n t e n t != n u l l) {

// S t a r t i n t e n t a c t i v i t y f o r b r o w s i n g f i l e s t a r t A c t i v i t y F o r R e s u l t ( I n t e n t .

c r e a t e C h o o s e r ( i n t e n t , ” Complete a c t i o n u s i n g ”) , A c t i v i t y R e s u l t .

BROWSE IMAGE ACTIVITY REQUEST CODE) ; } e l s e {

// E r r o r n o t i f i c a t i o n

T o a s t . makeText (t h i s, ”An e r r o r h a s o c c u r e d ! ”, T o a s t . LENGTH SHORT) . show ( ) ; }

b r e a k; }

// T o o l b a r b r o w s e p d f on C l i c k c a s e R . i d . b r o w s e P d f : {

// I f b r o w s e PDF b u t t o n i s c l i c k e d

f i n a l I n t e n t i n t e n t = I n t e n t B r o w s e F i l e s . b r o w s e P d f ( ) ;

i f( i n t e n t != n u l l) {

// S t a r t i n t e n t a c t i v i t y f o r b r o w s i n g p d f s t a r t A c t i v i t y F o r R e s u l t ( I n t e n t .

c r e a t e C h o o s e r ( i n t e n t , ” Complete a c t i o n u s i n g ”) , A c t i v i t y R e s u l t .

BROWSE PDF ACTIVITY REQUEST CODE) ; } e l s e {

// E r r o r n o t i f i c a t i o n

T o a s t . makeText (t h i s, ”An e r r o r h a s o c c u r e d ! ”, T o a s t . LENGTH SHORT) . show ( ) ; }

b r e a k; }

// T o o l b a r b r o w s e epub on C l i c k c a s e R . i d . browseEpub : {

// I f b r o w s e epub b u t t o n i s c l i c k e d f i n a l I n t e n t i n t e n t = I n t e n t B r o w s e F i l e s .

browseEpub ( ) ; i f( i n t e n t != n u l l) {

// S t a r t i n t e n t a c t i v i t y f o r b r o w s i n g p d f s t a r t A c t i v i t y F o r R e s u l t ( I n t e n t .

c r e a t e C h o o s e r ( i n t e n t , ” Complete a c t i o n u s i n g ”) , A c t i v i t y R e s u l t .

BROWSE EPUB ACTIVITY REQUEST CODE) ; } e l s e {

// E r r o r n o t i f i c a t i o n

T o a s t . makeText (t h i s, ”An e r r o r h a s o c c u r e d ! ”, T o a s t . LENGTH SHORT) . show ( ) ; }

b r e a k; }

// T o o l b a r s a v e a s . t x t on c l i c k c a s e R . i d . s a v e T e x t : {

// Launch S a v e T e x t AsyncTask new T a s k S a v e T e x t (t h i s) ; b r e a k;

}

// T o o l b a r s a v e a u d i o on c l i c k c a s e R . i d . s a v e A u d i o : {

// Launch S a v e A u d i o AsyncTask new T a s k S a v e A u d i o (t h i s) ; b r e a k;

}

// T o o l b a r s a v e PDF on c l i c k c a s e R . i d . s a v e P d f : {

// Launch S a v e P d f AsyncTask new T a s k S a v e P d f (t h i s) ; // u s e f r a g m e n t p d f a s Fragment s t a t e = S t a t e . IS PDF ;

// D i s p l a y PDFViewer Fragment d i s p l a y F r a g m e n t ( ) ;

b r e a k; }

// T o o l b a r C o n v e r t i m a g e t o s e a r c h a b l e PDF on c l i c k

c a s e R . i d . imageToPdf : {

// U s e r h a s an o p t i o n t o c h o o s e m u l t i p l e i m a g e s and c o m p i l e them t o o n e p d f f i n a l I n t e n t i n t e n t = I n t e n t B r o w s e F i l e s .

b r o w s e M u l t i p l e I m a g e s ( ) ; i f( i n t e n t != n u l l) {

// S t a r t i n t e n t a c t i v i t y f o r b r o w s i n g f i l e s t a r t A c t i v i t y F o r R e s u l t ( I n t e n t .

c r e a t e C h o o s e r ( i n t e n t , ” Complete a c t i o n u s i n g ”) , A c t i v i t y R e s u l t .

BROWSE MULTIPLE IMAGE ACTIVITY REQUEST CODE ) ;

} e l s e {

// E r r o r n o t i f i c a t i o n

T o a s t . makeText (t h i s, ”An e r r o r h a s o c c u r e d ! ”, T o a s t . LENGTH SHORT) . show ( ) ; }

b r e a k; }

// T o o l b a r C o n v e r t PDF t o i m a g e on c l i c k c a s e R . i d . pdfToImage : {

// Choose w h i c h PDF t o c o n v e r t

f i n a l I n t e n t i n t e n t = I n t e n t B r o w s e F i l e s . b r o w s e P d f ( ) ;

i f( i n t e n t != n u l l) {

// S t a r t i n t e n t a c t i v i t y f o r b r o w s i n g p d f s t a r t A c t i v i t y F o r R e s u l t ( I n t e n t .

c r e a t e C h o o s e r ( i n t e n t , ” Complete a c t i o n u s i n g ”) , A c t i v i t y R e s u l t .

BROWSE PDF CONVERT TO IMAGE ACTIVITY REQUEST CODE ) ;

} e l s e {

// E r r o r n o t i f i c a t i o n

T o a s t . makeText (t h i s, ”An e r r o r h a s o c c u r e d ! ”, T o a s t . LENGTH SHORT) . show ( ) ; }

b r e a k; }

// T o o l b a r S e t t i n g s on c l i c k c a s e R . i d . s e t t i n g s : {

// S t a r t t h e p r e f e r e n c e s c r e e n

f i n a l I n t e n t i n t e n t = new I n t e n t (t h i s, A c t i v i t y S e t t i n g s .c l a s s) ;

s t a r t A c t i v i t y F o r R e s u l t ( i n t e n t , 0 ) ; b r e a k;

}

// T o o l b a r E x i t on C l i c k c a s e R . i d . e x i t : {

// E x i t a c t i v i t y f i n i s h ( ) ; b r e a k; }

// d e f a u l t d e f a u l t: {

b r e a k; } }

r e t u r n s u p e r. o n O p t i o n s I t e m S e l e c t e d ( i t e m ) ; }

/∗ ∗

∗ C r e a t e UI f o r t h e A p p l i c a t i o n .

∗/

p u b l i c v o i d c r e a t e U I ( ) { // C r e a t e imageView f o r PDFs .

L i b r a r i e s . p d f V i e w = ( PDFView ) f i n d V i e w B y I d (R . i d . p d f V i e w ) ;

// C r e a t e imageView f o r I n p u t I m a g e s . L i b r a r i e s . imageView = ( G e s t u r e I m a g e V i e w )

f i n d V i e w B y I d (R . i d . imageView ) ; // I f c o n v e r t e d t e x t b u t t o n i s p r e s s e d . b u t t o n t e x t = ( B u t t o n ) f i n d V i e w B y I d (R . i d .

b u t t o n t e x t ) ;

b u t t o n t e x t . s e t O n C l i c k L i s t e n e r (new View . O n C l i c k L i s t e n e r ( ) {

@ O v e r r i d e

p u b l i c v o i d o n C l i c k ( View v ) { // d o u b l e−c l i c k i n g p r e v e n t i o n , u s i n g

t h r e s h o l d o f 1 0 0 0 ms

i f ( S y s t e m C l o c k . e l a p s e d R e a l t i m e ( ) − l a s t C l i c k T i m e < 1 0 0 0 ) {

r e t u r n; }

l a s t C l i c k T i m e = S y s t e m C l o c k . e l a p s e d R e a l t i m e ( ) ;

// Check i f t h e u s e r w a n t s t o r e t a i n t h e p r e v i o u s c o n v e r t e d t e x t .

i f ( b u t t o n t e x t . g e t T e x t ( ) . e q u a l s ( g e t R e s o u r c e s ( ) . g e t S t r i n g (R . s t r i n g . b u t t o n t e x t ) ) ) {

F r a g m e n t C o n v e r t e d T e x t . checkAppend ( ) ; s w i t c h ( s t a t e ) {

// C o n v e r t i m a g e t o t e x t , b u t do n o t p l a y .

c a s e S t a t e . IS IMAGE : {

new ToText ( A c t i v i t y M a i n .t h i s) . e x e c u t e ( i m a g e U r i , f a l s e) ;

b r e a k; }

// I n PDF Fragment c a s e S t a t e . IS PDF : {

L i b r a r i e s . pdfToText (f a l s e) ; b r e a k;

}

// I n EPUB Fragment c a s e S t a t e . IS EPUB : {

new Task WebViewToText ( A c t i v i t y M a i n . t h i s) . e x e c u t e (f a l s e) ;

b r e a k; }

// I n Canvas

c a s e S t a t e . IS CANVAS : {

// S a v e t e x t i n c a n v a s b u t do n o t p l a y . new T a s k S a v e C a n v a s ( A c t i v i t y M a i n .t h i s) . e x e c u t e (f a l s e) ;

b r e a k; } d e f a u l t:

b r e a k; }

// S e t c u r r e n t s t a t e s w i t c h ( s t a t e ) {

c a s e S t a t e . IS CANVAS :

s t a t e = S t a t e . IS TEXT FROM CANVAS ; b r e a k;

c a s e S t a t e . IS IMAGE :

s t a t e = S t a t e . IS TEXT FROM IMAGE ; b r e a k;

c a s e S t a t e . IS PDF :

s t a t e = S t a t e . IS TEXT FROM PDF ; b r e a k;

c a s e S t a t e . IS EPUB :

s t a t e = S t a t e . IS TEXT FROM EPUB ; b r e a k;

d e f a u l t: b r e a k; }

// D i s p l a y Text Fragment d i s p l a y F r a g m e n t ( ) ; b u t t o n t e x t .

s e t C o m p o u n d D r a w a b l e s W i t h I n t r i n s i c B o u n d s ( 0 , R . mipmap . i c a c t i o n e y e c l o s e d , 0 , 0 ) ;

b u t t o n t e x t . s e t T e x t (R . s t r i n g . b u t t o n t e x t b a c k ) ;

F r a g m e n t C o n v e r t e d T e x t . e d i t T e x t . r e q u e s t F o c u s ( ) ;

} e l s e {

// S e t c u r r e n t s t a t e s w i t c h ( s t a t e ) {

c a s e S t a t e . IS TEXT FROM CANVAS : s t a t e = S t a t e . IS CANVAS ; b r e a k;

c a s e S t a t e . IS TEXT FROM IMAGE : s t a t e = S t a t e . IS IMAGE ; b r e a k;

c a s e S t a t e . IS TEXT FROM PDF : s t a t e = S t a t e . IS PDF ; b r e a k;

c a s e S t a t e . IS TEXT FROM EPUB : s t a t e = S t a t e . IS EPUB ; b r e a k;

d e f a u l t: b r e a k; }

// D i s p l a y Canvas Fragment / I n p u t I m a g e Fragment .

d i s p l a y F r a g m e n t ( ) ; b u t t o n t e x t .

s e t C o m p o u n d D r a w a b l e s W i t h I n t r i n s i c B o u n d s ( 0 , R . mipmap . i c a c t i o n e y e o p e n , 0 , 0 ) ;

b u t t o n t e x t . s e t T e x t (R . s t r i n g . b u t t o n t e x t )

;

F r a g m e n t D r a w i n g C a n v a s . d r a w i n g V i e w . r e q u e s t F o c u s ( ) ;

}

// r e f r e s h a c t i v i t y menu i n v a l i d a t e O p t i o n s M e n u ( ) ; }

}) ;

// I f b a c k b u t t o n i n p d f i s p r e s s e d .

F r a g m e n t P d f V i e w e r . b u t t o n p d f b a c k = ( B u t t o n ) f i n d V i e w B y I d (R . i d . b u t t o n p d f b a c k ) ; F r a g m e n t P d f V i e w e r . b u t t o n p d f b a c k .

s e t O n C l i c k L i s t e n e r (new View . O n C l i c k L i s t e n e r ( ) {

@ O v e r r i d e

p u b l i c v o i d o n C l i c k ( View v ) { // d o u b l e−c l i c k i n g p r e v e n t i o n , u s i n g

t h r e s h o l d o f 1 0 0 0 ms

i f ( S y s t e m C l o c k . e l a p s e d R e a l t i m e ( ) − l a s t C l i c k T i m e < 1 0 0 0 ) {

r e t u r n;

}

l a s t C l i c k T i m e = S y s t e m C l o c k . e l a p s e d R e a l t i m e ( ) ;

// C a n c e l s p e a k i n g when b a c k b u t t o n i s p r e s s e d .

i f ( s a v e != n u l l) { s a v e . c a n c e l (t r u e) ;

} e l s e i f ( s p e a k != n u l l) { s p e a k . c a n c e l (t r u e) ; }

L i b r a r i e s . t t s . s t o p ( ) ; L i b r a r i e s . t e s s e r a c t . c l e a r ( ) ;

b u t t o n p l a y . s e t T e x t (R . s t r i n g . b u t t o n p l a y ) ; // s e t s t a t e

s t a t e = S t a t e . IS CANVAS ;

L i b r a r i e s . imageView . s e t I m a g e D r a w a b l e (n u l l)

;

d i s p l a y F r a g m e n t ( ) ;

// Check i f t h e u s e r w a n t s t o r e t a i n t h e p r e v i o u s c o n v e r t e d t e x t .

F r a g m e n t C o n v e r t e d T e x t . checkAppend ( ) ; }

}) ;

// I f p l a y b u t t o n i s p r e s s e d

b u t t o n p l a y = ( B u t t o n ) f i n d V i e w B y I d (R . i d . b u t t o n p l a y ) ;

b u t t o n p l a y . s e t O n C l i c k L i s t e n e r (new View . O n C l i c k L i s t e n e r ( ) {

@ O v e r r i d e

p u b l i c v o i d o n C l i c k ( View v ) { // a l l o w d o u b l e c l i c k on p l a y . l a s t C l i c k T i m e = S y s t e m C l o c k .

e l a p s e d R e a l t i m e ( ) ; s w i t c h ( s t a t e ) {

// P l a y o n l y i f i t i s i n DrawingCanvas mode .

c a s e S t a t e . IS CANVAS : { // I f u s e r i s on Canvas .

F r a g m e n t C o n v e r t e d T e x t . checkAppend ( ) ; i f ( b u t t o n p l a y . g e t T e x t ( ) . e q u a l s ( g e t R e s o u r c e s ( ) . g e t S t r i n g (R . s t r i n g . b u t t o n p l a y ) ) ) {

s a v e = new T a s k S a v e C a n v a s ( A c t i v i t y M a i n .t h i s) ;

s a v e . e x e c u t e (t r u e) ; } e l s e {

s a v e . c a n c e l (t r u e) ; L i b r a r i e s . t t s . s t o p ( ) ; L i b r a r i e s . t e s s e r a c t . c l e a r ( ) ; // Re−e n a b l e b u t t o n s

A c t i v i t y M a i n . b u t t o n t e x t . s e t E n a b l e d ( t r u e) ;

A c t i v i t y M a i n . b u t t o n t e x t . s e t C l i c k a b l e ( t r u e) ;

b u t t o n p l a y .

s e t C o m p o u n d D r a w a b l e s W i t h I n t r i n s i c B o u n d s ( 0 , R . mipmap . i c a c t i o n p l a y b a c k p l a y , 0 , 0 ) ;

b u t t o n p l a y . s e t T e x t (R . s t r i n g . b u t t o n p l a y ) ;

} b r e a k; }

// I f u s e r i s on d i s p l a y p d f f r a g m e n t . c a s e S t a t e . IS PDF : {

F r a g m e n t C o n v e r t e d T e x t . checkAppend ( ) ; i f ( b u t t o n p l a y . g e t T e x t ( ) . e q u a l s ( g e t R e s o u r c e s ( ) . g e t S t r i n g (R . s t r i n g . b u t t o n p l a y ) ) ) {

L i b r a r i e s . pdfToText (t r u e) ; } e l s e {

L i b r a r i e s . t t s . s t o p ( ) ; L i b r a r i e s . t e s s e r a c t . c l e a r ( ) ; // Re−e n a b l e b u t t o n s

A c t i v i t y M a i n . b u t t o n t e x t . s e t E n a b l e d ( t r u e) ;

A c t i v i t y M a i n . b u t t o n t e x t . s e t C l i c k a b l e ( t r u e) ;

b u t t o n p l a y .

s e t C o m p o u n d D r a w a b l e s W i t h I n t r i n s i c B o u n d s ( 0 , R . mipmap . i c a c t i o n p l a y b a c k p l a y , 0 , 0 ) ;

b u t t o n p l a y . s e t T e x t (R . s t r i n g . b u t t o n p l a y ) ;

} b r e a k; }

// I f t h e u s e r i s on C o n v e r t Image . c a s e S t a t e . IS IMAGE : {

F r a g m e n t C o n v e r t e d T e x t . checkAppend ( ) ; i f ( b u t t o n p l a y . g e t T e x t ( ) . e q u a l s ( g e t R e s o u r c e s ( ) . g e t S t r i n g (R . s t r i n g . b u t t o n p l a y ) ) ) {

new ToText ( A c t i v i t y M a i n .t h i s) . e x e c u t e ( i m a g e U r i , t r u e) ;

} e l s e {

L i b r a r i e s . t t s . s t o p ( ) ; L i b r a r i e s . t e s s e r a c t . c l e a r ( ) ; // Re−e n a b l e b u t t o n s

A c t i v i t y M a i n . b u t t o n t e x t . s e t E n a b l e d ( t r u e) ;

A c t i v i t y M a i n . b u t t o n t e x t . s e t C l i c k a b l e ( t r u e) ;

b u t t o n p l a y .

s e t C o m p o u n d D r a w a b l e s W i t h I n t r i n s i c B o u n d s ( 0 , R . mipmap . i c a c t i o n p l a y b a c k p l a y , 0 , 0 ) ;

b u t t o n p l a y . s e t T e x t (R . s t r i n g . b u t t o n p l a y ) ;

} b r e a k; }

// I f t h e u s e r i s on Epub c a s e S t a t e . IS EPUB : {

i f ( b u t t o n p l a y . g e t T e x t ( ) . e q u a l s ( g e t R e s o u r c e s ( ) . g e t S t r i n g (R . s t r i n g . b u t t o n p l a y ) ) ) {

new Task WebViewToText ( A c t i v i t y M a i n . t h i s) . e x e c u t e (t r u e) ;

} e l s e {

L i b r a r i e s . t t s . s t o p ( ) ; L i b r a r i e s . t e s s e r a c t . c l e a r ( ) ; // Re−e n a b l e b u t t o n s

A c t i v i t y M a i n . b u t t o n t e x t . s e t E n a b l e d ( t r u e) ;

A c t i v i t y M a i n . b u t t o n t e x t . s e t C l i c k a b l e ( t r u e) ;

b u t t o n p l a y .

s e t C o m p o u n d D r a w a b l e s W i t h I n t r i n s i c B o u n d s ( 0 , R . mipmap . i c a c t i o n p l a y b a c k p l a y , 0 , 0 ) ;

b u t t o n p l a y . s e t T e x t (R . s t r i n g . b u t t o n p l a y ) ;

} b r e a k; }

// P l a y d i r e c t l y i f i t ’ s a c o n v e r t e d t e x t f r a g m e n t .

d e f a u l t: {

i f ( b u t t o n p l a y . g e t T e x t ( ) . e q u a l s ( g e t R e s o u r c e s ( ) . g e t S t r i n g (R . s t r i n g . b u t t o n p l a y ) ) ) {

s p e a k = new ToSpeech ( ) ;

s p e a k . e x e c u t e ( F r a g m e n t C o n v e r t e d T e x t . e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;

} e l s e {

s p e a k . c a n c e l (t r u e) ; L i b r a r i e s . t t s . s t o p ( ) ; L i b r a r i e s . t e s s e r a c t . c l e a r ( ) ; // Re−e n a b l e b u t t o n s

A c t i v i t y M a i n . b u t t o n t e x t . s e t E n a b l e d ( t r u e) ;

A c t i v i t y M a i n . b u t t o n t e x t . s e t C l i c k a b l e ( t r u e) ;

b u t t o n p l a y .

s e t C o m p o u n d D r a w a b l e s W i t h I n t r i n s i c B o u n d s ( 0 , R . mipmap . i c a c t i o n p l a y b a c k p l a y , 0 , 0 ) ;

b u t t o n p l a y . s e t T e x t (R . s t r i n g . b u t t o n p l a y ) ;

} b r e a k; } } } }) ;

// I f r o t a t e b u t t o n i s p r e s s e d . F r a g m e n t I n p u t I m a g e . b u t t o n r o t a t e .

s e t O n C l i c k L i s t e n e r (new View . O n C l i c k L i s t e n e r ( ) {

@ O v e r r i d e

p u b l i c v o i d o n C l i c k ( View v ) { // d o u b l e−c l i c k i n g p r e v e n t i o n , u s i n g

t h r e s h o l d o f 1 0 0 0 ms

i f ( S y s t e m C l o c k . e l a p s e d R e a l t i m e ( ) − l a s t C l i c k T i m e < 1 0 0 0 ){

r e t u r n; }

l a s t C l i c k T i m e = S y s t e m C l o c k . e l a p s e d R e a l t i m e ( ) ;

// C r e a t e i n t e n t t o l a u n c h

f i n a l I n t e n t i n t e n t = new I n t e n t (

A c t i v i t y M a i n .t h i s, A c t i v i t y R o t a t e .c l a s s ) ;

i n t e n t . p u t E x t r a (” i m a g e U r i ”, i m a g e U r i ) ; s t a r t A c t i v i t y F o r R e s u l t ( i n t e n t ,

A c t i v i t y R e s u l t .

ROTATE BITMAP ACTIVITY REQUEST CODE) ; }

}) ;

// I f c r o p b u t t o n i n i n p u t i m a g e i s p r e s s e d F r a g m e n t I n p u t I m a g e . b u t t o n c r o p .

s e t O n C l i c k L i s t e n e r (new View . O n C l i c k L i s t e n e r ( ) {

@ O v e r r i d e

p u b l i c v o i d o n C l i c k ( View v ) { // d o u b l e−c l i c k i n g p r e v e n t i o n , u s i n g

t h r e s h o l d o f 1 0 0 0 ms

i f ( S y s t e m C l o c k . e l a p s e d R e a l t i m e ( ) − l a s t C l i c k T i m e < 1 0 0 0 ){

r e t u r n; }

l a s t C l i c k T i m e = S y s t e m C l o c k . e l a p s e d R e a l t i m e ( ) ;

// C r e a t e i n t e n t t o l a u n c h

I n t e n t i n t e n t = new I n t e n t ( A c t i v i t y M a i n . t h i s, A c t i v i t y C r o p .c l a s s) ;

i n t e n t . p u t E x t r a (” i m a g e U r i ”, i m a g e U r i ) ; s t a r t A c t i v i t y F o r R e s u l t ( i n t e n t ,

A c t i v i t y R e s u l t .

CROP IMAGE ACTIVITY REQUEST CODE) ; }

}) ;

// I f b a c k b u t t o n i n i n p u t i m a g e i s p r e s s e d F r a g m e n t I n p u t I m a g e . b u t t o n b a c k .

s e t O n C l i c k L i s t e n e r (new View . O n C l i c k L i s t e n e r ( ) {

@ O v e r r i d e

p u b l i c v o i d o n C l i c k ( View v ) { // d o u b l e−c l i c k i n g p r e v e n t i o n , u s i n g

t h r e s h o l d o f 1 0 0 0 ms

i f ( S y s t e m C l o c k . e l a p s e d R e a l t i m e ( ) − l a s t C l i c k T i m e < 1 0 0 0 ){

r e t u r n; }

l a s t C l i c k T i m e = S y s t e m C l o c k . e l a p s e d R e a l t i m e ( ) ;

// C a n c e l s p e a k i n g when b a c k b u t t o n i s p r e s s e d

i f ( s a v e != n u l l) { s a v e . c a n c e l (t r u e) ;

} e l s e i f ( s p e a k != n u l l) { s p e a k . c a n c e l (t r u e) ; }

L i b r a r i e s . t t s . s t o p ( ) ; L i b r a r i e s . t e s s e r a c t . c l e a r ( ) ;

b u t t o n p l a y . s e t T e x t (R . s t r i n g . b u t t o n p l a y ) ; // s e t s t a t e

s t a t e = S t a t e . IS CANVAS ;

L i b r a r i e s . imageView . s e t I m a g e D r a w a b l e (n u l l)

;

d i s p l a y F r a g m e n t ( ) ;

// Check i f t h e u s e r w a n t s t o r e t a i n t h e p r e v i o u s c o n v e r t e d t e x t

F r a g m e n t C o n v e r t e d T e x t . checkAppend ( ) ; }

}) ;

// H i d e o t h e r f r a g m e n t s . Only show c a n v a s f r a g m e n t

d i s p l a y F r a g m e n t ( ) ; }

@ O v e r r i d e

p r o t e c t e d v o i d o n S a v e I n s t a n c e S t a t e (f i n a l B u n d l e s a v e d I n s t a n c e S t a t e ) {

s u p e r. o n S a v e I n s t a n c e S t a t e ( s a v e d I n s t a n c e S t a t e ) ;

// S a v e t h e App ’ s s t a t e when App s t a t e i s c h a n g e d .

i f ( D i r e c t o r i e s . imageFromCameraUri != n u l l) {

// S a v e i m a g e t a k e n by camera a f t e r r o t a t i o n .

s a v e d I n s t a n c e S t a t e . p u t S t r i n g (” c a m e r a I m a g e U r i ”, D i r e c t o r i e s . imageFromCameraUri . t o S t r i n g ( ) ) ; }

i f ( i m a g e U r i != n u l l && s t a t e == S t a t e .

IS IMAGE ) {

// S a v e i m a g e i n imageView a f t e r r o t a t i o n . s a v e d I n s t a n c e S t a t e . p u t P a r c e l a b l e (”

i m a g e D i s p l a y e d ”, i m a g e U r i ) ;

} e l s e i f ( p d f U r i != n u l l && s t a t e == S t a t e .

IS PDF ) {

// S a v e PDF i n imageView a f t e r r o t a t i o n . s a v e d I n s t a n c e S t a t e . p u t P a r c e l a b l e (”

p d f D i s p l a y e d ”, p d f U r i ) ;

} e l s e i f ( e p u b U r i != n u l l && s t a t e == S t a t e . IS EPUB ) {

s a v e d I n s t a n c e S t a t e . p u t P a r c e l a b l e (” e p u b D i s p l a y e d ”, e p u b U r i ) ; i f ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n tB y T a g (” f r a g m e n t e p u b ”) . i s V i s i b l e ( ) ) {

s a v e d I n s t a n c e S t a t e . p u t S t r i n g (” h t m l C o n t e n t ” , Fragment EPubViewer TOC . h t m l C o n t e n t ) ; }

}

// S a v e c u r r e n t s t a t e o f f r a g m e n t s a f t e r r o t a t i o n .

s a v e d I n s t a n c e S t a t e . p u t I n t (” s t a t e ”, s t a t e ) ; // S a v e t e x t s i n E d i t T e x t V i e w a f t e r r o t a t i o n . s a v e d I n s t a n c e S t a t e . p u t S t r i n g (” e d i t T e x t ”,

F r a g m e n t C o n v e r t e d T e x t . e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;

}

@ S u p p r e s s W a r n i n g s (” C o n s t a n t C o n d i t i o n s ”)

@ O v e r r i d e

p r o t e c t e d v o i d o n R e s t o r e I n s t a n c e S t a t e (f i n a l B u n d l e s a v e d I n s t a n c e S t a t e ) {

// R e s t o r e t h e App ’ s s t a t e when App s t a t e i s c h a n g e d .

s u p e r. o n R e s t o r e I n s t a n c e S t a t e ( s a v e d I n s t a n c e S t a t e ) ;

i f ( s a v e d I n s t a n c e S t a t e . c o n t a i n s K e y (” s t a t e ”) ) {

// R e s t o r e s t a t e o f f r a g m e n t s a f t e r r o t a t i o n .

s t a t e = s a v e d I n s t a n c e S t a t e . g e t I n t (” s t a t e ”) ; d i s p l a y F r a g m e n t ( ) ;

}

i f ( s a v e d I n s t a n c e S t a t e . c o n t a i n s K e y (” c a m e r a I m a g e U r i ”) ) {

// R e s t o r e i m a g e t a k e n by camera a f t e r r o t a t i o n

D i r e c t o r i e s . imageFromCameraUri = U r i . p a r s e ( s a v e d I n s t a n c e S t a t e . g e t S t r i n g (”

c a m e r a I m a g e U r i ”) ) ; }

i f ( s a v e d I n s t a n c e S t a t e . c o n t a i n s K e y (” e d i t T e x t

”) ) {

// R e s t o r e t e x t i n E d i t T e x t V i e w a f t e r r o t a t i o n

F r a g m e n t C o n v e r t e d T e x t . e d i t T e x t . s e t T e x t ( s a v e d I n s t a n c e S t a t e . g e t S t r i n g (” e d i t T e x t ”) )

; }

i f ( s a v e d I n s t a n c e S t a t e . c o n t a i n s K e y (” i m a g e D i s p l a y e d ”) && s t a t e == S t a t e .

IS IMAGE ) {

// R e s t o r e i m a g e i n imageView a f t e r r o t a t i o n i m a g e U r i = s a v e d I n s t a n c e S t a t e . g e t P a r c e l a b l e

(” i m a g e D i s p l a y e d ”) ; s e t I m a g e ( ) ;

} e l s e i f ( s a v e d I n s t a n c e S t a t e . c o n t a i n s K e y (” i m a g e D i s p l a y e d ”) && s t a t e == S t a t e . IS PDF ) {

// R e s t o r e PDF i n imageView a f t e r r o t a t i o n p d f U r i = s a v e d I n s t a n c e S t a t e . g e t P a r c e l a b l e (”

p d f D i s p l a y e d ”) ;

L i b r a r i e s . d i s p l a y P d f ( p d f U r i ) ;

} e l s e i f ( s a v e d I n s t a n c e S t a t e . c o n t a i n s K e y (” e p u b D i s p l a y e d ”) && s t a t e == S t a t e . IS EPUB ) {

e p u b U r i = s a v e d I n s t a n c e S t a t e . g e t P a r c e l a b l e (

” e p u b D i s p l a y e d ”) ;

// R e c r e a t e EPUB t a b l e o f c o n t e n t s

f i n a l Fragment EPubViewer TOC f r a g m e n t = ( Fragment EPubViewer TOC )

g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n tB y T a g (” f r a g m e n t e p u b t o c ”) ; f r a g m e n t . c r e a t e A d a p t e r ( e p u b U r i , D i r e c t o r i e s

. EPUB CACHE DIR) ; // D i s p l a y webView

i f ( s a v e d I n s t a n c e S t a t e . c o n t a i n s K e y (”

h t m l C o n t e n t ”) ) {

f i n a l S t r i n g h t m l C o n t e n t =

s a v e d I n s t a n c e S t a t e . g e t S t r i n g (” h t m l C o n t e n t

”) ;

// C o n v e r t EPUB CACHE DIR t o URL s t r i n g S t r i n g u r l = n u l l;

t r y {

u r l = new F i l e ( D i r e c t o r i e s . EPUB CACHE DIR

) . toURI ( ) . toURL ( ) . t o S t r i n g ( ) + F i l e . s e p a r a t o r + ”OEBPS” + F i l e . s e p a r a t o r ;

} c a t c h ( MalformedURLException e ) {

Log . e (” U r l e r r o r ”, ” S t a c k t r a c e : ”, e ) ; }

Fragment EPubViewer . webView .

loadDataWithBaseURL ( u r l , h t m l C o n t e n t , ” t e x t / html ”, ” u t f−8”, n u l l) ;

// H i d e c u r r e n t f r a g m e n t and d i s p l a y f r a g m e n t e p u b

f i n a l F r a g m e n t T r a n s a c t i o n f t = g e t S u p p o r t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( ) ;

f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) . f i nd F r a gm e n t By T a g (” f r a g m e n t e p u b t o c ”) ) ; f t . show ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t e p u b ”) ) ; f t . commit ( ) ;

} } }

@ O v e r r i d e

p r o t e c t e d v o i d o n A c t i v i t y R e s u l t (f i n a l i n t r e q u e s t C o d e , f i n a l i n t r e s u l t C o d e , f i n a l I n t e n t d a t a ) {

s u p e r. o n A c t i v i t y R e s u l t ( r e q u e s t C o d e , r e s u l t C o d e , d a t a ) ;

s w i t c h ( r e q u e s t C o d e ) {

// R e s u l t f r o m Camera A c t i v i t y . c a s e A c t i v i t y R e s u l t .

CAPTURE IMAGE ACTIVITY REQUEST CODE : {

i f ( r e s u l t C o d e == RESULT OK) { // Use f r a g m e n t i m a g e a s Fragment . s t a t e = S t a t e . IS IMAGE ;

// D i s p l a y I n p u t I m a g e . d i s p l a y F r a g m e n t ( ) ;

// Put i m a g e i n I n p u t I m a g e f r a g m e n t . i m a g e U r i = D i r e c t o r i e s . imageFromCameraUri

;

s e t I m a g e ( ) ;

L i b r a r i e s . g a l l e r y A d d P i c ( i m a g e U r i ) ; // Image c a p t u r e d and s a v e d on t h e d i r e c t o r y .

T o a s t . makeText (t h i s, ” Image s a v e d t o : ” + i m a g e U r i . g e t P a t h ( ) , T o a s t . LENGTH LONG) . show ( ) ;

} e l s e i f ( r e s u l t C o d e == RESULT CANCELED) {

// Image c a p t u r e c a n c e l l e d by t h e u s e r . T o a s t . makeText (t h i s, ” Image c a p t u r e c a n c e l l e d ”, T o a s t . LENGTH SHORT) . show ( ) ; } e l s e {

//An e r r o r h a s o c c u r e d d u r i n g s a v i n g . T o a s t . makeText (t h i s, ”An e r r o r h a s o c c u r e d ”, T o a s t . LENGTH LONG) . show ( ) ; }

b r e a k; }

// R e s u l t f r o m b r o w s e i m a g e . c a s e A c t i v i t y R e s u l t .

BROWSE IMAGE ACTIVITY REQUEST CODE : {

i f ( r e s u l t C o d e == RESULT OK) { i f ( d a t a . g e t D a t a ( ) == n u l l && d a t a . h a s E x t r a ( F i l e P i c k e r A c t i v i t y .

EXTRA FILE PATH ) ) {

// I f b u i l t−i n f i l e b r o w s e r i s u s e d ( a n d r o i d−f i l e−p i c k e r a c t i v i t y ) .

i m a g e U r i = U r i . f r o m F i l e (new F i l e ( d a t a . g e t S t r i n g E x t r a ( F i l e P i c k e r A c t i v i t y . EXTRA FILE PATH ) ) ) ;

} e l s e {

// I f o t h e r f i l e b r o w s e r s a r e u s e d . i m a g e U r i = d a t a . g e t D a t a ( ) ;

}

// Check i f i m a g e U r i i s n o t n u l l and h a s p r o p e r i m a g e f o r m a t , r e t u r n e r r o r n o t i c e i f i t i s n u l l o r i n wrong f o r m a t .

i f ( i m a g e U r i != n u l l &&

I n t e n t B r o w s e F i l e s . c h e c k I m a g e E x t e n s i o n ( t h i s, i m a g e U r i ) ) {

// Use f r a g m e n t i m a g e a s Fragment . s t a t e = S t a t e . IS IMAGE ;

// D i s p l a y I n p u t I m a g e . d i s p l a y F r a g m e n t ( ) ; // S e t i m a g e t o imageView s e t I m a g e ( ) ;

} e l s e {

T o a s t . makeText (t h i s, ” S e l e c t an i m a g e w i t h t h e a p p r o p r i a t e f o r m a t . ”, T o a s t . LENGTH LONG) . show ( ) ;

}

} e l s e i f ( r e s u l t C o d e == RESULT CANCELED)

{

// Image c a p t u r e c a n c e l l e d by t h e u s e r . T o a s t . makeText (t h i s, ” Browse Image c a n c e l l e d ”, T o a s t . LENGTH SHORT) . show ( ) ; } e l s e {

//An e r r o r h a s o c c u r e d d u r i n g s a v i n g . T o a s t . makeText (t h i s, ”An e r r o r h a s o c c u r e d ”, T o a s t . LENGTH LONG) . show ( ) ; }

b r e a k; }

// R e s u l t f r o m b r o w s e PDF . c a s e A c t i v i t y R e s u l t .

BROWSE PDF ACTIVITY REQUEST CODE : {

i f ( r e s u l t C o d e == RESULT OK) { i f ( d a t a . g e t D a t a ( ) == n u l l && d a t a . h a s E x t r a ( F i l e P i c k e r A c t i v i t y .

EXTRA FILE PATH ) ) {

// I f b u i l t−i n f i l e b r o w s e r i s u s e d ( a n d r o i d−f i l e−p i c k e r a c t i v i t y ) .

p d f U r i = U r i . f r o m F i l e (new F i l e ( d a t a . g e t S t r i n g E x t r a ( F i l e P i c k e r A c t i v i t y . EXTRA FILE PATH ) ) ) ;

} e l s e {

// I f o t h e r f i l e b r o w s e r s a r e u s e d . p d f U r i = d a t a . g e t D a t a ( ) ;

}

// Check i f p d f U r i i s n o t n u l l and h a s p r o p e r f o r m a t , r e t u r n e r r o r n o t i c e i f i t i s n u l l o r i n wrong f o r m a t .

i f ( p d f U r i != n u l l && I n t e n t B r o w s e F i l e s . c h e c k P d f E x t e n s i o n (t h i s, p d f U r i ) ) {

// u s e f r a g m e n t p d f a s Fragment . s t a t e = S t a t e . IS PDF ;

// D i s p l a y PDF i n PDFViewer L i b r a r i e s . d i s p l a y P d f ( p d f U r i ) ; // D i s p l a y PDFViewer .

d i s p l a y F r a g m e n t ( ) ; } e l s e {

T o a s t . makeText (t h i s, ” S e l e c t a PDF w i t h an a p p r o p r i a t e f o r m a t . ”, T o a s t .

LENGTH LONG) . show ( ) ; }

} e l s e i f ( r e s u l t C o d e == RESULT CANCELED) {

// Image c a p t u r e c a n c e l l e d by t h e u s e r . T o a s t . makeText (t h i s, ” Browse PDF c a n c e l l e d ”, T o a s t . LENGTH SHORT) . show ( ) ; } e l s e {

//An e r r o r h a s o c c u r e d d u r i n g s a v i n g . T o a s t . makeText (t h i s, ”An e r r o r h a s o c c u r e d ”, T o a s t . LENGTH LONG) . show ( ) ; }

b r e a k; }

// R e s u l t f r o m b r o w s e Epub . c a s e A c t i v i t y R e s u l t .

BROWSE EPUB ACTIVITY REQUEST CODE : {

i f ( r e s u l t C o d e == RESULT OK) { Fragment EPubViewer . c l ea r W e b V i e w ( ) ; i f ( d a t a . g e t D a t a ( ) == n u l l && d a t a . h a s E x t r a ( F i l e P i c k e r A c t i v i t y .

EXTRA FILE PATH ) ) {

// I f b u i l t−i n f i l e b r o w s e r i s u s e d ( a n d r o i d−f i l e−p i c k e r a c t i v i t y ) .

e p u b U r i = U r i . f r o m F i l e (new F i l e ( d a t a . g e t S t r i n g E x t r a ( F i l e P i c k e r A c t i v i t y . EXTRA FILE PATH ) ) ) ;

} e l s e {

// I f o t h e r f i l e b r o w s e r s a r e u s e d . e p u b U r i = d a t a . g e t D a t a ( ) ;

}

// Check i f e p u b U r i i s n o t n u l l and h a s p r o p e r f o r m a t , r e t u r n e r r o r n o t i c e i f i t i s n u l l o r i n wrong f o r m a t .

i f ( e p u b U r i != n u l l && I n t e n t B r o w s e F i l e s . c h e c k E p u b E x t e n s i o n (t h i s, e p u b U r i ) ) {

new Task UnzipEpub (t h i s, new Task UnzipEpub . A s y n c R e s p o n s e ( ) {

@ O v e r r i d e

p u b l i c v o i d p r o c e s s F i n i s h e d ( U r i e p u b U r i , S t r i n g c a c h e P a t h ) {

// R e c r e a t e EPUB t a b l e o f c o n t e n t s f i n a l Fragment EPubViewer TOC f r a g m e n t

= ( Fragment EPubViewer TOC ) g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n tB y T a g (” f r a g m e n t e p u b t o c ”) ; f r a g m e n t . c r e a t e A d a p t e r ( e p u b U r i , c a c h e P a t h ) ;

// u s e f r a g m e n t e p u b a s Fragment . s t a t e = S t a t e . IS EPUB ;

// D i s p l a y EpubViewer . d i s p l a y F r a g m e n t ( ) ;

}

}) . e x e c u t e ( e p u b U r i , D i r e c t o r i e s . EPUB CACHE DIR) ;

} e l s e {

T o a s t . makeText (t h i s, ” S e l e c t an Epub w i t h an a p p r o p r i a t e f o r m a t . ”, T o a s t . LENGTH LONG) . show ( ) ;

}

} e l s e i f ( r e s u l t C o d e == RESULT CANCELED) {

// Image c a p t u r e c a n c e l l e d by t h e u s e r . T o a s t . makeText (t h i s, ” Browse Epub c a n c e l l e d ”, T o a s t . LENGTH SHORT) . show ( ) ; } e l s e {

//An e r r o r h a s o c c u r e d d u r i n g s a v i n g . T o a s t . makeText (t h i s, ”An e r r o r h a s o c c u r e d ”, T o a s t . LENGTH LONG) . show ( ) ; }

b r e a k; }

// R e s u l t f r o m r o t a t e bitmap . c a s e A c t i v i t y R e s u l t .

ROTATE BITMAP ACTIVITY REQUEST CODE : {

i f ( r e s u l t C o d e == RESULT OK) {

// I f r o t a t i n g and s a v i n g i s s u c c e s s f u l , d i s p l a y t h e r o t a t e d i m a g e on i m a g e v i e w

i m a g e U r i = d a t a . g e t P a r c e l a b l e E x t r a (”

i m a g e U r i ”) ; s e t I m a g e ( ) ;

} e l s e i f ( r e s u l t C o d e == RESULT CANCELED) {

// Image r o t a t i o n i s c a n c e l l e d T o a s t . makeText (t h i s, ” Image r o t a t i o n c a n c e l l e d ”, T o a s t . LENGTH SHORT) . show ( ) ; }

b r e a k; }

// R e s u l t f r o m c r o p i m a g e . c a s e A c t i v i t y R e s u l t .

CROP IMAGE ACTIVITY REQUEST CODE : {

i f ( r e s u l t C o d e == RESULT OK) {

// I f c r o p p i n g and s a v i n g i s s u c c e s s f u l , d i s p l a y t h e c r o p p e d i m a g e on i m a g e v i e w

i m a g e U r i = d a t a . g e t P a r c e l a b l e E x t r a (”

i m a g e U r i ”) ;

T o a s t . makeText ( A c t i v i t y M a i n .t h i s, ” Cropped i m a g e s a v e d t o : ” + i m a g e U r i . g e t P a t h ( ) , T o a s t . LENGTH LONG) . show ( ) ;

s e t I m a g e ( ) ;

} e l s e i f ( r e s u l t C o d e == RESULT CANCELED) {

// Crop p i c t u r e c a n c e l l e d by u s e r T o a s t . makeText (t h i s, ” Crop c a n c e l l e d ”, T o a s t . LENGTH SHORT) . show ( ) ;

} e l s e {

//An e r r o r h a s o c c u r e d d u r i n g c r o p T o a s t . makeText (t h i s, ”An e r r o r h a s o c c u r e d ”, T o a s t . LENGTH LONG) . show ( ) ; }

b r e a k; }

// R e s u l t f r o m Image t o PDF c a s e A c t i v i t y R e s u l t .

BROWSE MULTIPLE IMAGE ACTIVITY REQUEST CODE : {

i f ( r e s u l t C o d e == RESULT OK) {

// c a l l s a v e PDF c l a s s ( AsyncTask a u t o e x e c u t e )

new T a s k S a v e P d f (t h i s, d a t a ) ; // u s e f r a g m e n t p d f a s Fragment s t a t e = S t a t e . IS PDF ;

// D i s p l a y PDFViewer d i s p l a y F r a g m e n t ( ) ;

} e l s e i f ( r e s u l t C o d e == RESULT CANCELED) {

// Image c a p t u r e c a n c e l l e d by t h e u s e r T o a s t . makeText (t h i s, ” Browse F i l e c a n c e l l e d ”, T o a s t . LENGTH SHORT) . show ( ) ; } e l s e {

//An e r r o r h a s o c c u r e d d u r i n g s a v i n g T o a s t . makeText (t h i s, ”An e r r o r h a s o c c u r e d ”, T o a s t . LENGTH LONG) . show ( ) ; }

b r e a k; }

// R e s u l t f r o m PDF t o Image c a s e A c t i v i t y R e s u l t .

BROWSE PDF CONVERT TO IMAGE ACTIVITY REQUEST CODE : {

i f ( r e s u l t C o d e == RESULT OK) { i f ( d a t a . g e t D a t a ( ) == n u l l && d a t a .

h a s E x t r a ( F i l e P i c k e r A c t i v i t y .

EXTRA FILE PATH ) ) {

// I f b u i l t−i n f i l e b r o w s e r i s u s e d ( a n d r o i d−f i l e−p i c k e r a c t i v i t y ) .

p d f U r i = U r i . f r o m F i l e (new F i l e ( d a t a . g e t S t r i n g E x t r a ( F i l e P i c k e r A c t i v i t y . EXTRA FILE PATH ) ) ) ;

} e l s e {

// I f o t h e r f i l e b r o w s e r s a r e u s e d . p d f U r i = d a t a . g e t D a t a ( ) ;

}

// Check i f p d f U r i i s n o t n u l l and h a s p r o p e r f o r m a t , r e t u r n e r r o r n o t i c e i f i t i s n u l l o r i n wrong f o r m a t .

i f ( p d f U r i != n u l l && I n t e n t B r o w s e F i l e s . c h e c k P d f E x t e n s i o n (t h i s, p d f U r i ) ) {

// u s e f r a g m e n t p d f a s Fragment s t a t e = S t a t e . IS PDF ;

// c a l l PDF t o Image c l a s s L i b r a r i e s . pdfToImage ( p d f U r i ) ; // D i s p l a y PDFViewer

d i s p l a y F r a g m e n t ( ) ; } e l s e {

T o a s t . makeText (t h i s, ” S e l e c t a PDF w i t h an a p p r o p r i a t e f o r m a t . ”, T o a s t .

LENGTH LONG) . show ( ) ; }

} e l s e i f ( r e s u l t C o d e == RESULT CANCELED) {

// Image c a p t u r e c a n c e l l e d by t h e u s e r T o a s t . makeText (t h i s, ” C o n v e r t t o PDF c a n c e l l e d ”, T o a s t . LENGTH SHORT) . show ( ) ; } e l s e {

//An e r r o r h a s o c c u r e d d u r i n g s a v i n g T o a s t . makeText (t h i s, ”An e r r o r h a s o c c u r e d ”, T o a s t . LENGTH LONG) . show ( ) ; }

b r e a k; }

d e f a u l t: { b r e a k; } }

d i s p l a y F r a g m e n t ( ) ; }

/∗ ∗

∗ S e t t h e i m a g e t o be d i s p l a y e d i n t h e imageView .

∗ T h i s i s n e e d e d t o be a b l e t o d i s p l a y l a r g e b i t m a p s w i t h o u t l a g g i n g .

∗/

p r i v a t e v o i d s e t I m a g e ( ) {

// S a v e t h e c o p y o f t h e o r i g i n a l f i l e t o c a c h e .

new T a s k F i l e F r o m U r i (t h i s, ” c a c h e . ” + I n t e n t B r o w s e F i l e s . getMimeType (t h i s, i m a g e U r i ) , new T a s k F i l e F r o m U r i . A s y n c R e s p o n s e ( ) {

@ O v e r r i d e

p u b l i c v o i d p r o c e s s F i n i s h e d ( F i l e f i l e ) { // Reduce t h e d i m e n s i o n & s i z e o f t h e

bitmap c o p y .

f i n a l Bitmap i m a g e = B it map Lo ade r . d e c o d e S a m p l e d B i t m a p ( f i l e , L i b r a r i e s . imageView . g e t W i d t h ( ) , L i b r a r i e s . imageView . g e t H e i g h t ( ) ) ;

// D i s p l a y t h e bitmap c o p y .

L i b r a r i e s . imageView . s e t I m a g e B i t m a p ( i m a g e ) ; L i b r a r i e s . imageView . s e t S c a l e T y p e ( ImageView

. S c a l e T y p e . FIT CENTER ) ;

// Change t h e d i s p l a y e d t e x t on b u t t o n t e x t b u t t o n t e x t . s e t T e x t (R . s t r i n g . b u t t o n t e x t ) ; }

}) . e x e c u t e ( i m a g e U r i ) ; }

/∗ ∗

∗ A c a l l t o t h i s f u n c t i o n d e t e r m i n e s w h i c h Fragment w i l l be d i s p l a y e d b a s e d on t h e App ’ s s t a t e .

∗/

p r i v a t e v o i d d i s p l a y F r a g m e n t ( ) { f i n a l F r a g m e n t T r a n s a c t i o n f t =

g e t S u p p o r t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( ) ;

s w i t c h ( s t a t e ) {

// D i s p l a y Canvas Fragment c a s e S t a t e . IS CANVAS : {

L i b r a r i e s . p d f V i e w . r e c y c l e ( ) ;

L i b r a r i e s . imageView . s e t R e c y c l e (t r u e) ; L i b r a r i e s . imageView . r e c y c l e ( ) ; Fragment EPubViewer . c le a r W e b V i ew ( ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t t e x t ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t i m a g e ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t p d f ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t e p u b t o c ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t e p u b ”) ) ; f t . show ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t c a n v a s ”) ) ; b u t t o n t e x t . s e t T e x t (R . s t r i n g . b u t t o n t e x t ) ; b r e a k;

}

// D i s p l a y i m a g e v i e w e r Fragment c a s e S t a t e . IS IMAGE : {

L i b r a r i e s . p d f V i e w . r e c y c l e ( ) ; F r a g m e n t D r a w i n g C a n v a s . d r a w i n g V i e w .

d e s t r o y D r a w i n g C a c h e ( ) ;

Fragment EPubViewer . c le a r W e b V i ew ( ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t t e x t ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t c a n v a s ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t p d f ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t e p u b t o c ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t e p u b ”) ) ; f t . show ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t i m a g e ”) ) ; b u t t o n t e x t . s e t T e x t (R . s t r i n g . b u t t o n t e x t ) ; b r e a k;

}

// D i s p l a y PDFViewer Fragment c a s e S t a t e . IS PDF : {

L i b r a r i e s . imageView . s e t R e c y c l e (t r u e) ; L i b r a r i e s . imageView . r e c y c l e ( ) ; F r a g m e n t D r a w i n g C a n v a s . d r a w i n g V i e w .

d e s t r o y D r a w i n g C a c h e ( ) ;

Fragment EPubViewer . c le a r W e b V i ew ( ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t t e x t ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t c a n v a s ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t i m a g e ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t e p u b t o c ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t e p u b ”) ) ; f t . show ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t p d f ”) ) ; b u t t o n t e x t . s e t T e x t (R . s t r i n g . b u t t o n t e x t ) ; b r e a k;

}

// D i s p l a y Epub Fragment c a s e S t a t e . IS EPUB : {

L i b r a r i e s . p d f V i e w . r e c y c l e ( ) ;

L i b r a r i e s . imageView . s e t R e c y c l e (t r u e) ; L i b r a r i e s . imageView . r e c y c l e ( ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t t e x t ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t i m a g e ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t p d f ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t c a n v a s ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t e p u b ”) ) ; f t . show ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t e p u b t o c ”) ) ; b u t t o n t e x t . s e t T e x t (R . s t r i n g . b u t t o n t e x t ) ; b r e a k;

}

// D i s p l a y Text Fragment

c a s e S t a t e . IS TEXT FROM CANVAS : c a s e S t a t e . IS TEXT FROM IMAGE : c a s e S t a t e . IS TEXT FROM PDF : c a s e S t a t e . IS TEXT FROM EPUB : {

f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) . f i nd F r a gm e n t By T a g (” f r a g m e n t c a n v a s ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t i m a g e ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n t By T a g (” f r a g m e n t p d f ”) ) ;

f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) . f i nd F r a gm e n tB y T a g (” f r a g m e n t e p u b t o c ”) ) ; f t . h i d e ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n tB y T a g (” f r a g m e n t e p u b ”) ) ; f t . show ( g e t S u p p o r t F r a g m e n t M a n a g e r ( ) .

f i nd F r a gm e n tB y T a g (” f r a g m e n t t e x t ”) ) ; b u t t o n t e x t . s e t T e x t (R . s t r i n g .

b u t t o n t e x t b a c k ) ; b r e a k;

}

d e f a u l t: { b r e a k; } }

// commit Fragment c h a n g e s . f t . commit ( ) ;

}

@ O v e r r i d e

p r o t e c t e d v o i d o nPa use ( ) { L i b r a r i e s . t t s . s t o p ( ) ; s u p e r. onP aus e ( ) ; }

@ O v e r r i d e

p r o t e c t e d v o i d o n S t o p ( ) { L i b r a r i e s . t t s . s t o p ( ) ; L i b r a r i e s . t t s . shutdown ( ) ;

s u p e r. o n S t o p ( ) ; }

@ O v e r r i d e

p r o t e c t e d v o i d o n D e s t r o y ( ) { s u p e r. o n D e s t r o y ( ) ;

// Garbage C o l l e c t L i b r a r i e s . t t s . s t o p ( ) ; L i b r a r i e s . t t s . shutdown ( ) ; L i b r a r i e s . t e s s e r a c t . c l e a r ( ) ; L i b r a r i e s . t e s s e r a c t . end ( ) ;

F r a g m e n t D r a w i n g C a n v a s . d r a w i n g V i e w . d e s t r o y D r a w i n g C a c h e ( ) ;

F r a g m e n t D r a w i n g C a n v a s . d r a w i n g V i e w . i n v a l i d a t e ( ) ;

L i b r a r i e s . imageView . s e t R e c y c l e (t r u e) ; L i b r a r i e s . imageView . r e c y c l e ( ) ; L i b r a r i e s . p d f V i e w . r e c y c l e ( ) ; Fragment EPubViewer . c le a r W e b V i ew ( ) ; Fragment EPubViewer . webView . d e s t r o y ( ) ; // D e l e t e epubCache and c a c h e D i r i f ( i s F i n i s h i n g ( ) ) {

D i r e c t o r i e s . d e l e t e (new F i l e ( D i r e c t o r i e s . EPUB CACHE DIR) ) ;

D i r e c t o r i e s . d e l e t e ( g e t C a c h e D i r ( ) ) ; }

} }

Path = Tess2Speech/tess2Speech/src/main/java/anteraaron/tess2speech/

Activity\_Rotate.java

p a c k a g e a n t e r a a r o n . t e s s 2 s p e e c h ; i m p o r t a n d r o i d . c o n t e n t . I n t e n t ; i m p o r t a n d r o i d . g r a p h i c s . Bitmap ; i m p o r t a n d r o i d . g r a p h i c s . M a t r i x ; i m p o r t a n d r o i d . g r a p h i c s . RectF ; i m p o r t a n d r o i d . n e t . U r i ; i m p o r t a n d r o i d . s u p p o r t . v7 . app .

AppCompatActivity ; i m p o r t a n d r o i d . o s . B u n d l e ; i m p o r t a n d r o i d . v i e w . View ;

i m p o r t a n d r o i d . w e b k i t . MimeTypeMap ; i m p o r t a n d r o i d . w i d g e t . B u t t o n ; i m p o r t a n d r o i d . w i d g e t . ImageView ; i m p o r t a n d r o i d . w i d g e t . S e e k B a r ; i m p o r t a n d r o i d . w i d g e t . TextView ; i m p o r t j a v a . i o . F i l e ;

/∗ ∗

∗ A c t i v i t y f o r R o t a t i n g I m a g e s .

∗ @author A n t e r Aaron M. C u s t o d i o

∗ @ s i n c e 2 0 1 6 . 3 . 2 2

∗/

p u b l i c c l a s s A c t i v i t y R o t a t e e x t e n d s AppCompatActivity{

p r i v a t e s t a t i c f i n a l i n t STARTING ANGLE = 1 8 0 ; // S t a r t i n g a n g l e i s a n g l e − 1 8 0 . T h i s i m p l i e s t h a t t h e amount o f s t a r t i n g r o t a t i o n i s 0 .

p r i v a t e s t a t i c f i n a l i n t MAX ANGLE = 3 6 0 ; //

3 6 0 − 1 8 0 = 1 8 0 . T h i s i m p l i e s t h a t t h e max r o t a t i o n c a n o n l y be a t −180 t o 1 8 0 . p r i v a t e s t a t i c f i n a l S t r i n g LABEL = ” R o t a t e d

a n g l e : ”; // R o t a t i o n v a l u e i n d i c a t o r p r i v a t e ImageView i m a g e V i e w r o t a t e ; p r i v a t e TextView t e x t V i e w r o t a t e ; p r i v a t e s t a t i c i n t a n g l e ;

p r i v a t e s t a t i c S t r i n g imagePath , imageName ;

@ O v e r r i d e

p r o t e c t e d v o i d o n C r e a t e (f i n a l B u n d l e s a v e d I n s t a n c e S t a t e ) {

s u p e r. o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w (R . l a y o u t . a c t i v i t y r o t a t e ) ; // g e t u r i o f t h e i m a g e d i s p l a y e d

f i n a l U r i u r i = g e t I n t e n t ( ) . g e t P a r c e l a b l e E x t r a (” i m a g e U r i ”) ; // g e t t h e o r i g i n a l name o f t h e i m a g e imageName =new F i l e ( u r i . g e t P a t h ( ) ) . getName

( ) ;

// c r e a t e UI f o r t h i s a c t i v i t y // S e t i n i t i a l t e x t on t e x t V i e w

f i n a l S t r i n g a n g l e L a b e l = LABEL + ” 0 ”; t h i s. t e x t V i e w r o t a t e = ( TextView )

f i n d V i e w B y I d (R . i d . t e x t V i e w r o t a t e ) ; t h i s. t e x t V i e w r o t a t e . s e t T e x t ( a n g l e L a b e l ) ; // C a s t imageView

t h i s. i m a g e V i e w r o t a t e = ( ImageView ) f i n d V i e w B y I d (R . i d . i m a g e V i e w r o t a t e ) ; s e t I m a g e ( u r i ) ;

// C a s t s e e k B a r

f i n a l S e e k B a r s e e k B a r = ( S e e k B a r ) f i n d V i e w B y I d (R . i d . s e e k B a r r o t a t e ) ; s e e k B a r . setMax (MAX ANGLE) ;

s e e k B a r . s e t P r o g r e s s (STARTING ANGLE) ; s e e k B a r . s e t O n S e e k B a r C h a n g e L i s t e n e r (new

S e e k B a r . O n S e e k B a r C h a n g e L i s t e n e r ( ) {

@ O v e r r i d e

p u b l i c v o i d o n P r o g r e s s C h a n g e d (f i n a l S e e k B a r s e e k B a r , f i n a l i n t p r o g r e s s , f i n a l b o o l e a n f r o m U s e r ) {

// The c u r r e n t a n g l e i s c u r r e n t s e e k B a r p r o g r e s s − 1 8 0 ( r e a s o n f o r −180 i n t h e c o n s t a n t v a l u e a b o v e ) .

a n g l e = p r o g r e s s − 1 8 0 ; r o t a t e I m a g e ( a n g l e ) ; }

@ O v e r r i d e

p u b l i c v o i d o n S t a r t T r a c k i n g T o u c h ( S e e k B a r s e e k B a r ) {}

@ O v e r r i d e

p u b l i c v o i d o n S t o p T r a c k i n g T o u c h ( S e e k B a r s e e k B a r ) {}

}) ;

// C r e a t e s a v e c a n v a s b u t t o n .

f i n a l B u t t o n b u t t o n r o t a t e s a v e = ( B u t t o n ) f i n d V i e w B y I d (R . i d . b u t t o n r o t a t e s a v e ) ; b u t t o n r o t a t e s a v e . s e t O n C l i c k L i s t e n e r (new

View . O n C l i c k L i s t e n e r ( ) {

@ O v e r r i d e

p u b l i c v o i d o n C l i c k ( View v ) { // C a l l s an AsyncTask t h a t s a v e s t h e

r o t a t e d i m a g e t o a f i l e .

new T a s k S a v e R o t a t e d B i t m a p ( A c t i v i t y R o t a t e .t h i s, new T a s k S a v e R o t a t e d B i t m a p . A s y n c R e s p o n s e ( ) {

@ O v e r r i d e

p u b l i c v o i d p r o c e s s F i n i s h e d ( U r i u r i ) { // R e t u r n f i l e a f t e r s a v i n g t h e r o t a t e d i m a g e t o g e t f i l e p a t h .

f i n a l I n t e n t i n t e n t = new I n t e n t ( ) ; i n t e n t . p u t E x t r a (” i m a g e U r i ”, u r i ) ; s e t R e s u l t (RESULT OK, i n t e n t ) ;

i m a g e V i e w r o t a t e . d e s t r o y D r a w i n g C a c h e ( ) ;

f i n i s h ( ) ; }

}) . e x e c u t e ( imagePath , a n g l e , imageName ) ; }

}) ;

// C r e a t e r e s e t b u t t o n .

f i n a l B u t t o n b u t t o n r o t a t e r e s e t = ( B u t t o n ) f i n d V i e w B y I d (R . i d . b u t t o n r o t a t e r e s e t ) ; b u t t o n r o t a t e r e s e t . s e t O n C l i c k L i s t e n e r (new

View . O n C l i c k L i s t e n e r ( ) {

@ O v e r r i d e

p u b l i c v o i d o n C l i c k ( View v ) {

// R e s e t s t h e a n g l e . R e t u r n s t h e r o t a t i o n o f t h e i m a g e t o i t s o r i g i n a l o r i e n t a t i o n . a n g l e = 0 ;

s e e k B a r . s e t P r o g r e s s ( 1 8 0 ) ; r o t a t e I m a g e ( a n g l e ) ; }

}) ;

// C r e a t e c a n c e l b u t t o n .

f i n a l B u t t o n b u t t o n r o t a t e c a n c e l = ( B u t t o n ) f i n d V i e w B y I d (R . i d . b u t t o n r o t a t e e x i t ) ; b u t t o n r o t a t e c a n c e l . s e t O n C l i c k L i s t e n e r (new

View . O n C l i c k L i s t e n e r ( ) {

@ O v e r r i d e

p u b l i c v o i d o n C l i c k ( View v ) {

// R e t u r n s c a n c e l r e s u l t t o A c t i v i t y M a i n . s e t R e s u l t (RESULT CANCELED) ;

f i n i s h ( ) ; }

}) ; } /∗ ∗

∗ Method t h a t a c c e p t s a r o t a t i o n v a l u e , and r o t a t e t h e i m a g e d i s p l a y e d i n i m a g e V i e w r o t a t e and a d j u s t s i t s s i z e a c c o r d i n g l y s o t h a t t h e w h o l e i m a g e i s s t i l l d i s p l a y e d .

∗ @param a n g l e a f l o a t v a l u e f r o m −180 t o 1 8 0 .

∗ @ s i n c e 2 0 1 6 . 3 . 2 2

∗/

p r i v a t e v o i d r o t a t e I m a g e (f i n a l f l o a t a n g l e ){ // Pre−compute some t r i g f u n c t i o n s .

f i n a l d o u b l e r a d i a n s = Math . t o R a d i a n s ( a n g l e )

;

f i n a l d o u b l e s i n = Math . a b s ( Math . s i n ( r a d i a n s ) ) ;

f i n a l d o u b l e c o s = Math . a b s ( Math . c o s ( r a d i a n s ) ) ;

// F i g u r e o u t t o t a l w i d t h and h e i g h t o f new bitmap u s i n g t r i g c o m p u t a t i o n s .

f i n a l f l o a t newWidth = (f l o a t) (t h i s. i m a g e V i e w r o t a t e . g e t W i d t h ( ) ∗ c o s + t h i s. i m a g e V i e w r o t a t e . g e t H e i g h t ( ) ∗ s i n ) ; f i n a l f l o a t n e w H e i g h t = (f l o a t) (t h i s.

i m a g e V i e w r o t a t e . g e t W i d t h ( ) ∗ s i n + t h i s. i m a g e V i e w r o t a t e . g e t H e i g h t ( ) ∗ c o s ) ; // F i g u r e o u t t h e amount o f a d j u s t m e n t o f

imageView t o f i t t h e r o t a t e d bitmap . f i n a l f l o a t w i d t h A d j u s t m e n t = ( newWidth −

t h i s. i m a g e V i e w r o t a t e . g e t W i d t h ( ) ) / 2 ; f i n a l f l o a t h e i g h t A d j u s t m e n t = ( n e w H e i g h t −

t h i s. i m a g e V i e w r o t a t e . g e t H e i g h t ( ) ) / 2 ;

// S e t t h e v i e w and d r a w a b l e ’ s bound .

t h i s. i m a g e V i e w r o t a t e . s e t S c a l e T y p e ( ImageView . S c a l e T y p e . MATRIX) ;

f i n a l RectF d r a w a b l e R e c t = new RectF ( 0 , 0 , t h i s. i m a g e V i e w r o t a t e . g e t D r a w a b l e ( ) . g e t B o u n d s ( ) . w i d t h ( ) , t h i s.

i m a g e V i e w r o t a t e . g e t D r a w a b l e ( ) . g e t B o u n d s ( ) . h e i g h t ( ) ) ;

f i n a l RectF v i e w R e c t = new RectF ( 0 , 0 , t h i s. i m a g e V i e w r o t a t e . g e t W i d t h ( ) −

w i d t h A d j u s t m e n t , t h i s. i m a g e V i e w r o t a t e . g e t H e i g h t ( ) − h e i g h t A d j u s t m e n t ) ; // Use M a t r i x f o r r o t a t i o n

f i n a l M a t r i x m a t r i x = new M a t r i x ( ) ;

m a t r i x . s e t R e c t T o R e c t ( d r a w a b l e R e c t , v i e w R e c t , M a t r i x . S c a l e T o F i t .CENTER) ;

m a t r i x . p o s t R o t a t e ( a n g l e , (t h i s. i m a g e V i e w r o t a t e . g e t W i d t h ( ) − w i d t h A d j u s t m e n t ) / 2 , (t h i s. i m a g e V i e w r o t a t e . g e t H e i g h t ( ) − h e i g h t A d j u s t m e n t ) / 2 ) ;

m a t r i x . p o s t T r a n s l a t e ( w i d t h A d j u s t m e n t / 2 , h e i g h t A d j u s t m e n t / 2 ) ;

t h i s. i m a g e V i e w r o t a t e . s e t I m a g e M a t r i x ( m a t r i x )

;

// R e f r e s h t h e i m a g e v i e w

t h i s. i m a g e V i e w r o t a t e . i n v a l i d a t e ( ) ; // Change t h e v a l u e o f r o t a t i o n v a l u e

i n d i c a t o r .

f i n a l S t r i n g a n g l e L a b e l = LABEL + a n g l e ; t h i s. t e x t V i e w r o t a t e . s e t T e x t ( a n g l e L a b e l ) ; }

/∗ ∗

∗ A method t h a t a c c e p t s an u r i , and d i s p l a y s i t t o i m a g e V i e w r o t a t e v i e w .

∗ @param u r i u r i o f t h e i m a g e t h a t w i l l be d i s p l a y e d i n i m a g e V i e w r o t a t e .

∗ @ s i n c e 2 0 1 6 . 3 . 2 2

∗/

p r i v a t e v o i d s e t I m a g e (f i n a l U r i u r i ) { // Get f i l e e x t e n s i o n o f i m a g e f r o m u r i .

f i n a l MimeTypeMap mime = MimeTypeMap .

g e t S i n g l e t o n ( ) ;

f i n a l S t r i n g e x t e n s i o n = mime . getExtensionFromMimeType (

g e t C o n t e n t R e s o l v e r ( ) . g e t T y p e ( u r i ) ) ; // Get r e s i z e d f i l e p a t h f r o m u r i . new T a s k F i l e F r o m U r i (t h i s, ” c a c h e . ” +

e x t e n s i o n , new T a s k F i l e F r o m U r i . A s y n c R e s p o n s e ( ) {

@ O v e r r i d e

p u b l i c v o i d p r o c e s s F i n i s h e d ( F i l e f i l e ) { // D i s p l a y t h e i m a g e t o i m a g e V i e w r o t a t e . f i n a l Bitmap i m a g e = B it map Lo ade r .

d e c o d e S a m p l e d B i t m a p ( f i l e , i m a g e V i e w r o t a t e . g e t W i d t h ( ) , i m a g e V i e w r o t a t e . g e t H e i g h t ( ) ) ;

i m a g e V i e w r o t a t e . s e t I m a g e B i t m a p ( i m a g e ) ; i m a g e V i e w r o t a t e . s e t S c a l e T y p e ( ImageView .

S c a l e T y p e . FIT CENTER ) ;

i m a g e P a t h = f i l e . g e t A b s o l u t e P a t h ( ) ; }

}) . e x e c u t e ( u r i ) ; }

}

Path = Tess2Speech/tess2Speech/src/main/java/anteraaron/tess2speech/

Activity\_Settings.java

p a c k a g e a n t e r a a r o n . t e s s 2 s p e e c h ; i m p o r t a n d r o i d . c o n t e n t . I n t e n t ;

i m p o r t a n d r o i d . c o n t e n t . pm . PackageManager ; i m p o r t a n d r o i d . c o n t e n t . pm . R e s o l v e I n f o ; i m p o r t a n d r o i d . o s . B u n d l e ;

i m p o r t a n d r o i d . p r e f e r e n c e . P r e f e r e n c e A c t i v i t y ; i m p o r t a n d r o i d . s e r v i c e . t e x t s e r v i c e .

S p e l l C h e c k e r S e r v i c e ; /∗ ∗

∗ A c t i v i t y f o r P r e f e r e n c e s S e t t i n g s .

∗ @author A n t e r Aaron M. C u s t o d i o

∗ @ s i n c e 2 0 1 6 . 3 . 2 2

∗/

p u b l i c v o i d o n C r e a t e (f i n a l B u n d l e s a v e d I n s t a n c e S t a t e ) {

s u p e r. o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ;

// c h e c k i f t h e r e i s a b u i l t i n s p e l l−c h e c k e r f i n a l PackageManager pm = g e t P a c k a g e M a n a g e r

( ) ;

f i n a l I n t e n t s p e l l = new I n t e n t (

S p e l l C h e c k e r S e r v i c e . SERVICE INTERFACE ) ; f i n a l R e s o l v e I n f o i n f o = pm . r e s o l v e S e r v i c e (

s p e l l , 0 ) ;

// S e t s p e l l C h e c k e r P r e s e n t t o f a l s e i f s p e l l C h e c k e r i s n o t p r e s e n t s p e l l C h e c k e r P r e s e n t = ( i n f o != n u l l) ; g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( ) .

r e p l a c e ( a n d r o i d . R . i d . c o n t e n t , new

Path = Tess2Speech/tess2Speech/src/main/java/anteraaron/tess2speech/

Activity\_SplashScreen.java

p a c k a g e a n t e r a a r o n . t e s s 2 s p e e c h ; i m p o r t a n d r o i d . app . A l e r t D i a l o g ;

i m p o r t a n d r o i d . c o n t e n t . D i a l o g I n t e r f a c e ; i m p o r t a n d r o i d . c o n t e n t . I n t e n t ;

i m p o r t a n d r o i d . o s . B u n d l e ; i m p o r t a n d r o i d . o s . H a n d l e r ;

i m p o r t a n d r o i d . p r e f e r e n c e . P r e f e r e n c e M a n a g e r ; i m p o r t a n d r o i d . s p e e c h . t t s . TextToSpeech ; i m p o r t a n d r o i d . s u p p o r t . v7 . app .

AppCompatActivity ;

i m p o r t a n d r o i d . v i e w . WindowManager ; i m p o r t a n d r o i d . w i d g e t . T o a s t ; i m p o r t j a v a . i o . F i l e ;

/∗ ∗

∗ An A c t i v i t y t h a t d i s p l a y s t h e S p l a s h s c r e e n and c o p y t h e r e q u i r e d f i l e s .

∗ @author A n t e r Aaron M. C u s t o d i o

∗ @ s i n c e 2 0 1 6 . 3 . 2 2

∗/

p u b l i c c l a s s A c t i v i t y S p l a s h S c r e e n e x t e n d s

AppCompatActivity {

p r i v a t e s t a t i c f i n a l i n t

SPLASH DISPLAY LENGTH = 6 0 0 ; // s p l a s h s c r e e n d i s p l a y d u r a t i o n .

p r i v a t e s t a t i c f i n a l i n t CHECK TTS REQUEST CODE = 1 ;

@ O v e r r i d e

p r o t e c t e d v o i d o n C r e a t e (f i n a l B u n d l e s a v e d I n s t a n c e S t a t e ) {

s u p e r. o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; getWindow ( ) . s e t F l a g s ( WindowManager .

LayoutParams . FLAG FULLSCREEN, WindowManager . LayoutParams . FLAG FULLSCREEN) ;

s e t C o n t e n t V i e w (R . l a y o u t . s p l a s h s c r e e n ) ; // S e t d e f a u l t p r e f e r e n c e s

P r e f e r e n c e M a n a g e r . s e t D e f a u l t V a l u e s (t h i s, R . xml . p r e f e r e n c e s , f a l s e) ;

// I f SD c a r d i s p r e s e n t .

i f ( D i r e c t o r i e s . c h e c k E x t e r n a l S t o r a g e ( ) ) { // c h e c k i f d i r e c t o r i e s / f i l e s n e e d e d a r e

p r e s e n t .

i f ( r e q u i r e d F i l e s P r e s e n t ( ) ) {

// D i s p l a y s p l a s h s c r e e n w i t h o u t c o p y i n g r e q u i r e d f i l e s .

new H a n d l e r ( ) . p o s t D e l a y e d (new Runnable ( ) {

@ O v e r r i d e

p u b l i c v o i d r u n ( ) {

// Check i f t h e r e i s a TTS i n s t a l l e d . f i n a l I n t e n t i n t e n t = new I n t e n t ( ) ; i n t e n t . s e t A c t i o n ( TextToSpeech . E n g i n e . ACTION CHECK TTS DATA) ;

s t a r t A c t i v i t y F o r R e s u l t ( i n t e n t , CHECK TTS REQUEST CODE) ;

}

}, SPLASH DISPLAY LENGTH ) ;

} e l s e {

// I f d i r e c t o r i e s do n o t e x i s t s , s t a r t c o p y i n g r e q u i r e d f i l e s and d i s p l a y s p l a s h

s c r e e n .

new T a s k C o p y A s s e t s (t h i s, new T a s k C o p y A s s e t s . A s y n c R e s p o n s e ( ) {

@ O v e r r i d e

p u b l i c v o i d p r o c e s s F i n i s h e d ( ) { // Check i f t h e r e i s a TTS i n s t a l l e d . f i n a l I n t e n t i n t e n t = new I n t e n t ( ) ; i n t e n t . s e t A c t i o n ( TextToSpeech . E n g i n e . ACTION CHECK TTS DATA) ;

s t a r t A c t i v i t y F o r R e s u l t ( i n t e n t , CHECK TTS REQUEST CODE) ;

}

}) . e x e c u t e ( ) ; }

} e l s e {

// D i s p l a y a l e r t D i a l o g t h a t SD c a r d i s n o t mounted

f i n a l A l e r t D i a l o g . B u i l d e r b u i l d e r = new A l e r t D i a l o g . B u i l d e r (t h i s) ;

b u i l d e r . s e t T i t l e (”SD Card n o t mounted ”) ; b u i l d e r . s e t M e s s a g e (”An SD Card i s n e e d e d t o

r u n t h i s a p p l i c a t i o n . P l e a s e i n s e r t o r mount an SD c a r d ”) ;

b u i l d e r . s e t C a n c e l a b l e (f a l s e) ; b u i l d e r . s e t P o s i t i v e B u t t o n (”Ok”, new

D i a l o g I n t e r f a c e . O n C l i c k L i s t e n e r ( ) {

@ O v e r r i d e

p u b l i c v o i d o n C l i c k ( D i a l o g I n t e r f a c e d i a l o g

, i n t w h i c h ) { d i a l o g . c a n c e l ( ) ; f i n i s h ( ) ; }

}) ;

f i n a l A l e r t D i a l o g d i a l o g = b u i l d e r . c r e a t e ( )

;

d i a l o g . show ( ) ; }

}

@ O v e r r i d e

p r o t e c t e d v o i d o n A c t i v i t y R e s u l t (i n t

r e q u e s t C o d e , i n t r e s u l t C o d e , I n t e n t d a t a ) {

i f ( r e q u e s t C o d e == CHECK TTS REQUEST CODE) { i f ( r e s u l t C o d e == TextToSpeech . E n g i n e .

CHECK VOICE DATA PASS) {

// A l l c h e c k s OK. C r e a t e an I n t e n t t h a t w i l l s t a r t t h e Main A c t i v i t y a f t e r d i s p l a y i n g s p l a s h s c r e e n .

f i n a l I n t e n t i n t e n t = new I n t e n t (

A c t i v i t y S p l a s h S c r e e n .t h i s, A c t i v i t y M a i n .c l a s s) ;

s t a r t A c t i v i t y ( i n t e n t ) ; f i n i s h ( ) ;

// S p l a s h S c r e e n t r a n s i t i o n a n i m a t i o n . o v e r r i d e P e n d i n g T r a n s i t i o n ( a n d r o i d . R . anim .

f a d e i n , a n d r o i d . R . anim . f a d e o u t ) ; }

} e l s e {

f i n a l I n t e n t i n s t a l l I n t e n t = new I n t e n t ( ) ; i n s t a l l I n t e n t . s e t A c t i o n ( TextToSpeech . E n g i n e

. ACTION INSTALL TTS DATA ) ; s t a r t A c t i v i t y ( i n s t a l l I n t e n t ) ;

T o a s t . makeText (t h i s,”TTS i n s t a l l i n g ”, T o a s t . LENGTH LONG) . show ( ) ;

} } /∗ ∗

∗ C r e a t e r e q u i r e d f o l d e r s and c h e c k s w h e t h e r t h e r e q u i r e d a s s e t f i l e s a r e

a l r e a d y i n t h e SD c a r d .

∗ @ r e t u r n t r u e i f t h e f i l e s a r e p r e s e n t .

∗/

@ S u p p r e s s W a r n i n g s ({” R e s u l t O f M e t h o d C a l l I g n o r e d

”, ” C o n s t a n t C o n d i t i o n s ”})

p r i v a t e b o o l e a n r e q u i r e d F i l e s P r e s e n t ( ){ // c r e a t e r e q u i r e d f o l d e r s f o r t h i s app // Music D i r e c t o r y

F i l e d i r = new F i l e ( D i r e c t o r i e s . AUDIO DIR ) ; i f( ! d i r . e x i s t s ( ) ){

d i r . mkdir ( ) ; }

// Document D i r e c t o r y

d i r = new F i l e ( D i r e c t o r i e s . PDF DIR ) ; i f( ! d i r . e x i s t s ( ) ){

d i r . mkdir ( ) ; }

// Document D i r e c t o r y

d i r = new F i l e ( D i r e c t o r i e s . TEXT DIR ) ; i f( ! d i r . e x i s t s ( ) ){

d i r . mkdir ( ) ; }

// Epub D i r e c t o r y

d i r = new F i l e ( D i r e c t o r i e s . EPUB CACHE DIR) ; i f( ! d i r . e x i s t s ( ) ){

d i r . mkdir ( ) ; }

// P i c t u r e s D i r e c t o r y

d i r = new F i l e ( D i r e c t o r i e s . IMAGES DIR ) ; i f( ! d i r . e x i s t s ( ) ){

d i r . mkdir ( ) ; }

// T e s s d a t a f o l d e r t h a t w i l l c o n t a i n . t r a i n e d d a t a s

d i r = new F i l e ( g e t E x t e r n a l F i l e s D i r (” t e s s d a t a

”) . g e t P a t h ( ) ) ; i f( ! d i r . e x i s t s ( ) ){

d i r . mkdir ( ) ; }

// Count t h e c o n t e n t o f t h e t e s s d a t a f o l d e r t o d e t e r m i n e w h e t h e r t h e r e q u i r e d f i l e s a r e p r e s e n t

f i n a l F i l e [ ] c o n t e n t s = d i r . l i s t F i l e s ( ) ; r e t u r n c o n t e n t s . l e n g t h > 0 ;

} }

Path = Tess2Speech/tess2Speech/src/main/java/anteraaron/tess2speech/

BitmapLoader.java

p a c k a g e a n t e r a a r o n . t e s s 2 s p e e c h ; i m p o r t a n d r o i d . g r a p h i c s . Bitmap ; i m p o r t a n d r o i d . g r a p h i c s . B i t m a p F a c t o r y ; i m p o r t j a v a . i o . F i l e ;

/∗ ∗

∗ A c l a s s t h a t c o n t a i n s method f o r R e s a m p l i n g l a r g e b i t m a p s t o a v o i d Out o f Memory E r r o r s and A c c e l e r a t e i m a g e c o n v e r s i o n .

∗ @author A n d r o i d D e v e l o p m e n t t u t o r i a l &

A n t e r Aaron M. C u s t o d i o

∗ @ s i n c e 2 0 1 6 . 3 . 2 2

∗/

p u b l i c c l a s s Bit ma pLo ad er { /∗ ∗

∗ Method t h a t c a l l s d i f f e r e n t i m a g e p r e−

p r o c e s s i n g .

∗/

p u b l i c s t a t i c Bitmap i m a g e P r e P r o c e s s ( Bitmap bitmap ) {

bitmap = I m a g e P r e P r o c e s s . t o G r a y S c a l e ( bitmap )

;

bitmap = I m a g e P r e P r o c e s s .

c h a n g e B i t m a p C o n t r a s t B r i g h t n e s s ( bitmap ) ; r e t u r n bitmap ;

} /∗ ∗

∗ R e d u c e s t h e s i z e o f bitmap b a s e d on t h e c a l c u l a t e d I n S a m p l e S i z e .

∗ @param f i l e t h e bitmap f i l e t o be r e s a m p l e d .

∗ @param reqWidth r e q u i r e d w i d t h o f t h e bitmap .

∗ @param r e q H e i g h t r e q u i r e d h e i g h t o f t h e bitmap .

∗ @ r e t u r n r e t u r n s t h e r e s a m p l e d bitmap w i t h reqWidth x r e q H e i g h t d i m e n s i o n .

∗/

p u b l i c s t a t i c Bitmap d e c o d e S a m p l e d B i t m a p ( f i n a l F i l e f i l e , f i n a l i n t reqWidth , f i n a l i n t r e q H e i g h t ) {

// F i r s t d e c o d e w i t h i n J u s t D e c o d e B o u n d s=t r u e t o c h e c k d i m e n s i o n s

f i n a l B i t m a p F a c t o r y . O p t i o n s o p t i o n s =new B i t m a p F a c t o r y . O p t i o n s ( ) ;

o p t i o n s . i n J u s t D e c o d e B o u n d s = t r u e; B i t m a p F a c t o r y . d e c o d e F i l e ( f i l e .

g e t A b s o l u t e P a t h ( ) , o p t i o n s ) ; // C a l c u l a t e i n S a m p l e S i z e

o p t i o n s . i n S a m p l e S i z e = c a l c u l a t e I n S a m p l e S i z e ( o p t i o n s , reqWidth , r e q H e i g h t ) ;

// Decode bitmap w i t h i n S a m p l e S i z e s e t o p t i o n s . i n J u s t D e c o d e B o u n d s = f a l s e; r e t u r n B i t m a p F a c t o r y . d e c o d e F i l e ( f i l e .

g e t A b s o l u t e P a t h ( ) , o p t i o n s ) ; }

/∗ ∗

∗ C a l c u l a t e s t h e a p p r o p r i a t e I n S a m p l e S i z e o f t h e Bitmap .

∗ @param o p t i o n s o p t i o n s c o n t a i n i n g t h e d e c o d e d bounds o f t h e bitmap .

∗ @param reqWidth r e q u i r e d w i d t h o f t h e bitmap .

∗ @param r e q H e i g h t r e q u i r e d h e i g h t o f t h e bitmap .

∗ @ r e t u r n r e t u r n s t h e a p p r o p r i a t e s a m p l e s i z e f o r r e s i z i n g t h e bitmap .

∗/

p r i v a t e s t a t i c i n t c a l c u l a t e I n S a m p l e S i z e ( f i n a l B i t m a p F a c t o r y . O p t i o n s o p t i o n s , f i n a l i n t reqWidth , f i n a l i n t r e q H e i g h t ) {

// Raw h e i g h t and w i d t h o f i m a g e f i n a l i n t h e i g h t = o p t i o n s . o u t H e i g h t ; f i n a l i n t w i d t h = o p t i o n s . outWidth ; i n t i n S a m p l e S i z e = 1 ;

// R e s i z e o n l y i f t h e bitmap i s l a r g e r t h a n t h e r e q u i r e d d i m e n s i o n .

i f ( h e i g h t > r e q H e i g h t | | w i d t h > reqWidth ) {

f i n a l i n t h a l f H e i g h t = h e i g h t / 2 ; f i n a l i n t h a l f W i d t h = w i d t h / 2 ;

// C a l c u l a t e t h e l a r g e s t i n S a m p l e S i z e v a l u e t h a t i s a power o f 2 and k e e p s b o t h h e i g h t and w i d t h l a r g e r t h a n t h e r e q u e s t e d h e i g h t and w i d t h .

w h i l e ( ( h a l f H e i g h t / i n S a m p l e S i z e ) >

r e q H e i g h t && ( h a l f W i d t h / i n S a m p l e S i z e ) >

reqWidth ) {

i n S a m p l e S i z e ∗= 2 ; }

}

r e t u r n i n S a m p l e S i z e ; }

}

Path = Tess2Speech/tess2Speech/src/main/java/anteraaron/tess2speech/

Directories.java

p a c k a g e a n t e r a a r o n . t e s s 2 s p e e c h ; i m p o r t a n d r o i d . n e t . U r i ;

i m p o r t a n d r o i d . o s . E n v i r o n m e n t ; i m p o r t j a v a . i o . F i l e ;

/∗ ∗

∗ C l a s s t h a t c o n t a i n s c o n s t a n t v a l u e s f o r t h e a p p l i c a t i o n ’ s D i r e c t o r i e s and F i l e p a t h s .

∗ @author A n t e r Aaron M. C u s t o d i o

∗ @ s i n c e 2 0 1 6 . 3 . 2 2

∗/

p u b l i c f i n a l c l a s s D i r e c t o r i e s{ // Saved p h o t o d i r e c t o r y

p u b l i c s t a t i c U r i imageFromCameraUri ; // Saved a u d i o d i r e c t o r y

p u b l i c s t a t i c f i n a l S t r i n g AUDIO DIR = E n v i r o n m e n t .

g e t E x t e r n a l S t o r a g e P u b l i c D i r e c t o r y ( E n v i r o n m e n t . DIRECTORY MUSIC) . g e t A b s o l u t e P a t h ( ) ;

// Saved p d f d i r e c t o r y

p u b l i c s t a t i c f i n a l S t r i n g PDF DIR =

E n v i r o n m e n t .

g e t E x t e r n a l S t o r a g e P u b l i c D i r e c t o r y (” Documents ”) . g e t A b s o l u t e P a t h ( ) ; // Saved t e x t d i r e c t o r y

p u b l i c s t a t i c f i n a l S t r i n g TEXT DIR = E n v i r o n m e n t .

g e t E x t e r n a l S t o r a g e P u b l i c D i r e c t o r y (” Documents ”) . g e t A b s o l u t e P a t h ( ) ; // Saved i n p u t i m a g e s

p u b l i c s t a t i c f i n a l S t r i n g IMAGES DIR = E n v i r o n m e n t .

g e t E x t e r n a l S t o r a g e P u b l i c D i r e c t o r y ( E n v i r o n m e n t . DIRECTORY PICTURES) . g e t A b s o l u t e P a t h ( ) + F i l e . s e p a r a t o r + ” T e s s e r a c t ”;

// Saved t e x t d i r e c t o r y

p u b l i c s t a t i c f i n a l S t r i n g EPUB CACHE DIR = E n v i r o n m e n t .

g e t E x t e r n a l S t o r a g e P u b l i c D i r e c t o r y (” Documents ”) . g e t A b s o l u t e P a t h ( ) + F i l e . s e p a r a t o r + ” epubCache ”;

/∗ ∗

∗ C h e c k s i f an SD c a r d i s mounted .

∗ @ r e t u r n r e t u r n s t r u e i f t h e r e i s an SD

c a r d mounted .

∗/

p u b l i c s t a t i c b o o l e a n c h e c k E x t e r n a l S t o r a g e ( ){

r e t u r n E n v i r o n m e n t . g e t E x t e r n a l S t o r a g e S t a t e ( ) . e q u a l s ( E n v i r o n m e n t .MEDIA MOUNTED) ; }

/∗ ∗

∗ A r e c u r s i v e way f o r d e l e t i n g a f i l e o r d i r e c t o r y and i t s c o n t e n t s .

∗ @param f i l e O r D i r e c t o r y t h e f i l e o r d i r e c t o r y t o be d e l e t e d .

∗/

p u b l i c s t a t i c v o i d d e l e t e (f i n a l F i l e f i l e O r D i r e c t o r y ) {

i f ( f i l e O r D i r e c t o r y . i s D i r e c t o r y ( ) ) { f o r (f i n a l F i l e c h i l d : f i l e O r D i r e c t o r y .

l i s t F i l e s ( ) ) { d e l e t e ( c h i l d ) ; }

}

f i l e O r D i r e c t o r y . d e l e t e ( ) ; }

}

Path = Tess2Speech/tess2Speech/src/main/java/anteraaron/tess2speech/

DrawingView.java

p a c k a g e a n t e r a a r o n . t e s s 2 s p e e c h ; i m p o r t a n d r o i d . c o n t e n t . C o n t e x t ; i m p o r t a n d r o i d . u t i l . A t t r i b u t e S e t ; i m p o r t a n d r o i d . u t i l . Log ;

i m p o r t a n d r o i d . v i e w . View ; i m p o r t a n d r o i d . g r a p h i c s . Bitmap ; i m p o r t a n d r o i d . g r a p h i c s . Canvas ; i m p o r t a n d r o i d . g r a p h i c s . C o l o r ; i m p o r t a n d r o i d . g r a p h i c s . P a i n t ; i m p o r t a n d r o i d . g r a p h i c s . Path ; i m p o r t a n d r o i d . v i e w . M o t i o n E v e n t ; i m p o r t j a v a . u t i l . A r r a y L i s t ; i m p o r t j a v a . u t i l . HashMap ; i m p o r t j a v a . u t i l . Map ; /∗ ∗

∗ The D r a w a b l e Canvas View o f t h e a p p l i c a t i o n ( U s i n g g e s t u r e s ) .

∗ @author A n t e r Aaron M. C u s t o d i o

∗ @ s i n c e 2 0 1 6 . 3 . 2 2

∗/

p u b l i c c l a s s DrawingView e x t e n d s View { p r i v a t e Path p a t h ; // Drawn p a t h

p r i v a t e P a i n t p a i n t ; // C o l o r o f t h e p a t h p r i v a t e f l o a t x , y ;

p r i v a t e s t a t i c f i n a l f l o a t TOLERANCE = 2 ; //

T o l e r a n c e l e v e l t o a v o i d a l i a s i n g p r i v a t e s t a t i c f i n a l f l o a t STROKE WIDTH = 10 f

; // S i z e o f s t r o k e

p r i v a t e s t a t i c f i n a l f l o a t ERASE WIDTH = 25 f ; // S i z e o f d e l e t i n g s t r o k e

p r i v a t e f l o a t s t r o k e W i d t h ;

p r i v a t e i n t s e l e c t e d C o l o r = C o l o r .BLACK;

p r i v a t e b o o l e a n d r a w P o i n t ;

// Hash Maps f o r m a i n t a i n i n g t h e drawn c a n v a s . p r i v a t e Map<Path , I n t e g e r> c o l o r s M a p ;

p r i v a t e Map<Path , F l o a t>widthMap ; p r i v a t e A r r a y L i s t<Path> p a t h s ;

p u b l i c DrawingView (f i n a l C o n t e x t c , f i n a l A t t r i b u t e S e t a t t r s ) {

s u p e r( c , a t t r s ) ; // I n i t i a l i z e

t h i s. s t r o k e W i d t h = STROKE WIDTH ; t h i s. d r a w P o i n t = f a l s e;

// I n i t i a l i z e HashMaps

t h i s. c o l o r s M a p = new HashMap<>() ; t h i s. widthMap = new HashMap<>() ; t h i s. p a t h s = new A r r a y L i s t<>() ; // S e t new Path

t h i s. p a t h = new Path ( ) ;

// S e t new P a i n t w i t h t h e d e s i r e d a t t r i b u t e s . t h i s. p a i n t = new P a i n t ( ) ;

t h i s. p a i n t . s e t A n t i A l i a s (t r u e) ; t h i s. p a i n t . s e t C o l o r ( C o l o r .BLACK) ; t h i s. p a i n t . s e t S t y l e ( P a i n t . S t y l e . STROKE) ; t h i s. p a i n t . s e t S t r o k e J o i n ( P a i n t . J o i n .ROUND) ; t h i s. p a i n t . s e t S t r o k e W i d t h ( 5 f ) ;

}

// O v e r r i d e o n S i z e C h a n g e d

@ O v e r r i d e

p r o t e c t e d v o i d o n S i z e C h a n g e d (f i n a l i n t width , f i n a l i n t h e i g h t , f i n a l i n t oldWidth , f i n a l i n t o l d H e i g h t ) {

s u p e r. o n S i z e C h a n g e d ( width , h e i g h t , oldWidth ,

o l d H e i g h t ) ;

// draw o n t o t h e d e f i n e d Bitmap

f i n a l Bitmap bitmap = Bitmap . c r e a t e B i t m a p ( width , h e i g h t , Bitmap . C o n f i g . ARGB 8888 ) ; new Canvas ( bitmap ) ;

}

// O v e r r i d e onDraw

@ O v e r r i d e

p r o t e c t e d v o i d onDraw ( Canvas c a n v a s ) { s u p e r. onDraw ( c a n v a s ) ;

// Draw t h e p a t h s when onDraw i s c a l l e d w i t h t h e s e t p a i n t a t t r i b u t e

f o r (f i n a l Path p : p a t h s ){

t h i s. p a i n t . s e t C o l o r (t h i s. c o l o r s M a p . g e t ( p ) ) ; t h i s. p a i n t . s e t S t r o k e W i d t h (t h i s. widthMap . g e t

( p ) ) ;

c a n v a s . drawPath ( p , t h i s. p a i n t ) ; }

// S e t a t t r i b u t e s o f t h e s t r o k e

t h i s. p a i n t . s e t C o l o r (t h i s. s e l e c t e d C o l o r ) ; t h i s. p a i n t . s e t S t r o k e W i d t h (t h i s. s t r o k e W i d t h ) ; c a n v a s . drawPath (t h i s. path , t h i s. p a i n t ) ; }

/∗ ∗

∗ When ACTION DOWN ( g e s t u r e h a s s t a r t e d ) .

∗ @param x x c o o r d i n a t e o f t o u c h e d p a r t o f t h e c a n v a s

∗ @param y y c o o r d i n a t e o f t o u c h e d p a r t o f t h e c a n v a s

∗/

p r i v a t e v o i d s t a r t T o u c h (f i n a l f l o a t x , f i n a l f l o a t y ) {

t h i s. d r a w P o i n t = t r u e; t h i s. p a t h . moveTo ( x , y ) ; t h i s. x = x ;

t h i s. y = y ; }

/∗ ∗

∗ When ACTION MOVE ( c h a n g e h a s happened d u r i n g p r e s s e d g e s t u r e )

∗ @param x x c o o r d i n a t e o f t o u c h e d p a r t o f t h e c a n v a s

∗ @param y y c o o r d i n a t e o f t o u c h e d p a r t o f t h e c a n v a s

∗/

p r i v a t e v o i d moveTouch (f i n a l f l o a t x , f i n a l f l o a t y ) {

t h i s. d r a w P o i n t = f a l s e;

f i n a l f l o a t dx = Math . a b s ( x − t h i s. x ) ; f i n a l f l o a t dy = Math . a b s ( y − t h i s. y ) ;

i f ( dx>= TOLERANCE | | dy>= TOLERANCE) {

t h i s. p a t h . quadTo (t h i s. x , t h i s. y , ( x + t h i s. x ) / 2 , ( y + t h i s. y ) / 2 ) ;

t h i s. x = x ; t h i s. y = y ; }

} /∗ ∗

∗ When ACTION UP ( g e s t u r e s t o p )

∗/

p r i v a t e v o i d upTouch ( ) {

t h i s. p a t h . l i n e T o (t h i s. x , t h i s. y ) ; t h i s. p a t h s . add (t h i s. p a t h ) ;

t h i s. c o l o r s M a p . p u t (t h i s. path , t h i s. s e l e c t e d C o l o r ) ;

t h i s. widthMap . p u t (t h i s. path , t h i s. s t r o k e W i d t h ) ;

Dokumen terkait