Grand Valley State University Grand Valley State University
ScholarWorks@GVSU ScholarWorks@GVSU
Technical Library School of Computing and Information Systems
2015
Path8nder: A Windows Console Application to Help Draw Finite Path8nder: A Windows Console Application to Help Draw Finite
State Machines Using Visio and Find the Paths in Excel State Machines Using Visio and Find the Paths in Excel
James Cornett
Student, Grand Valley State Univerity
Follow this and additional works at: https://scholarworks.gvsu.edu/cistechlib
ScholarWorks Citation ScholarWorks Citation
Cornett, James, "Path8nder: A Windows Console Application to Help Draw Finite State Machines Using
Visio and Find the Paths in Excel" (2015).
Technical Library
. 215.
https://scholarworks.gvsu.edu/cistechlib/215
This Project is brought to you for free and open access by the School of Computing and Information Systems at
ScholarWorks@GVSU. It has been accepted for inclusion in Technical Library by an authorized administrator of
ScholarWorks@GVSU. For more information, please contact [email protected].
!
!
!
!
!
Pathfinder:!A!Windows!Console!Application!to!
Help!Draw!Finite!State!Machines!Using!Visio!
and!Find!the!Paths!in!Excel!
!
!
Jim!Corn e tt,!Pa ul!Jo rg en se n!
School&of&Computing&and&Information&Systems,&Grand&Valley&State&University,&Allendale,&USA&
Email:&[email protected],&jorgens p @gvsu.ed u &
&
!
!
Abstract!
Tools!to!perform!finite!state!machine!path!analysis!for!students!are!typically!standalone!applications.!!
They!offer!little!documentation!and!are!not!intuitive.!!Pathfinder!is!a!Windows!console!application!
that!allows!the!use!of!M icro soft!V isio!and !Exc el!products!to!be!used!for!drawing!and!determining!the!
paths!in!a!finite!sate!machine.!!The!use!of!Microsoft!Office!tools!allows!the!user!to!the!ability!to!
perform!the!task!of!analysis!using!applications!with!which!most!are!familiar.!!!
!
!
1.!Introduction!
Finite state machine analysis is a common if not mandatory part of the curriculum of any software engineering
program. The modeling tools available to the student in these scholastic programs are generally standalone
applications. The applications typically provide rudimentary drawing and data entry capabilities. Pathfinder allows
the student to use common Microsoft Office tools in order to develop finite state machine drawings and perform
path analysis.
!
2.!Pathfinder!
Pathfinder was developed as a tool for students to more easily draw and analyze finite state machines. It does this
by the student placing the state and event information in a Microsoft Excel spreadsheet inside an Excel workbook.
Pathfinder takes the data and creates a Microsoft Visio drawing of the data. Pathfinder then returns to Excel and
opens another spreadsheet inside the workbook. On this spreadsheet pathfinder takes initial state and final state
information from the previous spreadsheet and performs a path analysis. The path analysis determines all of the
paths through the state machine, counts and records them on the newly created spreadsheet. At this point the user is
able to analyze to results of the path analysis. The user is also able to manipulate the Visio drawing as they see fit to
create the graphical state machine representation.
!
2.1.!Implementation!
!
Pathfinder is a standard Windows console application implemented using Microsoft Visual Studio and the Microsoft
VB.net Framework. The design can be broken into two separate parts. First is the use of the user data in Excel
spreadsheet to modify the Visio template and create a new Excel worksheet for the path analysis. The second
portion of the program is a recursive call to find paths from a given initial and final state.
When Pathfinder is launched, the flow of a program is as follows:
The user defined Excel workbook is opened.
The Visio template is opened and saved as a new Visio drawing file.
The state and transition information is transferred from one sheet to a new sheet in the Excel workbook.
The user defined state information is used rename the state shapes in the Visio document.
The user defined “from state” and “to state” information is used to create connections between states.
The connections are labeled with event and action information
The state and event information is transferred from one worksheet to a new worksheet in the Excel
workbook.
The initial state and final state for the path analysis are retrieved from the worksheet and placed in a
recursive function.
The recursive function places states as they are found into the spreadsheet for the current path.
The recursive function starts at the initial state and traverses the state machine until either the final state is
found or there are no other next states for the current state and the unused state / event queue is empty.
After all the paths are found, the program exits leaving the user to view the paths in the Excel workbook
and manipulate the Visio drawing as they see fit.
!
!
2.2.!Microsoft!Visio!Drawing!and!New!Worksheet!Creation!
The creation of the Visio drawing is fairly straight forward. The Visual Basic code required to perform the
operation is listed in Appendix I. Most of the work is performed using Microsoft’s Office interop functionality for
both Excel and Visio as can be seen in the code. To illustrate the operation an example using an garage door opener
will be presented.
The first step is for the user to place the state and transition information in the Excel worksheet as shown in Figure
1.
&
Figure'1'''Garage'Door'Opener'Finite'State'Machine'Information'in'Excel'
There are three sets of information provided in the worksheet. The first is the state, event and action names. The
second is the transitions “from” and “to” states with causes and outputs. Third is the initial and final state for the
path analysis. The user saves the worksheet in their documents folder.
When pathfinder is launched it opens the Visio template shown in Figure 2.
&
Figure'2'''Visio'Drawing'Template'for'Pathfinder
Pathfinder then matches the state names with data from the Excel worksheet and renames the state circles to include
the state names. Pathfinder then deletes all unused stats and begins placing connectors to represent the state
transitions. Lastly, the connectors are labeled with event and action numbers. The result is shown in Figure 3.
&
Figure'3'''Visio'Drawing'of'Garage'Door'Finite'State'Machine'Generated'by'Pathfinder
This allows the user to easily manipulate the drawing using Visio. The garage door example is shown in Figure 4
after some simple manipulations.
&
Figure'4''Visio'Drawing'of'Garage'Door'Finite'State'Machine'after'Modifications'in'Visio
The initial part of the program also creates a second worksheet to perform the path analysis. The transition data was
copied to this spreadsheet in a used area to ease the amount of coding required for the recursive call.
2.3!Path!Analysis!
The path analysis is performed using a recursive function. The Visual Basic code for the function can be found in
Appendix II. The flowchart for the pathfinding function is shown in Figure 5. The pathfinding function keeps a
queue of the used and unused state / event combinations. The queues are text lists and the individual entries contain
three pieces of information, the state, the number of times the state has been entered and the event used to exit the
state. The number of times the state has been entered is stored to account for loops in the state machine. In the
garage door example when traversing from s01 to s02, the first time in s05 the unused queue would record s051e02,
s051e04, s051e05 with 1 being the number of times in s05. The used queue would record s051e01. The second
time though s05 event e01 is disregarded and s052e02 is placed in the used queue. The unused queue would then
add s052e04 and s052e05 to the end of the unused queue list. The ability to account for loops adds considerable
complexity to the program.
The unused queue is used to determine how far to back up in the event of either finding a state with no unused
events or in the case of entering the last state. If no unused event is found for a state the program will back up to the
last unused state / event and continue searching for the final state. If the final state is reached the unused event
queue is used to determine where to start the next path without going back to the initial state.
As can be seen in the flow chart there are three paths to determine that the current state has events available to be
used. Once a state / event is chosen the next state is determined using the transition information. The next state is
then passed back to the recursive function along with the used and unused state / event queues.
Begin&Recursive
Is&last&state ?
Unused&state/
events?
Return&null
Start&new&path&from&
initial&s tate&t o&last&
unused&state/event
Choose&next&state
Add&stat e&to&path
Add&state&to&path
Find&events&for&
current&s tate
Unused&events&for&
current&s tate?
Unused&state/
event&queu e&
empty?
Return&to&last&
queued&unused&
state/event
Add&stat e/event&to &
used&queue
Call&Recursive
Return&null
Yes
No
No
Yes
Yes
No No
Yes
&
Figure'5'''Pathfinder'Recursive'Function'Flow'Chart
The output of the pathfinding for the garage door example can be seen in the Figure 6.
&
Figure'6'''Output'of'Pathfinder'for'the'Garage'Door'Opener
The paths from s01 to s04 are shown in the worksheet along with a count of the total number of paths. These initial
and final states were chosen because they best demonstrated the path and loop traversing of the Pathfinder program.
It should be noted what looks to be duplicate paths is actually two different paths created by different events leading
from state s05 to state s06.
3.!Conclusion!
In conclusion, Pathfinder provides an automated process to help students draw and find paths for finite state
machines. Though there are other state machine analysis applications that are available to the student, none have the
functionalities of the Microsoft Office products. These products are typically either free to students through the
Microsoft Dreamspark program or available at reduced cost though Microsoft student purchase programs.
Appendix(I(
!
!"#$%&'()*+%$'$,&-.,,*+/-!0&/%$#-12+/3(
!"#$%&'()*+%$'$,&-.,,*+/-!0&/%$#(
!"#$%&'()*+%$'$,&-.,,*+/-!0&/%$#-4*'*$(
(
(
(
)$563/()$563/7(
(
((((89*"(:/;<$$=(>'(?$%=@$$=(
((((89*"(%/&6%04A36/(>'(.@B/+&(
(
(
((((C6@()A*0DE(
(
((((((((9*"()F12+/3(G(:/;(12+/3->##3*+A&*$0(
(
((((((((8)F12+/3-?$%=@$$='->55DE(
(
(((((((()F12+/3-4*'*@3/(G(H%6/(
(
((((((((9*"(23?$%=<$$=(>'(12+/3-?$%=@$$=(
((((((((9*"(239$+IA&J(>'(C&%*0K(G(CF'&/"-10L*%$0"/0&-M/&N$35/%IA&JDCF'&/"-10L*%$0"/0&-C#/+*A3N$35/%-)F9$+6"/0&'E(O(PQC"A%&(
N6/3(I6"#-23'2P(
((((((((23?$%=<$$=(G()F12+/3-?$%=@$$='-.#/0D239$+IA&JE(
(
(
((((((((8(88CAL/(&/"#3A&/(A'(;$%=@$$=(
((((((((89*"(239$+IA&JCAL/(>'(C&%*0K(G(CF'&/"-10L*%$0"/0&-M/&N$35/%IA&JDCF'&/"-10L*%$0"/0&-C#/+*A3N$35/%-)F9$+6"/0&'E(O(
PQ9/'*K07-23'2P(
((((((((823?$%=<$$=-CAL/>'D239$+IA&JCAL/E(
(
((((((((9*"(L'$>##(G(:/;(4*'*$->##3*+A&*$0(
((((((((L'$>##-4*'*@3/(G(H%6/(
((((((((9*"(L'$9$+6"/0&(>'(4*'*$-9$+6"/0&(
((((((((9*"(L'$9$+IA&J(>'(C&%*0K(G(CF'&/"-10L*%$0"/0&-M/&N$35/%IA&JDCF'&/"-10L*%$0"/0&-C#/+*A3N$35/%-)F9$+6"/0&'E(O(
PQNC)-L'&2P(
((((((((L'$9$+6"/0&(G(L'$>##-9$+6"/0&'-.#/0DL'$9$+IA&JE(
!
!
!!!!!!!!"#$%$&$!'()*$+!
!!!!!!!!#,-!.+/0)1$!2+!3,+,/40)1$!
!!!!!!!!#,-!+(*+!2+!3,+,/4'()*$+!
!!!!!!!!#,-!+(*!2+!3,+,/4'()*$!
!!!!!!!!.+/0)1$!5!.+/2**426&,.$0)1$!
!!!!!!!!+(*+!5!.+/0)1$4'()*$+!
!
!!!!!!!!"7()81$!&$9&!)8:!:$%$&$!;8;+$:!+()*$+!
!!!!!!!!#,-!9!2+!<8&$1$=!
!
!!!!!!!!>/=!9!5!?!@/!?A!
!!!!!!!!!!!!#,-!6$%%@$9&!2+!'&=,81!
!!!!!!!!!!!!#,-!+&)&$@$9&!2+!'&=,81!
!!!!!!!!!!!!#,-!6/8@$9&!2+!'&=,81!
!
!!!!!!!!!!!!<B!'&=,814<+C;%%D=E-*&FGHFE96$%47$%%+GG9!I!?JK!LJ43)%;$J!@($8!
!!!!!!!!!!!!!!!!+&)&$@$9&!5!HFE96$%47$%%+GG9!I!?JK!?J4@$9&!
!!!!!!!!!!!!!!!!+(*!5!+(*+4<&$-G+&)&$@$9&J!
!!!!!!!!!!!!!!!!+(*4#$%$&$GJ!
!!!!!!!!!!!!E%+$!
!!!!!!!!!!!!!!!!+&)&$@$9&!5!HFE96$%47$%%+GG9!I!?JK!?J4@$9&!
!!!!!!!!!!!!!!!!6$%%@$9&!5!HFE96$%47$%%+GG9!I!?JK!LJ4@$9&!
!!!!!!!!!!!!!!!!6/8@$9&!5!+&)&$@$9&!M!NO!N!M!6$%%@$9&!
!!!!!!!!!!!!!!!!+(*!5!+(*+4<&$-G+&)&$@$9&J!
!!!!!!!!!!!!!!!!+(*4@$9&GJ!5!6/8@$9&!
!!!!!!!!!!!!E8:!<B!
!!!!!!!!C$9&!
!
!!!!!!!!#,-!F!2+!<8&$1$=!
!!!!!!!!#,-!+()*$P+$:Q;$;$!2+!C$R!S,+&GDB!<8&$1$=J!
!
!!!!!!!!>/=!F!5!?!@/!LL!
!!!!!!!!!!!!#,-!.+/'()*$?!2+!3,+,/4'()*$!
!!!!!!!!!!!!#,-!.+/'()*$L!2+!3,+,/4'()*$!
!!!!!!!!!!!!#,-!8$R7/88$6&/=!2+!3,+,/4'()*$!
!!!!!!!!!!!!#,-!.+/'()*$?@$9&!2+!'&=,81!
!!!!!!!!!!!!#,-!.+/'()*$L@$9&!2+!'&=,81!
!!!!!!!!!!!!#,-!.+/7/8@$9&E.$8&!2+!'&=,81!
!!!!!!!!!!!!#,-!.+/7/8@$9&26&,/8!2+!'&=,81!
!!!!!!!!!!!!#,-!.+/7/87/8!2+!'&=,81!
!!!!!!!!!!!!!
!!!!!!!!!!!!"#!$%&'()*"+,-../&012%34530678.*98..+443!:!;<=!><*[email protected]<!AB8(!
!!!!!!!!!!!!!!!!06'%!CD&!
!
!!!!!!!!!!!!0.+8!
!
!
!
!!!!!!!!!!!!!!!!E+D$B@28;A86%!F!530678.*98..+443!:!;<=!><*A86%!
!!!!!!!!!!!!!!!!E+D$B@28GA86%!F!530678.*98..+443!:!;<=!H<*A86%!
!!!!!!!!!!!!!!!!E+D$B@28;!F!+B2+*"%814E+D$B@28;A86%<!
!!!!!!!!!!!!!!!!E+D$B@28G!F!+B2+*"%814E+D$B@28GA86%<!
!!!!!!!!!!!!!!!!E+D$B@28;*I-%D9D((87%4E+D$B@28G=!?'+I-%D9D((87%J'&*E'+I-%D9D((87%J'&,D(8<!
!
!!!!!!!!!!!!!!!!CD&!0@7B!7;!"(!E+D$B@28;*C&D19D((87%+!
!!!!!!!!!!!!!!!!!!!!CD&!0@7B!7G!"(!7;*C&D1$B88%*9D((87%+!
!!!!!!!!!!!!!!!!!!!!!!!!"#!447G*AD$B88%*"J!F!E+D$B@28G*"J<<!AB8(!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8K9D((87%D&!F!7G*C&D1$B88%!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!"#!,D%!4+B@28L+8MN-8-8*9D(%@'(+4(8K9D((87%D&*"J<<!AB8(!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+B@28L+8MN-8-8*IMM4(8K9D((87%D&*"J<!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!E+D9D(A86%0E8(%!F!530678.*98..+443!:!;<=!O<*A86%!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!E+D9D(A86%I7%'D(!F!530678.*98..+443!:!;<=!P<*A86%!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!E+D9D(9D(!F!E+D9D(A86%0E8(%!Q!RSR!Q!E+D9D(A86%I7%'D(!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8K9D((87%D&*A86%4<!F!E+D9D(9D(!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8K9D((87%D&*98..+L4R0(MI&&DKR<*CD&1-.@!F!RTR!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8K9D((87%D&*98..+L4R9D(U'(8VD-%806%R<*CD&1-.@!F!RGR!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(8K9D((87%D&*98..+L4R$B@28VD-%8$%3.8R<*CD&1-.@!F!R;R!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!0(M!"#!
!!!!!!!!!!!!!!!!!!!!!!!!0(M!"#!
!!!!!!!!!!!!!!!!!!!!,86%!
!!!!!!!!!!!!!!!!,86%!
!!!!!!!!!!!!0(M!"#!
!!!!!!!!,86%!
!
!
!
!!!!!!!!J'1!E+DJD7W@%B$@E8!I+!$%&'()!F!$3+%81*0(E'&D(18(%*X8%CD.M8&W@%B4$3+%81*0(E'&D(18(%*$287'@.CD.M8&*53JD7-18(%+<!:!
RYJ8+')(;*E+M6R!
!!!!!!!!E+DJD7-18(%*$@E8I+4E+DJD7W@%B$@E8<!
!
!!!!!!!!Z$%@&%!(8K!KD&[+B88%!#D&!2@%B!@(@.3+'+!
!!!!!!!!J'1!6.$B88%G!I+!0678.*\D&[+B88%!
!!!!!!!!"#$%&&'(!)!*+,"-&#.$%&&'/.01123!
!!!!!!!!"#$%&&'(.4&##/256!53!)!*+,"-&#.789:/%&&'/2;$%&&'5;3.4&##/2(<6!5(3.=&"'!
!!!!!!!!"#$%&&'(.4&##/256!(3!)!*+,"-&#.789:/%&&'/2;$%&&'5;3.4&##/2(<6!5>3.=&"'!
!!!!!!!!"#$%&&'(.4&##/2(6!53!)!*+,"-&#.789:/%&&'/2;$%&&'5;3.4&##/2(56!5(3.=&"'!
!!!!!!!!"#$%&&'(.4&##/2(6!(3!)!*+,"-&#.789:/%&&'/2;$%&&'5;3.4&##/2(56!5>3.=&"'!
!
!!!!!!!!*+,"-&#.789:/%&&'/2;$%&&'5;3.0-'?@A'&23!
!!!!!!!!*+,"-&#.789:/%&&'/2;$%&&'5;3.BACD&2;E5FG(>;3.48H+!I!
!!!!!!!!!!!!2*+,"-&#.789:/%&&'/2;$%&&'(;3.BACD&2;A(<<;33!
!
!!!!!!!!*+,"-&#.789:/%&&'/2;$%&&'(;3.0-'?@A'&23!
!
!!!!!!!!JK&L!/'9?CD!M?/'!N89!HA'%/!
!!!!!!!!O?P!HA'%M?/'!0/!K&L!M?/'2QN!$'9?CD323!
!!!!!!!!O?P!&@&C'M?/'!0/!K&L!M?/'2QN!$'9?CD323!
!
!!!!!!!!HA'%M?/'.0112*+,"-&#.789:/%&&'/2;$%&&'(;3.4&##/256!(3.=&"'3!
!
!!!!!!!!JR#A-&!;N98P!'8!/'A'&;!?CN89PA'?8C!8C!/%&&'(!S!0(<<!
!!!!!!!!O?P!T!0/!UC'&D&9!
!!!!!!!!E89!T!)!5!=8!((!
!!!!!!!!!!!!UN!*+,"-&#.789:/%&&'/2;$%&&'(;3.4&##/22T!V!(<<36!53.'&"'!)!HA'%M?/'2<3!=%&C!
!!!!!!!!!!!!!!!!&@&C'M?/'.0112*+,"-&#.789:/%&&'/2;$%&&'(;3.4&##/22T!V!(<<36!>3.=&"'3!
!!!!!!!!!!!!,C1!UN!
!!!!!!!!K&"'!
!
!!!!!!!!J$89'!'%&!;N98P!'8!/'A'&;!?CN89PA'8C!
!!!!!!!!O?P!/89'BACD&!0/!BACD&!
!!!!!!!!/89'BACD&!)!*+,"-&#.789:/%&&'/2;$%&&'(;3.BACD&2;0(<<F4((>;3!
!!!!!!!!/89'BACD&.$89'2W&+5F)*+,"-&#.789:/%&&'/2;$%&&'(;3.BACD&2;0(<<F0((>;36!Q91&95F)X#$89'Q91&9."#0/-&C1?CD6!I!
!!!!!!!!!!!!!!!!!!!!!!!W&+(F)*+,"-&#.789:/%&&'/2;$%&&'(;3.BACD&2;4(<<F4((>;36!Q91&9(F)X#$89'Q91&9."#0/-&C1?CD6!I!
!!!!!!!!!!!!!!!!!!!!!!!Q9?&C'A'?8CF)X#$89'Q9?&C'A'?8C."#$89'48#YPC/6!I!
!!!!!!!!!!!!!!!!!!!!!!!G&A1&9F)X#Z&/K8[Y&//."#Z&/3!
!
!!!!!!!!O?P!/'A'&!0/!$'9?CD!
!!!!!!!!O?P!#A/'$'A'&!0/!$'9?CD!
!!!!!!!!O?P!Y/&1\Y&Y&!0/!K&L!M?/'2QN!$'9?CD3!
!!!!!!!!O?P!YCY/&1\Y&Y&!0/!K&L!M?/'2QN!$'9?CD3!
!
!!!!!!!!/'A'&!)!2"#$%&&'(.4&##/256!(3.=&"'!]!;5;3!
!!!!!!!!#A/'$'A'&!)!"#$%&&'(.4&##/2(6!(3.=&"'!
!!!!!!!!"#789:^88:.789:/%&&'/2;$%&&'(;3.4&##/2_6!53!)!;`!8N!HA'%/;!
!
!!!!!!!!"#$%&'()#*+,-.$#/0!./12&342230!'565#0!/6'57565#0!890!:980!80!%'#;<%#%#0!%=%'#;<%#%#>!
!
Appendix(II(
!
!"#$%&'#()*$"+,&-*./012$*3(4,(12$*354663&$7%&'#8(239'+:;'':(4,(9'+:<'':8(,%7%*(4,(=%+&#>8(37,%=%7%*(4,(=%+&#>8(?(
(((((((((((((((((((((((67%@)'AB#C*2(4,(B#%*>*+8(,%7%*)'AB#C*2(4,(B#%*>*+8(67%@D'3"E#B#C*2(4,(B#%*>*+ 8(",*CF"*"*(4,(G&,%.HI(
=%+&#>J8(?(
((((((((((((((((((((((("#",*CF"*"*(4,(G&,%.HI(=%+&#>JJ(
(
((((((((K&E(<7$:=%7%*L+"*(4,(;''3*7#(
((((((((K&E(#'M#",*C;7$:L'=%7%*L+"*(4,(;''3*7#(
((((((((K&E(*-*#%G&,%(4,(N*A(G&,%.HI(=%+&#>J(
((((((((K&E(<7$:L'=%7%*(4,(=%+&#>(
((((((((<7$:L'=%7%*(O(N'%@&#>(
((((((((<7$:=%7%*L+"*(O(!73,*(
((((((((#'M#",*C;7$:L'=%7%*L+"*(O(!73,*(
((((((((K&E(#*2%=%7%*1-*#%(4,(=%+&#>(
((((((((#*2%=%7%*1-*#%(O(N'%@&#>(
((((((((K&E($"++*#%1-*#%(4,(=%+&#>(
(((((((($"++*#%1-*#%(O(N'%@&#>(
((((((((K&E($'"#%)7#>*(4,()7#>*(
(((((((($'"#%)7#>*(O(N'%@&#>(
(
((((((((BI(/&C.,%7%*8(P8(QJ(O(37,%=%7%*(L@*#(
(
((((((((((((R7CC(37,%(,%7%*(%'(67%@(
((((((((((((R)*,*%(3&,%,(7#C(-7+7<3*,(7#C(&#$+*E*#%($'3"E#(
((((((((((((239'+:;'':59'+:,@**%,.S=@**%TSJ5D*33,.67%@)'AB#C*28(67%@D'3"E#B#C*2J(O(/&C.,%7%*8(P8(QJ (
((((((((((((239'+:;'':59'+:,@**%,.S=@**%TSJ5D*33,.U8(TJ(O(67%@D'3"E#B#C*2(
((((((((((((R"#",*CF"*"*5)*E'-*4%."#",*CF"*"*5D'"#%(V(PJ(
(
((((((((((((R3'':(I'+("#",*C(67%@,(&#(%@*(W"*"*X$'60(%'(W"*"*(
((((((((((((RK&E(<7$:L'=%7%*(4,(=%+&#>(
((((((((((((RN'("#",*C(67%@,(V(K*3*%*(D'3"E#(7#C()*%"+#(
(
((((((((((((BI("#",*CF"*"*5D'"#%(O(Y(L@*#(
(((((((((((((((()*%"+#(K;N"335Z73"*(
((((((((((((1#C(BI(
(
(
((((((((((((K&E(+'AB#C*2D'"#%T(4,(B#%*>*+(
!
!!!!!!!!!!!!"#$%&'()#)*!+!,-,.*/0,*,*1,-,.*/0,*,*23',-)!4!56!
!!!!!!!!!!!!.)#)*!+!78/1,-,.*/0,*,*1,-,.*/0,*,*23',-)!4!569!59!:6!
!!!!!!!!!!!!;'<=-/*>3',-)?!+!3=-)178/1"#$%&'()#)*9!:9!566!
!
!!!!!!!!!!!!@8A!B!C.!=-)*B*;!
!!!!!!!!!!!!B!+!D#)EF'<=-/*>!
!
!!!!!!!!!!!!G';!B!+!5H!&'!D#)EF'<=-/*>!
!
!!!!!!!!!!!!!!!!=I!178/1.)#)*9!59!J6!+!>KL';%M''%2L';%.E**).1N(E**)?N623*KK.1B9!D#)E3'K,A-=-/*>62&*>)6! &E*-!
!
!!!!!!!!!!!!!!!!!!!!;'<=-/*>3',-)?!+!;'<=-/*>3',-)?!4!5!
!
!!!!!!!!!!!!!!!!O-/!=I!
!
!!!!!!!!!!!!!!!!=I!;'<=-/*>3',-)?!+!H!&E*-!
!!!!!!!!!!!!!!!!!!!!D#)EF'<=-/*>!+!B!P!5!
!!!!!!!!!!!!!!!!!!!!O>8)!G';!
!!!!!!!!!!!!!!!!O-/!=I!
!
!!!!!!!!!!!!Q*>)!
!
!!!!!!!!!!!!"#$%()#)*&;,*!+!&;,*!
!
!!!!!!!!!!!!R3'DS!#-/!D#.)*!)'!-*>)!D#)E!$'K,A-!
!!!!!!!!!!!!>KL';%M''%2L';%.E**).1N(E**)?N62F#-B*1>KL';%M''%2L';%.E**).1N(E**)?N623*KK.1D#)EF'<=-/*>9!D#)E3'K,A-=-/*>69!T!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!>KL';%M''%2L';%.E**).1N(E**)?N623*KK.15H9!D#)E3'K,A-=-/*>6623'DS16!
!
!!!!!!!!!!!!D#)E3'K,A-=-/*>!+!D#)E3'K,A-=-/*>!P!5!
!
!!!!!!!!!!!!@8A!)*ADF#-B*!C.!F#-B*!
!!!!!!!!!!!!)*ADF#-B*!+!>KL';%M''%2L';%.E**).1N(E**)?N623*KK.15H9!D#)E3'K,A-=-/*>6!
!!!!!!!!!!!!)*ADF#-B*2(*K*$)16!
!!!!!!!!!!!!>KL';%M''%2L';%.E**).1N(E**)?N62U#.)*16!
!
!!!!!!!!!!!!-*>)()#)*OV*-)!+!"#$%&'()#)*!
!
!!!!!!!!!!!!R$K*#;!*V*-)!K8.)!
!!!!!!!!!!!!*V*-)W8.)23K*#;16!
!
!
!!!!!!!!"#$%!
!!!!!!!!!!!!&'($%)*!$*+*%!'(*,!$-)%+.$/%%*!-+*/!+(.!'(0)%1%(*!),2!'(.%3!
!!!!!!!!!!!!3#4,)56,,574,)5$/%%*$89:/%%*;9<7=%##$8-+*/>,2?(.%3@!-+*/=,#A1(?(.%3<!B!C'.8$*+*%@!D@!E< !
!!!!!!!!!!!!-+*/>,2?(.%3!B!-+*/>,2?(.%3!F!D!
!
!!!!!!!!!!!!&.%0#+)%!G+)'+H#%$!(%%.%.!*,!I%*!+##!%G%(*$!J,)!0A))%(*!$*+*%!
!!!!!!!!!!!!K'1!2!L$!?(*%I%)!
!!!!!!!!!!!!K'1!$*+*%"G%(*!L$!:*)'(I!
!!!!!!!!!!!!K'1!J')$*=%##!L$!>+(I%!
!!!!!!!!!!!!K'1!$*+*%=,A(*!L$!?(*%I%)!
!
!!!!!!!!!!!!$*+*%=,A(*!B!M!
!!!!!!!!!!!!J')$*=%##!B!3#4,)56,,574,)5$/%%*$89:/%%*;9<7=%##$8DM@!-+*/=,#A1(?(.%3<!
!!!!!!!!!!!!0,A(*>+(I%!B!3#4,)56,,574,)5$/%%*$89:/%%*;9<7>+(I%8J')$*=%##@!J')$*=%##7"(.8N#K')%0*',(73#K,2(<<!
!
!!!!!!!!!!!!&#,,5!J,)!+##!%G%(*$!J,)!0A))%(*!$*+*%!
!!!!!!!!!!!!?J!O,*!H+05:*+*%P)A%!P/%(!
!!!!!!!!!!!!!!!!Q,)!2!B!;MD!P,!;;E!
!!!!!!!!!!!!!!!!!!!!?J!3#4,)56,,574,)5$/%%*$89:/%%*;9<7=%##$82@!D<7P%3*!B!C'.8$*+*%@!D@!E<!P/%(!
!!!!!!!!!!!!!!!!!!!!!!!!$*+*%=,A(*!B!CR"30%#74,)5$/%%*QA(0*',(7=,A(*?J80,A(*>+(I%@!C'.8$*+*%@!D@!E<<!
!!!!!!!!!!!!!!!!!!!!!!!!$*+*%"G%(*!B!C'.8$*+*%@!D@!E<!S!$*+*%=,A(*!S!3#4,)56,,574,)5$/%%*$89:/%%*;9<7=%##$82@!E <7P%3*!
!!!!!!!!!!!!!!!!!!!!!!!!%G%(*T'$*7L..8$*+*%"G%(*<!
!!!!!!!!!!!!!!!!!!!!"(.!?J!
!!!!!!!!!!!!!!!!O%3*!
!!!!!!!!!!!!"(.!?J!
!
!!!!!!!!!!!!&0/%05!*,!$%%!'J!$*+*%U%G%(*!/+$!H%%(!A$%.!
!!!!!!!!!!!!&'J!(,!A(A$%.!-+*/$!%3'*!
!!!!!!!!!!!!K'1!0!L$!?(*%I%)!
!!!!!!!!!!!!K'1!'!L$!?(*%I%)!
!
!!!!!!!!!!!!K'1!1'.:*+*%!L$!:*)'(I!
!!!!!!!!!!!!K'1!A(A$%.:*+*%Q,A(.!L$!6,,#%+(!
!
!!!!!!!!!!!!A(A$%.:*+*%Q,A(.!B!Q+#$%!
!!!!!!!!!!!!1'.:*+*%!B!C'.8$*+*%@!D@!E<!
!
!!!!!!!!!!!!&*/'$!-+)*!)%1,G%$!#,,-!%#%1%(*$!J),1!*/%!%G%(*T'$*!
!!!!!!!!!!!!&-)',)!*,!0/%05'(I!J,)!*/%!(%3*!:*+*%U"G%(*!
!!!!!!!!!!!!&$*,)%!$*+*%$!'(!%G%(*V,#.!
!!!!!!!!!!!!&K'.!*/'$!H%0+A$%!,J!*/%!)%1,G%!$/'J*$!#'$*!
!
!!!!!!!!!!!!"#$!%&%'()*+,!-.!/#.(012!3(4#'56!
!!!!!!!!!!!!"#$!4%$*&%7&%'(.!-.!8**+%9'!
!!!!!!!!!!!!4%$*&%7&%'(.!:!;9+.%!
!!!!!!!!!!!!%&%'()*+,!:!<*(=#'5!
!
!!!!!!!!!!!!;*4!#!:!>!?*!@.%,A@%@%BC*@'(!D!E!
!!!!!!!!!!!!!!!!F2!0G#,0@.%,A@%@%0#6H!EH!I6!:!0$#,3(9(%66!?=%'!
!!!!!!!!!!!!!!!!!!!!"#$!J!-.!F'(%5%4!
!!!!!!!!!!!!!!!!!!!!;*4!J!:!0%&%'(/#.(BC*@'(!D!E6!?*!>!3(%K!DE!
!!!!!!!!!!!!!!!!!!!!!!!!F2!00G#,0%&%'(/#.(0J6H!EH!I6!:!0$#,3(9(%66!L!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!-',!00G#,0@.%,A@%@%0#6H!M66!:!0G#,0%&%'(/#.(0J6H!M6666!?=%'!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!%&%'(/#.(BN%$*&%0%&%'(/#.(0J66!
!!!!!!!!!!!!!!!!!!!!!!!!7',!F2!
!!!!!!!!!!!!!!!!!!!!<%O(!
!!!!!!!!!!!!!!!!!!!!P#!:!@.%,A@%@%BC*@'(!D!Q!
!!!!!!!!!!!!!!!!7',!F2!
!!!!!!!!!!!!<%O(!
!
!!!!!!!!!!!!P2#',!'%O(!.(9(%&%'(!
!!!!!!!!!!!!;*4!R!:!>!?*!%&%'(/#.(BC*@'(!D!E!
!
!!!!!!!!!!!!!!!!F2!<*(!0@.%,A@%@%BC*'(9#'.0%&%'(/#.(0R666!?=%'!
!!!!!!!!!!!!!!!!!!!!'%O(3(9(%7&%'(!:!%&%'(/#.(0R6!
!!!!!!!!!!!!!!!!!!!!@'@.%,3(9(%;*@',!:!?4@%!
!!!!!!!!!!!!!!!!!!!!R!:!%&%'(/#.(BC*@'(!D!E!
!!!!!!!!!!!!!!!!7',!F2!
!!!!!!!!!!!!<%O(!
!
!!!!!!!!!!!!PF2!(=%4%!#.!'*!@'@.%,!.(9(%.!2*4!9!R@44%'(!.(9(%!
!!!!!!!!!!!!F2!<*(!@'@.%,3(9(%;*@',!?=%'!
!
!!!!!!!!!!!!!!!!P<*!@'@.%,!K9(=.!D!"%+%(%!C*+@$'!9',!N%(@4'!
!!!!!!!!!!!!!!!!F2!@'@.%,A@%@%BC*@'(!:!>!?=%'!
!!!!!!!!!!!!!!!!!!!!O+S*4T8**TBS*4T.=%%(.0U3=%%(QU6BN9'5%0O+S*4T8**TBS*4T.=%%(.0U3=%%(QU6BC%++.0E>H!K9(=C*+@$'F',%O6H!L!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!O+S*4T8**TBS*4T.=%%(.0U3=%%(QU6BC%++.0K9(=N*VF',%OH!
K9(=C*+@$'F',%O66B"%+%(%06!
!
!!!!!!!!!!!!!!!!!!!!N%(@4'!"8<@++BW9+@%!
!!!!!!!!!!!!!!!!7',!F2!
!
!!!!!!!!!!!!!!!!"#$!'*X'@.%,89RT?*3(9(%!-.!3(4#'5!
!!!!!!!!!!!!!!!!"#$!4*VF',%OC*@'(E!-.!F'(%5%4!
!!!!!!!!!!!!!!!!"#$!%&''()*+,*-./01)2(34!56!1)*(7('!
!
!
!
!!!!!!!!!!!!!!!!)/8)&6(29,%:;/<*,*(!=!&)&6(2>&(&(?&)&6(2>&(&(@A/&)*!B!4C!
!
!!!!!!!!!!!!!!!!6*,*(!=!D#2?&)&6(2>&(&(?&)&6(2>&(&(@A/&)*!B!4CE!4E!FC!
!
!!!!!!!!!!!!!!!!'/01)2(3A/&)*4!=!A1)*?D#2?)/8)&6(29,%:;/<*,*(E!FE!4CC!
!
!!!!!!!!!!!!!!!!%&''()*+,*-./01)2(34!=!G,*-./01)2(3!
!
!!!!!!!!!!!!!!!!"#$!*!56!1)*(7('!
!
!!!!!!!!!!!!!!!!H/'!*!=!4I!;/!G,*-./01)2(3!
!
!!!!!!!!!!!!!!!!!!!!1J!?D#2?6*,*(E!4E!KC!=!3LM/':9//:@M/':6-((*6?N<-((*ONC@A(LL6?*E!G,*-A/L&$)1)2(3C@;(3*C! ;-()!
!
!!!!!!!!!!!!!!!!!!!!!!!!'/01)2(3A/&)*4!=!'/01)2(3A/&)*4!B!4!
!
!!!!!!!!!!!!!!!!!!!!P)2!1J!
!
!!!!!!!!!!!!!!!!!!!!1J!'/01)2(3A/&)*4!=!I!;-()!
!!!!!!!!!!!!!!!!!!!!!!!!G,*-./01)2(3!=!*!Q!4!
!!!!!!!!!!!!!!!!!!!!!!!!P3#*!H/'!
!!!!!!!!!!!!!!!!!!!!P)2!1J!
!
!!!!!!!!!!!!!!!!R(3*!
!
!!!!!!!!!!!!!!!!)/8)&6(29,%:;/<*,*(;'&(!=!;'&(!
!
!
!
!!!!!!!!!!!!!!!!3LM/':9//:@M/':6-((*6?N<-((*ONC@.,)7(?3LM/':9//:@M/':6-((*6?N<-((*ONC@A(LL6?G,*-./01)2(3E!G,*-A/L&$)1)2(3CE!
S!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3LM/':9//:@M/':6-((*6?N<-((*ONC@A(LL6?%&''()*+,*-./01)2(34E!
G,*-A/L&$)1)2(3CC@AL(,'?C!
!
!!!!!!!!!!!!!!!!)(3*<*,*(PT()*!=!)/8)&6(29,%:;/<*,*(!
!
!!!!!!!!!!!!P)2!1J!
!
!!!!!!!!"#$!%&!
!
!!!!!!!!'($$!)*(*+!+,+#*!*-!.)+$!/0)*!
!!!!!!!!102!3.+.+4-.#*+5!6)!%#*+7+5!
!!!!!!!!3.+.+4-.#*+5!8!.)+$9.+.+:4-.#*!;!<!
!
!!!!!!!!%&!=>(?@A*(*+B5.+!C5!#-D#.)+$E(?@B-A*(*+B5.+F!8!B5.+!BG+#!
!!!!!!!!!!!!HG0/+!I-*!==J0$=#+K*A*(*+",+#*L!<L!MFF!8!=J0$=.)+$9.+.+=3.+.+4-.#*+5FL!<L!MFFF!
!!!!!!!!!!!!!!!!.)+$9.+.+:N+2-,+6*=3.+.+4-.#*+5F!
!!!!!!!!!!!!!!!!3.+.+4-.#*+5!8!3.+.+4-.#*+5!;!<!
!!!!!!!!!!!!"#$!HG0/+!
!!!!!!!!"#$!%&!
!
!!!!!!!!.)+$9.+.+:6$$=#+K*A*(*+",+#*F!
!!!!!!!!)*(*+!8!J0$=#+K*A*(*+",+#*L!<L!OF!
!!!!!!!!?.55+#*",+#*!8!J0$=#+K*A*(*+",+#*L!PF!
!
!!!!!!!!')+/+?*!*G+!#+K*!)*(*+!
!!!!!!!!102!,!6)!%#*+7+5!
!!!!!!!!102!#+K*A*(*+Q-.#$!6)!E--/+(#!
!!!!!!!!#+K*A*(*+Q-.#$!8!Q(/)+!
!
!!!!!!!!Q-5!,!8!RS<!B-!RRM!
!!!!!!!!!!!!%&!==K/H-5@E--@:H-5@)G++*)=TAG++*RTF:4+//)=,L!<F:B+K*!8!J0$=)*(*+L!<L!MFF!6#$!U!
!!!!!!!!!!!!!!!!=K/H-5@E--@:H-5@)G++*)=TAG++*RTF:4+//)=,L!MF:B+K*!8!?.55+#*",+#*F!6#$!U!
!!!!!!!!!!!!!!!!I-*!#+K*A*(*+Q-.#$F!BG+#!
!
!!!!!!!!!!!!!!!!102!?-.#*N(#7+I+K*<!6)!N(#7+!
!!!!!!!!!!!!!!!!102!&05)*4+//I+K*<!6)!N(#7+!
!!!!!!!!!!!!!!!!102!)*(*+4-.#*I+K*<!6)!%#*+7+5!
!!!!!!!!!!!!!!!!102!#+K*A*(*+B+2V!6)!A*50#7!
!
!!!!!!!!!!!!!!!!)*(*+4-.#*I+K*<!8!S!
!!!!!!!!!!!!!!!!&05)*4+//I+K*<!8!K/H-5@E--@:H-5@)G++*)=TAG++*RTF:4+//)=<SL!V(*G4-/.2#%#$+KF!
!!!!!!!!!!!!!!!!?-.#*N(#7+I+K*<!8!K/H-5@E--@:H-5@)G++*)=TAG++*RTF:N(#7+=&05)*4+//I+K*<L!
&05)*4+//I+K*<:"#$=W/105+?*0-#:K/1-X#FF!
!!!!!!!!!!!!!!!!?-.#*N(#7+I+K*<:A+/+?*=F!
!!!!!!!!!!!!!!!!#+K*A*(*+B+2V!8!K/H-5@E--@:H-5@)G++*)=TAG++*RTF:4+//)=,L!RF:B+K*!
!!!!!!!!!!!!!!!!)*(*+4-.#*I+K*<!8!JY"K?+/:H-5@)G++*Q.#?*0-#:4-.#*%&=?-.#*N(#7+I+K*<L!J0$=#+K*A*(*+B+2VL!<L!MFF!
!!!!!!!!!!!!!!!!)*(*+!8!#+K*A*(*+B+2V!Z!=)*(*+4-.#*I+K*<![!<F!
!!!!!!!!!!!!!!!!#+K*A*(*+Q-.#$!8!B5.+!
!
!!!!!!!!!!!!"#$!%&!
!!!!!!!!'()*!
!
!!!!!!!!+,-!./0#*12#3('()*!45!12#3(!
!!!!!!!!+,-!&,65*7(88'()*!45!12#3(!
!!!!!!!!+,-!5*2*(7/0#*'()*!45!%#*(3(6!
!
!!!!!!!!%&!9:2.;<*2*(=60(!>6!#/?#05($@2.;=/<*2*(=60(A!B!=60(!=C(#!
!
!!!!!!!!!!!!0#05($D0(0(E1(-/F(9#()*<*2*("F(#*A!
!
!!!!!!!!"85(%&!'/*!9G,$95*2*(H!IH!JA!B!825*<*2*(A!=C(#!
!
!!!!!!!!!!!!K/6!6!B!LMI!=/!LLJ!
!!!!!!!!!!!!!!!!%&!99)8N/6;@//;EN/6;5C((*59O<C((*LOAE7(88596H!IAE=()*!B!G,$9#()*<*2*("F(#*H!IH!JAA!4#$!P!
!!!!!!!!!!!!!!!!!!!!'/*!9)8N/6;@//;EN/6;5C((*59O<C((*LOAE7(88596H!JAE=()*!B!.066(#*"F(#*A!4#$!P!
!!!!!!!!!!!!!!!!!!!!'/*!905($D0(0(E7/#*2,#595*2*(!Q!)8N/6;@//;EN/6;5C((*59O<C((*LOAE7(88596H!JAE=()*AAA!=C(#!
!
!!!!!!!!!!!!!!!!!!!!+,-!(F(#*7/0#*!45!%#*(3(6!
!!!!!!!!!!!!!!!!!!!!(F(#*7/0#*!B!7%#*9G,$9#()*<*2*("F(#*H!RAA!
!!!!!!!!!!!!!!!!!!!!5*2*(7/0#*'()*!B!M!
!!!!!!!!!!!!!!!!!!!!&,65*7(88'()*!B!)8N/6;@//;EN/6;5C((*59O<C((*LOAE7(8859IMH!S2*C7/80-#%#$()A!
!!!!!!!!!!!!!!!!!!!!./0#*12#3('()*!B!)8N/6;@//;EN/6;5C((*59O<C((*LOAE12#3(9&,65*7(88'()*H!
&,65*7(88'()*E"#$9T8+,6(.*,/#E)8+/U#AA!
!!!!!!!!!!!!!!!!!!!!5*2*(7/0#*'()*!B!GV").(8EN/6;5C((*K0#.*,/#E7/0#*%&9./0#*12#3('()*H!G,$9#()*<*2*("F(#*H!IH!JAA!
!!!!!!!!!!!!!!!!!!!!0#05($D0(0(E4$$9G,$9#()*<*2*("F(#*H!IH!JA!Q!95*2*(7/0#*'()*A!Q!9)8N/6;@//;EN/6;5C((*59O<C((*LOAE7(88596H!
JAE=()*AA!
!
!!!!!!!!!!!!!!!!!!!!+,-!;!45!%#*(3(6!
!!!!!!!!!!!!!!!!!!!!K/6!;!B!90#05($D0(0(E7/0#*!W!IA!=/!M!<*(S!WI!
!!!!!!!!!!!!!!!!!!!!!!!!%&!990#05($D0(0(9;A!X,;(!9G,$9#()*<*2*("F(#*H!IH!YA!Q!OZOAA!P!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!4#$!97%#*9G,$90#05($D0(0(9;AH!RAA![!(F(#*7/0#*AA!=C(#!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!0#05($D0(0(E1(-/F(4*9;A!
!!!!!!!!!!!!!!!!!!!!!!!!"#$!%&!
!!!!!!!!!!!!!!!!!!!!'()*!
!!!!!!!!!!!!!!!!"#$!%&!
!!!!!!!!!!!!'()*!
!!!!!!!!"#$!%&!
!
!
!
!
!!!!!!!!"#$%&'!%(%)*!$+,*!
!!!!!!!!%(%)*-+,*./$%&'01!
!
!!!!!!!!"#&$$!*2%!'%#3',(%!43)#*5)!
!!!!!!!!6%#3',+(%0789:#%$;!:$<5'=>55=;!,*&*%;!$&,*?*&*%;!@&*265AB)C%:;!,*&*%65AB)C%:;!@&*2/5$3D)B)C%:;!E!
!!!!!!!!!!!!!!!!!!3,%CF3%3%;!3)3,%CF3%3%1!
!
!!!!!!!!6%*3')!G>H3$$.I&$3%!
!!!!9)C!J3)#*+5)!
!
9)C!75C3$%!