abapGit/src/zabapgit_page.prog.abap
2016-11-26 19:54:57 +02:00

688 lines
27 KiB
ABAP

*&---------------------------------------------------------------------*
*& Include ZABAPGIT_PAGE
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* INTERFACE lif_gui_page DEFINITION
*----------------------------------------------------------------------*
INTERFACE lif_gui_page.
METHODS on_event
IMPORTING iv_action TYPE clike
iv_prev_page TYPE clike
iv_getdata TYPE clike OPTIONAL
it_postdata TYPE cnht_post_data_tab OPTIONAL
EXPORTING ei_page TYPE REF TO lif_gui_page
ev_state TYPE i
RAISING lcx_exception lcx_cancel.
METHODS render
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception.
METHODS get_assets
RETURNING VALUE(rt_assets) TYPE tt_web_assets.
ENDINTERFACE.
CLASS lcl_gui_page_super DEFINITION ABSTRACT.
PUBLIC SECTION.
INTERFACES lif_gui_page ABSTRACT METHODS render.
CLASS-METHODS render_error
IMPORTING ix_error TYPE REF TO lcx_exception
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
PROTECTED SECTION.
METHODS render_repo_top
IMPORTING io_repo TYPE REF TO lcl_repo
iv_show_package TYPE abap_bool DEFAULT abap_true
iv_show_branch TYPE abap_bool DEFAULT abap_true
iv_interactive_branch TYPE abap_bool DEFAULT abap_false
iv_branch TYPE string OPTIONAL
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception.
METHODS render_item_state
IMPORTING iv1 TYPE char1
iv2 TYPE char1
RETURNING VALUE(rv_html) TYPE string.
METHODS render_branch_span
IMPORTING iv_branch TYPE string
io_repo TYPE REF TO lcl_repo_online
iv_interactive TYPE abap_bool
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper
RAISING lcx_exception.
METHODS header
IMPORTING io_include_style TYPE REF TO lcl_html_helper OPTIONAL
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS footer
IMPORTING io_include_script TYPE REF TO lcl_html_helper OPTIONAL
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS title
IMPORTING iv_title TYPE string
io_menu TYPE REF TO lcl_html_toolbar OPTIONAL
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
METHODS redirect
IMPORTING iv_url TYPE string
RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
PRIVATE SECTION.
METHODS styles RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper.
ENDCLASS.
CLASS lcl_gui_page_super IMPLEMENTATION.
METHOD render_repo_top.
DATA: lo_repo_online TYPE REF TO lcl_repo_online,
lo_pback TYPE REF TO lcl_persistence_background,
lv_icon TYPE string.
CREATE OBJECT ro_html.
CREATE OBJECT lo_pback.
IF io_repo->is_offline( ) = abap_true.
lv_icon = 'img/repo_offline' ##NO_TEXT.
ELSE.
lv_icon = 'img/repo_online' ##NO_TEXT.
ENDIF.
ro_html->add( |<a id="repo{ io_repo->get_key( ) }"></a>| ).
ro_html->add( '<table width="100%"><tr>' ).
ro_html->add( '<td class="repo_name">' ).
ro_html->add( |<img src="{ lv_icon }">| ).
ro_html->add( |<span class="name">{ io_repo->get_name( ) }</span>| ).
IF io_repo->is_offline( ) = abap_false.
lo_repo_online ?= io_repo.
ro_html->add( |<span class="url">{ lo_repo_online->get_url( ) }</span>| ).
ENDIF.
ro_html->add( '</td>' ).
ro_html->add( '<td class="repo_attr right">' ).
IF abap_true = lcl_app=>user( )->is_favorite_repo( io_repo->get_key( ) ).
lv_icon = 'img/star' ##NO_TEXT.
ELSE.
lv_icon = 'img/star-grey' ##NO_TEXT.
ENDIF.
lv_icon = |<img class="pad-sides" src="{ lv_icon }" title="Click to toggle favorite">|.
ro_html->add_anchor( iv_act = |{ gc_action-repo_toggle_fav }?{ io_repo->get_key( ) }|
iv_txt = lv_icon ).
IF lo_pback->exists( io_repo->get_key( ) ) = abap_true.
ro_html->add( '<span class="bg_marker" title="background">BG</span>' ).
ENDIF.
IF io_repo->is_write_protected( ) = abap_true.
ro_html->add( '<img src="img/lock" title="locked">' ).
ENDIF.
IF io_repo->is_offline( ) = abap_false.
lo_repo_online ?= io_repo.
IF iv_show_branch = abap_true.
IF iv_branch IS INITIAL.
ro_html->add( render_branch_span( iv_branch = lo_repo_online->get_branch_name( )
io_repo = lo_repo_online
iv_interactive = iv_interactive_branch ) ).
ELSE.
ro_html->add( render_branch_span( iv_branch = iv_branch
io_repo = lo_repo_online
iv_interactive = iv_interactive_branch ) ).
ENDIF.
ENDIF.
ENDIF.
IF iv_show_package = abap_true.
ro_html->add( '<img src="img/pkg">' ).
ro_html->add( |<span>{ io_repo->get_package( ) }</span>| ).
ENDIF.
ro_html->add( '</td>' ).
ro_html->add( '</tr></table>' ).
ENDMETHOD.
METHOD render_item_state.
DATA: lv_system TYPE string.
FIELD-SYMBOLS <state> TYPE char1.
rv_html = '<span class="state-block">'.
DO 2 TIMES.
CASE sy-index.
WHEN 1.
ASSIGN iv1 TO <state>.
lv_system = 'Local:'.
WHEN 2.
ASSIGN iv2 TO <state>.
lv_system = 'Remote:'.
ENDCASE.
CASE <state>.
WHEN gc_state-unchanged. "None or unchanged
IF iv1 = gc_state-added OR iv2 = gc_state-added.
rv_html = rv_html && |<span class="none" title="{ lv_system } Not exists">X</span>|.
ELSE.
rv_html = rv_html && |<span class="none" title="{ lv_system } No changes">&nbsp;</span>|.
ENDIF.
WHEN gc_state-modified. "Changed
rv_html = rv_html && |<span class="changed" title="{ lv_system } Modified">M</span>|.
WHEN gc_state-added. "Added new
rv_html = rv_html && |<span class="added" title="{ lv_system } Added new">A</span>|.
WHEN gc_state-mixed. "Multiple changes (multifile)
rv_html = rv_html && |<span class="mixed" title="{ lv_system } Multiple changes">&#x25A0;</span>|.
WHEN gc_state-deleted. "Deleted
rv_html = rv_html && |<span class="deleted" title="{ lv_system } Deleted">D</span>|.
ENDCASE.
ENDDO.
rv_html = rv_html && '</span>'.
ENDMETHOD. "render_item_state
METHOD render_branch_span.
DATA: lv_text TYPE string,
lv_class TYPE string.
lv_text = lcl_git_branch_list=>get_display_name( iv_branch ).
IF iv_branch = io_repo->get_head_branch_name( ) OR iv_branch = lcl_git_branch_list=>head_name.
lv_class = 'branch branch_head'.
ELSEIF lcl_git_branch_list=>get_type( iv_branch ) = lcl_git_branch_list=>c_type-branch.
lv_class = 'branch branch_branch'.
ELSE.
lv_class = 'branch'.
ENDIF.
CREATE OBJECT ro_html.
ro_html->add( |<span class="{ lv_class }">| ).
ro_html->add( '<img src="img/branch">' ).
IF iv_interactive = abap_true.
ro_html->add_anchor( iv_act = |{ gc_action-git_branch_switch }?{ io_repo->get_key( ) }|
iv_txt = lv_text ).
ELSE.
ro_html->add( lv_text ).
ENDIF.
ro_html->add( '</span>' ).
ENDMETHOD. "render_branch_span
METHOD header.
CREATE OBJECT ro_html.
ro_html->add( '<!DOCTYPE html>' ). "#EC NOTEXT
ro_html->add( '<html>' ). "#EC NOTEXT
ro_html->add( '<head>' ). "#EC NOTEXT
ro_html->add( '<title>abapGit</title>' ). "#EC NOTEXT
ro_html->add( '<link rel="stylesheet" type="text/css" href="css/common.css">' ).
* ro_html->add( styles( ) ).
* IF io_include_style IS BOUND.
* ro_html->add( '<style type="text/css">' ). "#EC NOTEXT
* ro_html->add( io_include_style ).
* ro_html->add( '</style>' ). "#EC NOTEXT
* ENDIF.
ro_html->add( '<meta http-equiv="content-type" content="text/html; charset=utf-8">' ). "#EC NOTEXT
ro_html->add( '</head>' ). "#EC NOTEXT
ro_html->add( '<body>' ). "#EC NOTEXT
ENDMETHOD. "render html header
METHOD title.
CREATE OBJECT ro_html.
ro_html->add( '<div id="header">' ). "#EC NOTEXT
ro_html->add( '<table width="100%"><tr>' ). "#EC NOTEXT
ro_html->add( '<td class="logo">' ). "#EC NOTEXT
ro_html->add( |<a href="sapevent:{ gc_action-abapgit_home }">| ). "#EC NOTEXT
ro_html->add( '<img src="img/logo">' ). "#EC NOTEXT
ro_html->add( '</a>' ). "#EC NOTEXT
ro_html->add( '</td>' ). "#EC NOTEXT
ro_html->add( '<td class="headpad"><span class="page_title">' ). "#EC NOTEXT
ro_html->add( |&#x25BA; { iv_title }| ). "#EC NOTEXT
ro_html->add( '</span></td>' ). "#EC NOTEXT
IF io_menu IS BOUND.
ro_html->add( '<td class="headpad right">' ). "#EC NOTEXT
ro_html->add( io_menu->render( ) ).
ro_html->add( '</td>' ). "#EC NOTEXT
ENDIF.
ro_html->add( '</tr></table>' ). "#EC NOTEXT
ro_html->add( '</div>' ). "#EC NOTEXT
ENDMETHOD. "render page title
METHOD footer.
CREATE OBJECT ro_html.
ro_html->add( '<div id="footer">' ). "#EC NOTEXT
ro_html->add( '<img src="img/logo" >' ). "#EC NOTEXT
ro_html->add( '<table width="100%"><tr><td width="40%"></td><td>' ). "#EC NOTEXT
ro_html->add( |<span class="version">{ gc_abap_version }</span>| ). "#EC NOTEXT
ro_html->add( '</td><td id="stdout" width="40%"></td></tr></table>' ). "#EC NOTEXT
ro_html->add( '</div>' ). "#EC NOTEXT
ro_html->add( '</body>' ). "#EC NOTEXT
" Common JS routines
_add '<script type="text/javascript">' . "#EC NOTEXT
_add 'function debugOutput(text, dstID) {'. "#EC NOTEXT
_add ' var stdout = document.getElementById(dstID || "stdout");'. "#EC NOTEXT
_add ' var wrapped = "<p>" + text + "</p>";'. "#EC NOTEXT
_add ' stdout.innerHTML = stdout.innerHTML + wrapped;'. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add 'function submitForm(params, action) {'. "#EC NOTEXT
_add ' var form = document.createElement("form"); '. "#EC NOTEXT
_add ' form.setAttribute("method", "post"); '. "#EC NOTEXT
_add ' form.setAttribute("action", "sapevent:" + action); '. "#EC NOTEXT
_add ' for(var key in params) {'. "#EC NOTEXT
_add ' var hiddenField = document.createElement("input"); '. "#EC NOTEXT
_add ' hiddenField.setAttribute("type", "hidden"); '. "#EC NOTEXT
_add ' hiddenField.setAttribute("name", key); '. "#EC NOTEXT
_add ' hiddenField.setAttribute("value", params[key]); '. "#EC NOTEXT
_add ' form.appendChild(hiddenField); '. "#EC NOTEXT
_add ' }'. "#EC NOTEXT
_add ' document.body.appendChild(form); '. "#EC NOTEXT
_add ' form.submit(); '. "#EC NOTEXT
_add '}'. "#EC NOTEXT
_add '</script>'. "#EC NOTEXT
IF io_include_script IS BOUND.
ro_html->add( '<script type="text/javascript">' ).
ro_html->add( io_include_script ).
ro_html->add( '</script>' ).
ENDIF.
ro_html->add( '</html>'). "#EC NOTEXT
ENDMETHOD. "render html footer & logo
METHOD render_error.
CREATE OBJECT ro_html.
ro_html->add( '<div class="dummydiv attention">' ).
ro_html->add( |Error: { ix_error->mv_text }| ).
ro_html->add( '</div>' ).
ENDMETHOD. "render_error
METHOD redirect.
CREATE OBJECT ro_html.
ro_html->add( '<!DOCTYPE html>' ). "#EC NOTEXT
ro_html->add( '<html><head>' ). "#EC NOTEXT
ro_html->add( |<meta http-equiv="refresh" content="0; url={ iv_url }">| ). "#EC NOTEXT
ro_html->add( '</head></html>'). "#EC NOTEXT
ENDMETHOD.
METHOD styles.
CREATE OBJECT ro_html.
_add '<style type="text/css">'.
" Global styles
_add '/* GLOBALS */'.
_add 'body {'.
_add ' font-family: Arial,Helvetica,sans-serif;'.
_add ' font-size: 12pt;'.
_add ' background: #E8E8E8;'.
_add '}'.
_add 'a, a:visited {'.
_add ' color: #4078c0;'.
_add ' text-decoration: none;'.
_add '}'.
_add 'a:hover, a:active {'.
_add ' cursor: pointer;'.
_add ' text-decoration: underline;'.
_add '}'.
_add 'img { border: 0px; vertical-align: middle; }'.
_add 'table { border-collapse: collapse; }'.
_add 'pre { display: inline; }'.
_add 'form input, textarea, select {'.
_add ' border: 1px solid #DDD;'.
_add ' padding: 3px 6px;'.
_add '}'.
_add 'form input:focus, textarea:focus {'.
_add ' border: 1px solid #8cadd9;'.
_add '}'.
" Modifiers
_add '/* MODIFIERS */'.
_add '.grey { color: lightgrey !important; }'.
_add '.emphasis { font-weight: bold !important; }'.
_add '.attention { color: red !important; }'.
_add '.crossout { text-decoration: line-through !important; }'.
_add '.right { text-align:right; }'.
_add '.paddings { padding: 0.5em 0.5em; }'.
_add '.pad-sides { padding: 0 0.3em; }'.
_add '.pad4px { padding: 4px; }'.
" Structure div styles: header, footer, toc
_add '/* STRUCTURE DIVS, HEADER & FOOTER */'.
_add 'td.headpad { padding-top: 11px; }'.
_add 'td.logo { width: 164px; }'.
_add 'div#header {'.
_add ' padding: 0.5em 0.5em;'.
_add ' border-bottom: 3px double lightgrey;'.
_add '}'.
_add 'div#toc {'.
_add ' padding: 0.5em 1em;'.
_add ' background-color: #f2f2f2;'.
_add '}'.
_add 'div#toc div.toc_grid {'.
_add ' margin: -0.3em 0em;'.
_add '}'.
_add 'div#toc div.toc_grid a {'.
_add ' color: #ccc;'.
_add '}'.
_add 'div#toc:hover div.toc_grid a {'.
_add ' color: #4078c0;'.
_add '}'.
_add 'div#toc div.toc_row {'.
_add ' margin: 0.3em 0em;'.
_add '}'.
_add 'div#footer {'.
_add ' padding: 0.5em 1em;'.
_add ' border-top: 3px double lightgrey;'.
_add ' text-align: center;'.
_add '}'.
_add 'div.dummydiv {'.
_add ' background-color: #f2f2f2;'.
_add ' padding: 0.5em 1em;'.
_add ' text-align: center;'.
_add '}'.
_add 'span.version {'.
_add ' display: block;'.
_add ' color: grey;'.
_add ' margin-top: 0.3em;'.
_add '}'.
_add 'span.page_title {'.
_add ' font-weight: normal;'.
_add ' font-size: 18pt;'.
_add ' color: #bbb;'.
_add ' padding-left: 0.4em;'.
_add '}'.
" Menu styles
_add '/* MENU */'.
_add 'div.menu { display: inline; }'.
_add 'div.menu .menu_end { border-right: 0px !important; }'.
_add 'div.menu a {'.
_add ' padding-left: 0.5em;'.
_add ' padding-right: 0.5em;'.
_add ' border-right: 1px solid lightgrey;'.
_add ' font-size: 12pt;'.
_add '}'.
_add 'div.menu_vertical { display: inline; }'.
_add 'div.menu_vertical a {'.
_add ' display: block; '.
_add ' font-size: 12pt;'.
_add '}'.
" Dropdown styles :mechanics
_add '/*DROP DOWN*/'.
_add '.dropdown {'.
_add ' position: relative;'.
_add ' display: inline;'.
_add '}'.
_add '.dropdown_angle {'.
_add ' position: absolute !important;'.
_add ' right: -4px;'.
_add ' top: -1px;'.
_add '}'.
_add '.dropbtn_angle {'.
_add ' width: 0;'.
_add ' height: 0;'.
_add ' border-left: 7px solid transparent;'.
_add ' border-right: 7px solid transparent;'.
_add ' border-bottom: 7px solid #4078c0;'.
_add ' transform: rotate(45deg);'.
_add ' -ms-transform: rotate(45deg);'.
_add '}'.
_add '.dropdown_content {'.
_add ' display: none;'.
_add ' z-index: 1;'.
_add ' position: absolute;'.
_add ' right: -12px;'.
_add ' top: 1em;'.
_add ' padding: 6px 10px 10px 10px;'.
_add ' white-space: nowrap;'.
_add '}'.
_add '.dropdown div.minizone {'.
_add ' display: none;'.
_add ' z-index: 1;'.
_add ' position: absolute;'.
_add ' padding: 0px;'.
_add ' width: 16px;'.
_add ' height: 16px;'.
_add ' bottom: 0px;'.
_add ' left: -16px;'.
_add '}'.
_add '.dropdown_angle .dropdown_content {'.
_add ' top: -1px;'.
_add '}'.
_add '.dropdown:hover .dropdown_content { display: block; }'.
_add '.dropdown:hover .minizone { display: block; }'.
" Dropdown styles :styling
_add '.dropdown_content a {'.
_add ' padding: 0.2em;'.
_add ' background-color: #f9f9f9;'.
_add ' text-decoration: none;'.
_add ' display: block;'.
_add ' border: none !important;'.
_add '}'.
_add '.dropdown_content div.box {'.
_add ' border-bottom: 1px solid #C0C0C0;'.
_add ' border-right: 1px solid #C0C0C0;'.
_add ' background-color: #f9f9f9;'.
_add ' padding: 2px;'.
_add '}'.
_add '.dropdown_content td { text-align: left; padding: 2px; }'. " TODO refactor
_add '.dropdown_content td a { padding: 0em 0.2em; }'. " TODO refactor
_add '.dropdown_content td.icon { padding: 0 3px 0 6px; }'. " TODO refactor
_add '.dropdown_content a:hover { background-color: #f1f1f1 }'.
_add '.dropdown:hover .dropbtn { color: #79a0d2; }'.
" REPOSITORY
_add '/* REPOSITORY */'.
_add 'div.repo {'.
_add ' margin-top: 3px;'.
_add ' background-color: #f2f2f2;'.
_add ' padding: 0.5em 1em 0.5em 1em;'.
_add '}'.
_add '.repo_name span.name {'.
_add ' font-weight: bold;'.
_add ' color: #333;'.
_add ' font-size: 14pt;'.
_add '}'.
_add '.repo_name span.url {'.
_add ' color: #ccc;'.
_add ' font-size: 12pt;'.
_add ' margin-left: 0.5em;'.
_add '}'.
_add '.repo_name img {'.
_add ' vertical-align: baseline;'.
_add ' margin: 0 5px 0 5px;'.
_add '}'.
_add '.repo_attr {'.
_add ' color: grey;'.
_add ' font-size: 12pt;'.
_add '}'.
_add '.repo_attr span {'.
_add ' margin-left: 0.2em;'.
_add ' margin-right: 0.5em;'.
_add '}'.
_add '.repo_attr span.bg_marker {'.
_add ' border: 1px solid #d2d2d2;'.
_add ' border-radius: 3px;'.
_add ' background: #d8d8d8;'.
_add ' color: #fff;'.
_add ' font-size: 8pt;'.
_add ' padding: 4px 2px 3px 2px;'.
_add '}'.
" Branch tag design
_add '.repo_attr span.branch {'.
_add ' padding: 2px 4px;'.
_add ' border: 1px solid #d9d9d9;'.
_add ' border-radius: 4px;'.
_add ' background-color: #e2e2e2;'.
_add '}'.
_add '.repo_attr span.branch_head {'.
_add ' border-color: #d8dff3;'.
_add ' background-color: #eceff9;'.
_add '}'.
_add '.repo_attr span.branch_branch {'.
_add ' border-color: #e7d9b1;'.
_add ' background-color: #f8f0d8;'.
_add '}'.
" Other and outdated (?) styles
_add '/* MISC AND REFACTOR */'.
_add '.hidden-submit {'.
_add ' border: 0 none;'.
_add ' height: 0;'.
_add ' width: 0;'.
_add ' padding: 0;'.
_add ' margin: 0;'.
_add ' overflow: hidden;'.
_add '}'.
_add '#stdout {'.
_add ' text-align: right;'.
_add ' padding-right: 0.5em;'.
_add ' color: #ccc;'.
_add ' font-style: italic;'.
_add ' font-size: small;'.
_add '}'.
_add '</style>'.
ENDMETHOD. "common styles
METHOD lif_gui_page~get_assets. " Common images here
DATA ls_image TYPE ty_web_asset.
* see https://github.com/larshp/abapGit/issues/201 for source SVG
ls_image-url = 'img/logo' ##NO_TEXT.
ls_image-content =
'iVBORw0KGgoAAAANSUhEUgAAAKMAAAAoCAYAAACSG0qbAAAABHNCSVQICAgIfAhkiAAA'
&& 'AAlwSFlzAAAEJQAABCUBprHeCQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9y'
&& 'Z5vuPBoAAA8VSURBVHic7Zx7cJzVeYef31nJAtvYko1JjM3FYHlXimwZkLWyLEMcwIGQ'
&& 'cEkDJWmTltLStGkoDCkzwBAuCemUlksDNCkhJTTTljJpZhIuBQxxAWPvyuYiW7UkG8Il'
&& 'UByIsS1sLEu75+0fu5JXu9/etAJz0TOzM/rOec85765+37m+3yczY8w0NU3qrwv9npfa'
&& 'Hfx02pPPd469sgk+7misYnyjpWXy5IOG7kd8ZjjNjEtr13TdOm7eTfCxwo2lUJAQASRu'
&& '2dnRfMn4uDbBx42yxZhPiMNMCHKCsVK2GGuqqqoQUwrZTAhygrFQshjfaGmZ/M7yxQtm'
&& 'xGL9/qDqzwLxQvYTgpygXEoS4/DQ7LE1O05atLBu1YZdE4KcYLwpupoOmCO+5Z2dXPfE'
&& 'xk07Tm2ZroGhBwX1wAygKqiOiVX2Rw9Jam/gyH0wuGGzvTEudRYSY4HFyogghxN2n7Sw'
&& 'IendvcCioLoOtCCXNeqohOf0oDwPq9f3Wt/77dOHlWhYzUj/BRybTnrGEnZO5wv2m0rq'
&& 'DezJoOiqeZbzegzpk6TVPPWJTT39y5svMogF1ZcesjlQgkwYp4F+EJQXwv4E+MiLUZJa'
&& 'F7AIcRq4hWZ2mMRhQD/oZcErXv7FScaja3rt/wpU9E/sFyLACQq57wB/XIl/gWIstn2T'
&& 'xpHVre7ZW71p8sFDeQscSEHKu3pTBadNH2Lq61VT57iwNazLgaNSqYaUaWXLDZCJIbBo'
&& 'g3tK2A2xHns0oMrm3CRrqdTPnAVMiUIEmLlz2XGLMxNmH7YrifFcoUIHalHj8f8p6UfA'
&& 'O+932weStno1zghps6Q7GBFiUYRxopkeaZ2vIwLyfxtQ4vV8lbWHNScacf+T/vwqn90o'
&& 'MZYhRADJ+bv725vmj6Q8tHWffPKUD6IgO/tsfawneRHYd97Pdg8kSyJaZiGtBY4pYPYO'
&& 'kH84C0Cyv8tKSiK7OZ99EpYAJ2V8AhkRY5lCHGaxhaq+BLCzY/EXd5y0aOG0td1vf1AF'
&& 'CWCw7/1u80DQEtahQvcB03MyjQfM7Hwnmxfv9dPivX5SssqOwuzPSqk71mN3ymw5ZtdK'
&& 'dmVIdly8xx7JZ29yy0qptwrGLMRRCA6T1w93nLTo5Lq13Zv625tOMRd6DLF4v0lWmQO8'
&& 'qPko45y7TWaHZyUnwa6M99mN2fYbuu1V4K5oxF1B4Z4UgFifrQHWFLNbvkh1QheV5DNN'
&& 'TZMqFWIGs5zX48M95PTqGa3TZ4erzbvj8/WUErf0L2++uNyGJLn2Js1oDeuYlkbNbmlR'
&& 'deXup2hq0qS2es2VlHMDFaOlRdXL5uuwlnodG23QTEljCkbJV3d7WHOK+dXWqHqZnZeb'
&& 'Y1fGe3OFOArRU5GTGbSHNWdwUL8Epo1qIQ9V/bXu3HES4jCznNfjb7e1zZ8Ri/UD1MLz'
&& 'u05s/huMx4IKGNy4+8Tj/2Pqk8++Vaji86TQqxEuNNM5rWGtSCaokSDkgd0QjbidoPvN'
&& '+5s7t9jz5TgdbdBMvLsG2cop6FgLUdUaZk804jYKuyrWa6vzlT2+XrOqQnxd6KwQOj5R'
&& 'hULpL9Yaxkcj7g3QT6zK397ZbdtGtbtAZ+B0U3adkt0c67E7OyI6fFDuSpktC6HGpJjU'
&& 'GmZ3NOI2mdnVnX32eHZZ7903hGXfBG8mp3J7sd/B0DPCTgUmBf9O7lmMybk56or3Jn8f'
&& 'oLVB7Q5dZ9Iy4OBsw2jYbUUk96fwQrzHf955iBZzsDA+aL9k1owZ20fNzaY/tfFXwK48'
&& 'ldQkSZ5YqJXmZk15JaJfmOmfgdOAmgCzWrCvyum5aIO+Uor3AIbOx7QV2TeBMPu3vKYA'
&& 'Sw091hbWt4PKRhu0oDqkmND1wAnk3vkOmAN2lRLa2hrWMVm5Tek2R3286YzWiK4eQltk'
&& '9g1gMfsFMhVYKunR1obQddk+SXZqwLe8acMGe7fYb9HZk7wm3utrBmpsqiXsyClHMHK6'
&& '0hLWoRjHBfmLbP9K3bPYjFPIFWLaQeZnlZ8H4JyFflrMwcK4wG63v3/ycZnXOzqalxE0'
&& 'mU7x9rvvVv93oVZqBtzNGGeU7Jbp9pZGzS7ReiVQVyDfmXRda4PaA9p5mBLmWGmmSron'
&& 'M0FytUGGgjPTAi8UIeVk9u1og5YOJ0QbNBOjIac+Y22JPgLQ1WV7Ol+w36xebYnhtGpj'
&& 'FjBYTj3l4KY9/dx6My4d74pN/Ki/Y9HpSG5HR/Nyh/1DHtO9OM6dvWFDwbtWslOykt6U'
&& 's5VWZbOFnQtsyMqvc56Ty3T7NeBhLGAfDZDpe5nX6V5uXpbZ43K2NGQ2V9glwLas/I62'
&& 'hfrE8EWsJ3mFsGYs+OQqze+A1cBLgbmma4f/9AmOJGBe5vKVLYN1W6wnOWSHmdkVhexM'
&& 'PG6yC0x2AbmjoQ3njdh4uwrSw1Htmq5bd3Y0I3FLpQ5n0GTSQ7s6Fva70RPYTPbi+Pz0'
&& 'J7ryboRC+m5PnRfsJjVEAfp5bLNflTb52dKIBj36RWY5ZyX2WCLukvbX67ZYHFLHZtGw'
&& '+1fD/jDL8qQljWpav9m6Uw3wKYzXgUNJTxsk+0Fssw0L6x+j4dCx6eF/BEtwDBkbx7Fe'
&& '29gWCa0yrC2rvXXO26WZfrWG3V2kji8zWbm0QUev67GX5ZgZ8A0H121hXIIZNrxou9oW'
&& '6m4b4m/z2aTP+fsAohF3PaNHROvssZ8ElRs5DnyPBAkovxDFF4oJESDeY9tJD4Ur5umg'
&& 'PSFm1Uy23Zk2SaM7e43p5Y4uxUMzu2f4H56+tuZmff2gfTqHrGEy5DkW6Abo7LH7gfsB'
&& '2uo1LQGzBmoYFSwg57vNcjqqo4F1JXh2S7Zfx83TZZNqdD6MXkQkU369jONgcmfxe83M'
&& 'B7XQEdEhg1B0HzDk2ZHpy3vBqLPpMQhyi/f2AIA3WyPZG6KkeVpKiE925awEi7H6JRsA'
&& 'cqJDfIi9oayfW8ZB5dY/TFeX7YlGQg+RmgJkcnSQfWyr9QP92enmGcgeNCvx67mXbGdb'
&& 'xD1hjI5AklJ+ydgTUGz6iiZNXd09+gYGGIRlQgXn6wDesZYSRFsJOYES5QjSw7fqnu7q'
&& 'Bqh7uqu7f3nzdw3uKFJszEIcpqVRs12SRuAYiTrJ1YXMzSGgS6iQnHmWyQWe70pySz/F'
&& 'MZagMWnMlaiTuTqTTih7s7IIHm1T1ncVI37l3BAAA4McAYF7iAvG17uxExi1U6Igd9XN'
&& 'Dj+UmZA8qPrf3MDQbeSPIN8Ldub0JzeWLcT2I3Swn8JFhr4VQnMze5uKnv0ugOHfUXa3'
&& 'ZhySedkR0eGDuMtbw/rTZCI1pA9PF0yWf4e3MnJ7YKXm0pOr6H03QRIIZeYnUj1njhid'
&& '8aaRscKX/VGWSRLsCjnK2rcdC3njGUsQ5PSdv92yqJaMk5WBoRMpJsSnNgZufBdCkmsN'
&& '60FgRbllK8PNzOlttT/qpz2sOUnpeWGHvq9ewcyc28/7XQCru213NOL+l6wgZ0kXAjnD'
&& 'cazP7gXuTdu41rCyxbgr3mt/P16+F6LgUVXtmq5bC237yNsNu5YtPBZgx4kLFznZ1XlM'
&& 'BzB/1liECBAN801yhfiq0HflbKXz1ojZ4qCylSBsbm6q/93wX0n0Q1Ir6UzWYXaZyZaF'
&& 'qqxeZn813n4ZlhPWJWXMo00P5OTDF5c0qmm8fRlPip6bFhHk6Ti3ddfy5i3OXBemJQE2'
&& 'A5g/c/qaTasC8krC0KdzE+3qWG/y6thmW7Vui/UkQ7w51vqDaGnRZFInPdlshNQ2C8oJ'
&& 'h0oqaefF++zmzh5bu7bbXrBxjp88bp5qgZzNdyfWD/9t+B+TO4GW8/p+R0SHcGBxLWEF'
&& 'jiQlHeIXEaRIPZAVRMVCTDcQCUh8LfOyaqjgCcr+YpY7NRFa2VY/egsqtNtdw8ie5gjJ'
&& 'oUTqicjofOYA2f/YgcR03s5MMBF4wlIa7rMr5mnUyru6xl0LZAeFvDG3l83DF5199muk'
&& 'oJO1FUMoviSi8Nh9Kg+Ru7qvUvCqPO+cMZsxbPsM4HXW9KcrEyKApTa7s9BVSyLaF3Ik'
&& 'SbLSQros18RyInkkV2u5q+6zLaS+aCT0oJl/QVI78IWcsvDos1vtLYCE551QKNuCKW63'
&& '+157g36cMOYI9yWhC3K+j4KDEHKxC9+t0altDaFHwL/kvVZIBJw761/uM5/MTJlU7S/Z'
&& 'N6hTBNlhZA0OPReNuGdM6nL4jR4G5ZnRusAtKmVHwg1Slcxe11nODZJKh1fJ6kwM3dQa'
&& 'VgOw3omjkGuL9/o/L/vFTzs7mi8pQZBpIT4f9PxE2bRFQncY9pdjKDoExDH7ebzPbgFo'
&& 'bQjdng48KBfvzZau77ORN61FI66PsW2N7ARiZnZTZ589BtAWCV1v5J1zF+JNVdui2CbL'
&& 'OcJsq1ejD2lVgCDL4e14r58J0N6k+cmEu0HYIssdrbxgnaGeeG9yJEg32hC6GbOix81y'
&& 'trTsWLtiixpgQNLZ4yVEgCT++xSP0H7C0N1ZadVAh6SR3kRm2WfJO0H/XqTuQcn+IlOI'
&& 'AFjRVaZhus3g2az0WuA0wcIi5QP3DDNIIPtakBABYltts7AO4OEi9eTFYGCksSRzwM4L'
&& 'ECKAM1gG9tVR5UP+RkqZN5s7a0yBnwUEOSDp7GlPPp83BH0srO+1PmQrDIIen9wOdnln'
&& 'n31G5n9ZtDLL6ck2x3uTf6DUee8rASX6vNnyWI/dmZ0R77O7LNXLBkWy9CE7Pd6XvNih'
&& 'QkEQeZHZl9PBFtsDstebtyWFwv0B4r32UrzXn+6xDtBdwIslNL0N+JnMvravxiraFO/s'
&& 'tm0y+xzQlcfkddCNCe/vGfP7GQH6lzdfbHAjqSCBHZK+PN5CzESSlixgnhMLzXAeXp+3'
&& 'hWfuM0sWL10abQv1CdtHixzvmtiYPhcvSFOTJk1NEPEQkWdPUry4oc96y2o3YJiWs5Wx'
&& 'zbYq83THHHu9Y1N2kG45tDRqdsgzxxuznKPOGbsTsN2M7d6zfXhePJ5Ici1h6mUcAcw0'
&& '8Zo5fp35NoqKxAjwTrRhZmLSpPY9ySmPzV27dm+lTn9cKSTGA+XT+03Jq+l8HBLv2Q7c'
&& 'X9K+ygQTFGDcHhaaoGJyouDNV7JH+eGj4mF6gspoC+tzJt1ObsT4MDsF2zxs886+Ml5v'
&& '/PogUvEwPUGFiE+SX4gAtQa1gkhV7onQR4oJMR5oxC6stDeghd7Dh6E+CPw/HL4vVO2f'
&& 'cpUAAAAASUVORK5CYII='.
APPEND ls_image TO rt_assets.
ENDMETHOD. "lif_gui_page~get_assets
METHOD lif_gui_page~on_event.
ev_state = gc_event_state-not_handled.
ENDMETHOD. "lif_gui_page~on_event
ENDCLASS.