SlideShare une entreprise Scribd logo
1  sur  34
Redmine
Redmine




                    (@suer)
✓   @suer
    ✓
    ✓
    ✓           Ruby Java C#




2                   #ngrk02 2011/02/26
✓ Rails3 + WebSocket + Webkit Notification +
      Groonga


    ✓ TiDD + Skype + Git


    ✓            Redmine           issue                               !
    ✓ Reject                                (14:50-15:10 @mallowlabs


3                      #ngrk02 2011/02/26
…




        Redmine




4       #ngrk02 2011/02/26
Redmine




                               ✓
                               ✓ Web


                               ✓
                                   (1.1.0   )
                               ✓ etc...

5         #ngrk02 2011/02/26
Redmine



          ✓
          ✓
          ✓         UI
          ✓




6         #ngrk02 2011/02/26
✓   Rails


    ✓




7               #ngrk02 2011/02/26
Redmine


          2010/07/18 1.0.0
          2011/01/09 1.1.0
          2011/04/30 1.2.0      (   )




8          #ngrk02 2011/02/26
Conflict ...




                             NG
9             #ngrk02 2011/02/26
Plugin


     ✓   Code Review Plugin
     ✓   Backlogs Plugin
     ✓   Hudson Plugin
     ✓   CSV Importer
     ✓   Issue Extensions
     ✓   Wiki Extensions
     ✓   etc.. (http://www.r-labs.org/projects/r-labs/wiki/Redmine   )




10                                     #ngrk02 2011/02/26
Redmine Plugin(                    )



     ✓
     ✓ iPhoneUI (folk project)
     ✓
     ✓                         CSV
     ✓ MS Project
              https://github.com/suer




11                                #ngrk02 2011/02/26
12   #ngrk02 2011/02/26
Plugin




     ✓ Ruby/Rails
     ✓ Rails Engines
     ✓ Redmine         (User, Role, Issue, Journal, etc.)
     ✓                             (                        )




13                     #ngrk02 2011/02/26
Rails Engines


     ✓ Rails
      ✓
      ✓ migration        →
      ✓ Routes        → URL
      ✓ Rails3      (Redmine             2   )



14                  #ngrk02 2011/02/26
Plugin
$ ruby script/generate redmine_plugin <        >




 vendor/plugins/redmine_<                  >
15                    #ngrk02 2011/02/26
Redmine           >
✓




16        #ngrk02 2011/02/26
model, controller
     ✓ generator
      ✓   redmine_plugin_controller                            [        ]*
      ✓   redmine_plugin_model                         [   :       ]*




17                                    #ngrk02 2011/02/26
Redmine    Model
Railroad           (        )




18                     #ngrk02 2011/02/26
Model

                                                             Project


                         Issue
     User

            IssuePriority

            IssueCategory
                                           TimeEntry
               Version
                                        IssueRelation




                JournalDetail

                Journal                          Changeset




19                               #ngrk02 2011/02/26
20   #ngrk02 2011/02/26
✓
     ✓
     ✓
     ✓ Wiki
     ✓ View Hook
     ✓ alias_method_chain


21                      #ngrk02 2011/02/26
22   #ngrk02 2011/02/26
vendor/plugins/redmine_test/init.rb




23                             #ngrk02 2011/02/26
vendor/plugins/redmine_test/init.rb




24                             #ngrk02 2011/02/26
vendor/plugins/redmine_test/init.rb             false




25                              #ngrk02 2011/02/26
26   #ngrk02 2011/02/26
Wiki
         vendor/plugins/redmine_test/init.rb

     ✓   vendor/plugins/redmine_test/lib/
         wiki_extensions_geso_macro.rb




27       #ngrk02 2011/02/26
view hook
     ✓ Redmine                 hook
              HTML
     ✓ Hook          Listener
     ✓




28                    #ngrk02 2011/02/26
view hook
     vendor/plugins/redmine_test/init.rb

     vendor/plugins/redmine_test/lib/project_ikamusume_listener.rb




                                              Model, Controller
                                           Hook
29                              #ngrk02 2011/02/26
✓ Hook
     ✓ alias_method_chain
     ✓
     ✓




30                      #ngrk02 2011/02/26
31   #ngrk02 2011/02/26
vendor/plugins/redmine_test/init.rb




     vendor/plugins/redmine_test/lib/add_geso_to_date_patch.rb




32                              #ngrk02 2011/02/26
✓       Redmine


     ✓   2




33              #ngrk02 2011/02/26
34   #ngrk02 2011/02/26

Contenu connexe

Similaire à 侵略Redmine 〜Redmineプラグイン開発入門 〜 #ngrk02

Merb The Super Bike Of Frameworks
Merb The Super Bike Of FrameworksMerb The Super Bike Of Frameworks
Merb The Super Bike Of FrameworksRowan Hick
 
Comparing JVM Web Frameworks - 33rd Degree
Comparing JVM Web Frameworks - 33rd DegreeComparing JVM Web Frameworks - 33rd Degree
Comparing JVM Web Frameworks - 33rd DegreeMatt Raible
 
Ruby on rails探索
Ruby on rails探索Ruby on rails探索
Ruby on rails探索Mu Chun Wang
 
React and Web Performance
React and Web PerformanceReact and Web Performance
React and Web PerformanceLars Roettig
 
Making your first contribution to Foreman
Making your first contribution to ForemanMaking your first contribution to Foreman
Making your first contribution to ForemanDominic Cleal
 
Serverless Preview Environments @ Boston DevOps
Serverless Preview Environments @ Boston DevOpsServerless Preview Environments @ Boston DevOps
Serverless Preview Environments @ Boston DevOpsJoseph Lust
 
React and Web Performance
React and Web Performance React and Web Performance
React and Web Performance LarsRttig1
 
Стероиды для Дотнетчика
Стероиды для ДотнетчикаСтероиды для Дотнетчика
Стероиды для ДотнетчикаEatDog
 
Lightening a component based Rails architecture
Lightening a component based Rails architectureLightening a component based Rails architecture
Lightening a component based Rails architectureEnrico Teotti
 
Serverless code components azure
Serverless code components azureServerless code components azure
Serverless code components azureShimon Tolts
 
Apache Flink Worst Practices
Apache Flink Worst PracticesApache Flink Worst Practices
Apache Flink Worst PracticesKonstantin Knauf
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJSJumping Bean
 
Comparing JVM Web Frameworks - TSSJS 2011
Comparing JVM Web Frameworks - TSSJS 2011Comparing JVM Web Frameworks - TSSJS 2011
Comparing JVM Web Frameworks - TSSJS 2011Matt Raible
 
Сергей Калинец "Стероиды для Дотнетчика"
Сергей Калинец "Стероиды для Дотнетчика"Сергей Калинец "Стероиды для Дотнетчика"
Сергей Калинец "Стероиды для Дотнетчика"Fwdays
 
Docker 導入:障礙與對策
Docker 導入:障礙與對策Docker 導入:障礙與對策
Docker 導入:障礙與對策William Yeh
 
UKLUG - Open The Toolbox - Tools for the Domino Developer
UKLUG - Open The Toolbox - Tools for the Domino DeveloperUKLUG - Open The Toolbox - Tools for the Domino Developer
UKLUG - Open The Toolbox - Tools for the Domino DeveloperKathy Brown
 

Similaire à 侵略Redmine 〜Redmineプラグイン開発入門 〜 #ngrk02 (20)

Merb The Super Bike Of Frameworks
Merb The Super Bike Of FrameworksMerb The Super Bike Of Frameworks
Merb The Super Bike Of Frameworks
 
Comparing JVM Web Frameworks - 33rd Degree
Comparing JVM Web Frameworks - 33rd DegreeComparing JVM Web Frameworks - 33rd Degree
Comparing JVM Web Frameworks - 33rd Degree
 
Ruby on rails探索
Ruby on rails探索Ruby on rails探索
Ruby on rails探索
 
React and Web Performance
React and Web PerformanceReact and Web Performance
React and Web Performance
 
Making your first contribution to Foreman
Making your first contribution to ForemanMaking your first contribution to Foreman
Making your first contribution to Foreman
 
Serverless Preview Environments @ Boston DevOps
Serverless Preview Environments @ Boston DevOpsServerless Preview Environments @ Boston DevOps
Serverless Preview Environments @ Boston DevOps
 
React and Web Performance
React and Web Performance React and Web Performance
React and Web Performance
 
Стероиды для Дотнетчика
Стероиды для ДотнетчикаСтероиды для Дотнетчика
Стероиды для Дотнетчика
 
Lightening a component based Rails architecture
Lightening a component based Rails architectureLightening a component based Rails architecture
Lightening a component based Rails architecture
 
Serverless code components azure
Serverless code components azureServerless code components azure
Serverless code components azure
 
Apache Flink Worst Practices
Apache Flink Worst PracticesApache Flink Worst Practices
Apache Flink Worst Practices
 
Om & React.js
Om & React.jsOm & React.js
Om & React.js
 
CI adventures in .NET
CI adventures in .NETCI adventures in .NET
CI adventures in .NET
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJS
 
Comparing JVM Web Frameworks - TSSJS 2011
Comparing JVM Web Frameworks - TSSJS 2011Comparing JVM Web Frameworks - TSSJS 2011
Comparing JVM Web Frameworks - TSSJS 2011
 
Сергей Калинец "Стероиды для Дотнетчика"
Сергей Калинец "Стероиды для Дотнетчика"Сергей Калинец "Стероиды для Дотнетчика"
Сергей Калинец "Стероиды для Дотнетчика"
 
RailsVsDjango
RailsVsDjangoRailsVsDjango
RailsVsDjango
 
X Means Y
X Means YX Means Y
X Means Y
 
Docker 導入:障礙與對策
Docker 導入:障礙與對策Docker 導入:障礙與對策
Docker 導入:障礙與對策
 
UKLUG - Open The Toolbox - Tools for the Domino Developer
UKLUG - Open The Toolbox - Tools for the Domino DeveloperUKLUG - Open The Toolbox - Tools for the Domino Developer
UKLUG - Open The Toolbox - Tools for the Domino Developer
 

Dernier

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesBoston Institute of Analytics
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 

Dernier (20)

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 

侵略Redmine 〜Redmineプラグイン開発入門 〜 #ngrk02

  • 1. Redmine Redmine (@suer)
  • 2. @suer ✓ ✓ ✓ Ruby Java C# 2 #ngrk02 2011/02/26
  • 3. ✓ Rails3 + WebSocket + Webkit Notification + Groonga ✓ TiDD + Skype + Git ✓ Redmine issue ! ✓ Reject (14:50-15:10 @mallowlabs 3 #ngrk02 2011/02/26
  • 4. Redmine 4 #ngrk02 2011/02/26
  • 5. Redmine ✓ ✓ Web ✓ (1.1.0 ) ✓ etc... 5 #ngrk02 2011/02/26
  • 6. Redmine ✓ ✓ ✓ UI ✓ 6 #ngrk02 2011/02/26
  • 7. Rails ✓ 7 #ngrk02 2011/02/26
  • 8. Redmine 2010/07/18 1.0.0 2011/01/09 1.1.0 2011/04/30 1.2.0 ( ) 8 #ngrk02 2011/02/26
  • 9. Conflict ... NG 9 #ngrk02 2011/02/26
  • 10. Plugin ✓ Code Review Plugin ✓ Backlogs Plugin ✓ Hudson Plugin ✓ CSV Importer ✓ Issue Extensions ✓ Wiki Extensions ✓ etc.. (http://www.r-labs.org/projects/r-labs/wiki/Redmine ) 10 #ngrk02 2011/02/26
  • 11. Redmine Plugin( ) ✓ ✓ iPhoneUI (folk project) ✓ ✓ CSV ✓ MS Project https://github.com/suer 11 #ngrk02 2011/02/26
  • 12. 12 #ngrk02 2011/02/26
  • 13. Plugin ✓ Ruby/Rails ✓ Rails Engines ✓ Redmine (User, Role, Issue, Journal, etc.) ✓ ( ) 13 #ngrk02 2011/02/26
  • 14. Rails Engines ✓ Rails ✓ ✓ migration → ✓ Routes → URL ✓ Rails3 (Redmine 2 ) 14 #ngrk02 2011/02/26
  • 15. Plugin $ ruby script/generate redmine_plugin < > vendor/plugins/redmine_< > 15 #ngrk02 2011/02/26
  • 16. Redmine > ✓ 16 #ngrk02 2011/02/26
  • 17. model, controller ✓ generator ✓ redmine_plugin_controller [ ]* ✓ redmine_plugin_model [ : ]* 17 #ngrk02 2011/02/26
  • 18. Redmine Model Railroad ( ) 18 #ngrk02 2011/02/26
  • 19. Model Project Issue User IssuePriority IssueCategory TimeEntry Version IssueRelation JournalDetail Journal Changeset 19 #ngrk02 2011/02/26
  • 20. 20 #ngrk02 2011/02/26
  • 21. ✓ ✓ ✓ Wiki ✓ View Hook ✓ alias_method_chain 21 #ngrk02 2011/02/26
  • 22. 22 #ngrk02 2011/02/26
  • 25. vendor/plugins/redmine_test/init.rb false 25 #ngrk02 2011/02/26
  • 26. 26 #ngrk02 2011/02/26
  • 27. Wiki vendor/plugins/redmine_test/init.rb ✓ vendor/plugins/redmine_test/lib/ wiki_extensions_geso_macro.rb 27 #ngrk02 2011/02/26
  • 28. view hook ✓ Redmine hook HTML ✓ Hook Listener ✓ 28 #ngrk02 2011/02/26
  • 29. view hook vendor/plugins/redmine_test/init.rb vendor/plugins/redmine_test/lib/project_ikamusume_listener.rb Model, Controller Hook 29 #ngrk02 2011/02/26
  • 30. ✓ Hook ✓ alias_method_chain ✓ ✓ 30 #ngrk02 2011/02/26
  • 31. 31 #ngrk02 2011/02/26
  • 32. vendor/plugins/redmine_test/init.rb vendor/plugins/redmine_test/lib/add_geso_to_date_patch.rb 32 #ngrk02 2011/02/26
  • 33. Redmine ✓ 2 33 #ngrk02 2011/02/26
  • 34. 34 #ngrk02 2011/02/26

Notes de l'éditeur

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n