diff --git a/404.html b/404.html index 61c96ac5b..0b8129136 100644 --- a/404.html +++ b/404.html @@ -31,10 +31,10 @@ } - +
Skip to main content

404

Page not found

How did we get here?

- + diff --git a/assets/404.html-812c7b8f.js b/assets/404.html-75521e3a.js similarity index 71% rename from assets/404.html-812c7b8f.js rename to assets/404.html-75521e3a.js index 60b686520..427b7de65 100644 --- a/assets/404.html-812c7b8f.js +++ b/assets/404.html-75521e3a.js @@ -1 +1 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-2405b29a.js";const o={};function r(_,n){return t(),c("div")}const f=e(o,[["render",r],["__file","404.html.vue"]]);export{f as default}; +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-5fb8f6f8.js";const o={};function r(_,n){return t(),c("div")}const f=e(o,[["render",r],["__file","404.html.vue"]]);export{f as default}; diff --git a/assets/SearchResult-234b78c7.js b/assets/SearchResult-f4c7e80d.js similarity index 98% rename from assets/SearchResult-234b78c7.js rename to assets/SearchResult-f4c7e80d.js index cd9d91ff6..8bde8150b 100644 --- a/assets/SearchResult-234b78c7.js +++ b/assets/SearchResult-f4c7e80d.js @@ -1 +1 @@ -import{u as I,f as ee,g as j,h as B,Z as ae,i as le,t as se,j as x,k as D,l as te,m as M,n as l,p as _,q as F,s as U,v as re,x as ue,y as ie,z as ne,R as oe,O as ce,A as ve,B as pe,C as he,D as ye,E as de,F as me,G as b,H as fe}from"./app-2405b29a.js";const ge="SEARCH_PRO_QUERY_HISTORY",y=I(ge,[]),He=()=>{const{queryHistoryCount:r}=b,n=r>0;return{enabled:n,queryHistory:y,addQueryHistory:t=>{n&&(y.value.length{y.value=[...y.value.slice(0,t),...y.value.slice(t+1)]}}},Re="SEARCH_PRO_RESULT_HISTORY",{resultHistoryCount:E}=b,d=I(Re,[]),Qe=()=>{const r=j(),n=E>0,t=s=>r.resolve({name:s.key,..."anchor"in s?{hash:`#${s.anchor}`}:{}}).fullPath;return{enabled:n,resultHistory:d,addResultHistory:s=>{if(n){const u={link:t(s),display:s.display};"header"in s&&(u.header=s.header),d.value.length{d.value=[...d.value.slice(0,s),...d.value.slice(s+1)]}}},ke=r=>{const n=oe(),t=B(),{search:s,terminate:u}=ce(),f=x(!1),g=ve([]);return pe(()=>{const m=()=>{g.value=[],f.value=!1},w=fe(H=>{f.value=!0,H?s({type:"search",query:H,locale:t.value,options:n}).then(h=>{g.value=h,f.value=!1}).catch(h=>{console.error(h),m()}):m()},b.searchDelay);M([r,t],()=>w(r.value),{immediate:!0}),he(()=>{u()})}),{searching:f,results:g}};var we=ee({name:"SearchResult",props:{query:{type:String,required:!0},isFocusing:Boolean},emits:["close","updateQuery"],setup(r,{emit:n}){const t=j(),s=B(),u=ae(le),{enabled:f,addQueryHistory:g,queryHistory:m,removeQueryHistory:w}=He(),{enabled:H,resultHistory:h,addResultHistory:O,removeResultHistory:Y}=Qe(),P=f||H,S=se(r,"query"),{results:R,searching:z}=ke(S),o=x({isQuery:!0,index:0}),p=x(0),c=x(0),L=D(()=>P&&(m.value.length>0||h.value.length>0)),C=D(()=>R.value.length>0),q=D(()=>R.value[p.value]||null),T=e=>t.resolve({name:e.key,..."anchor"in e?{hash:`#${e.anchor}`}:{}}).fullPath,G=()=>{const{isQuery:e,index:a}=o.value;a===0?o.value={isQuery:!e,index:e?h.value.length-1:m.value.length-1}:o.value={isQuery:e,index:a-1}},V=()=>{const{isQuery:e,index:a}=o.value;a===(e?m.value.length-1:h.value.length-1)?o.value={isQuery:!e,index:0}:o.value={isQuery:e,index:a+1}},Z=()=>{p.value=p.value>0?p.value-1:R.value.length-1,c.value=q.value.contents.length-1},J=()=>{p.value=p.value{c.value{c.value>0?c.value=c.value-1:Z()},A=e=>e.map(a=>ye(a)?a:l(a[0],a[1])),W=e=>{if(e.type==="customField"){const a=de[e.index]||"$content",[i,k=""]=me(a)?a[s.value].split("$content"):a.split("$content");return e.display.map(v=>l("div",A([i,...v,k])))}return e.display.map(a=>l("div",A(a)))},Q=()=>{p.value=0,c.value=0,n("updateQuery",""),n("close")};return te("keydown",e=>{if(r.isFocusing){if(C.value){if(e.key==="ArrowUp")N();else if(e.key==="ArrowDown")K();else if(e.key==="Enter"){const a=q.value.contents[c.value],i=T(a);g(r.query),O(a),t.push(i),Q()}}else if(H){if(e.key==="ArrowUp")G();else if(e.key==="ArrowDown")V();else if(e.key==="Enter"){const{index:a}=o.value;o.value.isQuery?(n("updateQuery",m.value[a]),e.preventDefault()):(t.push(h.value[a].link),Q())}}}}),M([p,c],()=>{var e;(e=document.querySelector(".search-pro-result-list-item.active .search-pro-result-item.active"))==null||e.scrollIntoView(!1)},{flush:"post"}),()=>l("div",{class:["search-pro-result-wrapper",{empty:S.value?!C.value:!L.value}],id:"search-pro-results"},S.value===""?P?L.value?[f?l("ul",{class:"search-pro-result-list"},l("li",{class:"search-pro-result-list-item"},[l("div",{class:"search-pro-result-title"},u.value.history),m.value.map((e,a)=>l("div",{class:["search-pro-result-item",{active:o.value.isQuery&&o.value.index===a}],onClick:()=>{n("updateQuery",e)}},[l(_,{class:"search-pro-result-type"}),l("div",{class:"search-pro-result-content"},e),l("button",{class:"search-pro-remove-icon",innerHTML:F,onClick:i=>{i.preventDefault(),i.stopPropagation(),w(a)}})]))])):null,H?l("ul",{class:"search-pro-result-list"},l("li",{class:"search-pro-result-list-item"},[l("div",{class:"search-pro-result-title"},u.value.history),h.value.map((e,a)=>l(U,{to:e.link,class:["search-pro-result-item",{active:!o.value.isQuery&&o.value.index===a}],onClick:()=>{Q()}},()=>[l(_,{class:"search-pro-result-type"}),l("div",{class:"search-pro-result-content"},[e.header?l("div",{class:"content-header"},e.header):null,l("div",e.display.map(i=>A(i)).flat())]),l("button",{class:"search-pro-remove-icon",innerHTML:F,onClick:i=>{i.preventDefault(),i.stopPropagation(),Y(a)}})]))])):null]:u.value.emptyHistory:u.value.emptyResult:z.value?l(re,{hint:u.value.searching}):C.value?l("ul",{class:"search-pro-result-list"},R.value.map(({title:e,contents:a},i)=>{const k=p.value===i;return l("li",{class:["search-pro-result-list-item",{active:k}]},[l("div",{class:"search-pro-result-title"},e||u.value.defaultTitle),a.map((v,X)=>{const $=k&&c.value===X;return l(U,{to:T(v),class:["search-pro-result-item",{active:$,"aria-selected":$}],onClick:()=>{g(r.query),O(v),Q()}},()=>[v.type==="text"?null:l(v.type==="title"?ue:v.type==="heading"?ie:ne,{class:"search-pro-result-type"}),l("div",{class:"search-pro-result-content"},[v.type==="text"&&v.header?l("div",{class:"content-header"},v.header):null,l("div",W(v))])])})])})):u.value.emptyResult)}});export{we as default}; +import{u as I,f as ee,g as j,h as B,Z as ae,i as le,t as se,j as x,k as D,l as te,m as M,n as l,p as _,q as F,s as U,v as re,x as ue,y as ie,z as ne,R as oe,O as ce,A as ve,B as pe,C as he,D as ye,E as de,F as me,G as b,H as fe}from"./app-5fb8f6f8.js";const ge="SEARCH_PRO_QUERY_HISTORY",y=I(ge,[]),He=()=>{const{queryHistoryCount:r}=b,n=r>0;return{enabled:n,queryHistory:y,addQueryHistory:t=>{n&&(y.value.length{y.value=[...y.value.slice(0,t),...y.value.slice(t+1)]}}},Re="SEARCH_PRO_RESULT_HISTORY",{resultHistoryCount:E}=b,d=I(Re,[]),Qe=()=>{const r=j(),n=E>0,t=s=>r.resolve({name:s.key,..."anchor"in s?{hash:`#${s.anchor}`}:{}}).fullPath;return{enabled:n,resultHistory:d,addResultHistory:s=>{if(n){const u={link:t(s),display:s.display};"header"in s&&(u.header=s.header),d.value.length{d.value=[...d.value.slice(0,s),...d.value.slice(s+1)]}}},ke=r=>{const n=oe(),t=B(),{search:s,terminate:u}=ce(),f=x(!1),g=ve([]);return pe(()=>{const m=()=>{g.value=[],f.value=!1},w=fe(H=>{f.value=!0,H?s({type:"search",query:H,locale:t.value,options:n}).then(h=>{g.value=h,f.value=!1}).catch(h=>{console.error(h),m()}):m()},b.searchDelay);M([r,t],()=>w(r.value),{immediate:!0}),he(()=>{u()})}),{searching:f,results:g}};var we=ee({name:"SearchResult",props:{query:{type:String,required:!0},isFocusing:Boolean},emits:["close","updateQuery"],setup(r,{emit:n}){const t=j(),s=B(),u=ae(le),{enabled:f,addQueryHistory:g,queryHistory:m,removeQueryHistory:w}=He(),{enabled:H,resultHistory:h,addResultHistory:O,removeResultHistory:Y}=Qe(),P=f||H,S=se(r,"query"),{results:R,searching:z}=ke(S),o=x({isQuery:!0,index:0}),p=x(0),c=x(0),L=D(()=>P&&(m.value.length>0||h.value.length>0)),C=D(()=>R.value.length>0),q=D(()=>R.value[p.value]||null),T=e=>t.resolve({name:e.key,..."anchor"in e?{hash:`#${e.anchor}`}:{}}).fullPath,G=()=>{const{isQuery:e,index:a}=o.value;a===0?o.value={isQuery:!e,index:e?h.value.length-1:m.value.length-1}:o.value={isQuery:e,index:a-1}},V=()=>{const{isQuery:e,index:a}=o.value;a===(e?m.value.length-1:h.value.length-1)?o.value={isQuery:!e,index:0}:o.value={isQuery:e,index:a+1}},Z=()=>{p.value=p.value>0?p.value-1:R.value.length-1,c.value=q.value.contents.length-1},J=()=>{p.value=p.value{c.value{c.value>0?c.value=c.value-1:Z()},A=e=>e.map(a=>ye(a)?a:l(a[0],a[1])),W=e=>{if(e.type==="customField"){const a=de[e.index]||"$content",[i,k=""]=me(a)?a[s.value].split("$content"):a.split("$content");return e.display.map(v=>l("div",A([i,...v,k])))}return e.display.map(a=>l("div",A(a)))},Q=()=>{p.value=0,c.value=0,n("updateQuery",""),n("close")};return te("keydown",e=>{if(r.isFocusing){if(C.value){if(e.key==="ArrowUp")N();else if(e.key==="ArrowDown")K();else if(e.key==="Enter"){const a=q.value.contents[c.value],i=T(a);g(r.query),O(a),t.push(i),Q()}}else if(H){if(e.key==="ArrowUp")G();else if(e.key==="ArrowDown")V();else if(e.key==="Enter"){const{index:a}=o.value;o.value.isQuery?(n("updateQuery",m.value[a]),e.preventDefault()):(t.push(h.value[a].link),Q())}}}}),M([p,c],()=>{var e;(e=document.querySelector(".search-pro-result-list-item.active .search-pro-result-item.active"))==null||e.scrollIntoView(!1)},{flush:"post"}),()=>l("div",{class:["search-pro-result-wrapper",{empty:S.value?!C.value:!L.value}],id:"search-pro-results"},S.value===""?P?L.value?[f?l("ul",{class:"search-pro-result-list"},l("li",{class:"search-pro-result-list-item"},[l("div",{class:"search-pro-result-title"},u.value.history),m.value.map((e,a)=>l("div",{class:["search-pro-result-item",{active:o.value.isQuery&&o.value.index===a}],onClick:()=>{n("updateQuery",e)}},[l(_,{class:"search-pro-result-type"}),l("div",{class:"search-pro-result-content"},e),l("button",{class:"search-pro-remove-icon",innerHTML:F,onClick:i=>{i.preventDefault(),i.stopPropagation(),w(a)}})]))])):null,H?l("ul",{class:"search-pro-result-list"},l("li",{class:"search-pro-result-list-item"},[l("div",{class:"search-pro-result-title"},u.value.history),h.value.map((e,a)=>l(U,{to:e.link,class:["search-pro-result-item",{active:!o.value.isQuery&&o.value.index===a}],onClick:()=>{Q()}},()=>[l(_,{class:"search-pro-result-type"}),l("div",{class:"search-pro-result-content"},[e.header?l("div",{class:"content-header"},e.header):null,l("div",e.display.map(i=>A(i)).flat())]),l("button",{class:"search-pro-remove-icon",innerHTML:F,onClick:i=>{i.preventDefault(),i.stopPropagation(),Y(a)}})]))])):null]:u.value.emptyHistory:u.value.emptyResult:z.value?l(re,{hint:u.value.searching}):C.value?l("ul",{class:"search-pro-result-list"},R.value.map(({title:e,contents:a},i)=>{const k=p.value===i;return l("li",{class:["search-pro-result-list-item",{active:k}]},[l("div",{class:"search-pro-result-title"},e||u.value.defaultTitle),a.map((v,X)=>{const $=k&&c.value===X;return l(U,{to:T(v),class:["search-pro-result-item",{active:$,"aria-selected":$}],onClick:()=>{g(r.query),O(v),Q()}},()=>[v.type==="text"?null:l(v.type==="title"?ue:v.type==="heading"?ie:ne,{class:"search-pro-result-type"}),l("div",{class:"search-pro-result-content"},[v.type==="text"&&v.header?l("div",{class:"content-header"},v.header):null,l("div",W(v))])])})])})):u.value.emptyResult)}});export{we as default}; diff --git a/assets/abap-language-version.html-1ef9f5b7.js b/assets/abap-language-version.html-a3ba08dc.js similarity index 99% rename from assets/abap-language-version.html-1ef9f5b7.js rename to assets/abap-language-version.html-a3ba08dc.js index 656d5dc82..e9f7573ca 100644 --- a/assets/abap-language-version.html-1ef9f5b7.js +++ b/assets/abap-language-version.html-a3ba08dc.js @@ -1 +1 @@ -import{_ as d}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as l,c as p,a as e,b as t,d as o,w as i,e as n}from"./app-2405b29a.js";const h={},c=n('

ABAP Language Version

With the 7.52 release, SAP provides the usage of the ABAP language version information in the on-premises world.

abapGit has been enhanced to support consistent handling of the ABAP language version across the different abapGit "flavors" (open-source / part of SAP BTP ABAP environment).

Note

Using ABAP language version in abapGit is still an experimental feature.

So far, abapGit handles ABAP language version only for a limited set of object types. See Supported Object Types, below.

Settings

',5),u=n('
SettingDescription
Any (default)Object-specific ABAP language version
IgnoreABAP language version not serialized
Standard ABAPOnly objects with "Standard ABAP" are allowed
ABAP for Key UsersOnly objects with "ABAP for Key Users" are allowed
ABAP for Cloud DevelopmentOnly objects with "ABAP for Cloud Development" are allowed

Any ABAP Language Version

If you do not define the ABAP language version (default setting "Any"), you can mix objects of any ABAP language version in a repository.

Info

This setting is recommended for repositories containing objects of more than one ABAP language version, which you would like to keep during import.

Export

When serializing objects, the ABAP language version will be part of the metadata of each object.

Import

When deserializing objects, abapGit will set the ABAP language version according to the metadata of each object.

Note

The ABAP language version of an object might lead to errors during import or when trying to activate objects. For example, if you try to import "Standard ABAP" into BTP which requires "ABAP for Cloud Development" you might get syntax errors.

Ignore ABAP Language Version

If you set the ABAP language version to "Ignore" it will not be serialized. This avoids diffs due to variations in development and target environments.

Info

This setting is recommended for cross-platform repositories with code running on-premises and BTP.

Export

When serializing objects, the ABAP language version will not be part of the object metadata.

Import

When deserializing objects, abapGit will set the ABAP language version according to the target SAP package (software component).

Note

The ABAP language version of an object might lead to errors during import or when trying to activate objects.

Standard ABAP, ABAP for Key Users, ABAP for Cloud Development

If a specific ABAP language version is defined, then all objects in the repository must adhere to this ABAP language version. If not, you will receive an error message.

Info

This setting is recommended for repositories that support only one platform.

Export

When serializing objects, the ABAP language version will be part of the metadata of each object.

Import

We distinguish two cases:

  1. The root package has the same or an undefined ABAP language version as specified in the repository

    When deserializing objects, abapGit will set the ABAP language version according to the setting in the repository.

  2. The root package has a different ABAP language version than specified in the repository

    When deserializing objects, abapGit will raise an error message alerting you to the mismatch. To import objects, change the ABAP language version of your root package to match the repository. However, this might not be possible since you can't use "Standard ABAP" on BTP, for example.

Summary

The following table shows the combinations of ABAP language settings of the repository and of the root package used for importing:

Root Package:Repo:
Any or Ignore
Repo:
Standard ABAP
Repo:
ABAP for Key Users
Repo:
ABAP for Cloud Development
Undefined (Any)(1)(1)(1)(1)
Standard ABAP(1)(2)(3)(3)
ABAP for Key Users(1)(3)(2)(3)
ABAP for Cloud Development(1)(3)(3)(2)

(1) Import possible (success if the individual objects are compatible with the target system and ABAP language version)

(2) Import possible

(3) Import not possible (error message)

Examples

If your project uses programs, function modules, or classes not released for "ABAP for Cloud Development", set the ABAP language version to "Standard ABAP".
This will ensure that users will not be able to install the project in systems where the use of "ABAP for Cloud Development" is enforced*.

Conversely, if your project uses exclusively objects and code released for ABAP for Key Users or Cloud Development, set the ABAP language version accordingly.
This will ensure that only objects compatible with systems will be included in your project, where the use of "ABAP for Cloud Development" is enforced*.

When transferring code from an on premise system to a system where the use of "ABAP for Cloud Development" is enforced* you can use the repository setting Ignore ABAP Language Version if your code has been developed using ABAP language version "Standard ABAP" though it could be activated using ABAP language version "ABAP for Cloud Development" as well. An example for this would be a RAP business object that uses tables with custom developed data elements. In this case the ABAP language version would be set to "ABAP for Cloud Development" based on the settings of the target package.

*(SAP BTP ABAP Environment, SAP S/4HANA ABAP Environment or SAP S/4HANA on prem / private cloud when using a software component with ABAP language version "ABAP for Cloud Development")

',36),g={class:"hint-container info"},A=e("p",{class:"hint-container-title"},"Info",-1),f={href:"https://github.com/abaplint/abaplint/blob/main/docs/getting_started.md",target:"_blank",rel:"noopener noreferrer"},b=n('

Supported Object Types

So far, handling of ABAP language version is implemented for the following object types:

CLAS, DEVC, FUGR, INTF, PROG, and objects based on the ABAP file format.

It's planned to support other object types that include the ABAP language version as well.

',4),m=e("h3",{id:"further-information",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#further-information","aria-hidden":"true"},"#"),t(" Further Information")],-1),v={href:"https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenabap_versions.htm",target:"_blank",rel:"noopener noreferrer"},y=e("br",null,null,-1),P={href:"https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/abenabap_versions.htm",target:"_blank",rel:"noopener noreferrer"},B=e("br",null,null,-1),_={href:"https://blogs.sap.com/2022/09/09/abap-language-versions-faqs/",target:"_blank",rel:"noopener noreferrer"},w=e("br",null,null,-1),x={href:"https://github.com/abapGit/abapGit/issues/6154#issuecomment-1749086748",target:"_blank",rel:"noopener noreferrer"};function j(q,S){const r=s("RouterLink"),a=s("ExternalLinkIcon");return l(),p("div",null,[c,e("p",null,[t("There are five possible "),o(r,{to:"/user-guide/repo-settings/dot-abapgit.html"},{default:i(()=>[t("settings")]),_:1}),t(" for defining how the ABAP language version is handled by abapGit:")]),u,e("div",g,[A,e("p",null,[t("You can use "),e("a",f,[t("abaplint"),o(a)]),t(" to automatically check for compatibility.")])]),b,e("p",null,[t("See "),o(r,{to:"/user-guide/reference/supported.html"},{default:i(()=>[t("Supported Object Types")]),_:1}),t(" for details.")]),m,e("p",null,[e("a",v,[t("Standard Documentation"),o(a)]),y,e("a",P,[t("Cloud Documentation"),o(a)]),B,e("a",_,[t("Blog and FAQ"),o(a)]),w,e("a",x,[t("Object Types Supporting ABAP Language Version (in general)"),o(a)])])])}const k=d(h,[["render",j],["__file","abap-language-version.html.vue"]]);export{k as default}; +import{_ as d}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as l,c as p,a as e,b as t,d as o,w as i,e as n}from"./app-5fb8f6f8.js";const h={},c=n('

ABAP Language Version

With the 7.52 release, SAP provides the usage of the ABAP language version information in the on-premises world.

abapGit has been enhanced to support consistent handling of the ABAP language version across the different abapGit "flavors" (open-source / part of SAP BTP ABAP environment).

Note

Using ABAP language version in abapGit is still an experimental feature.

So far, abapGit handles ABAP language version only for a limited set of object types. See Supported Object Types, below.

Settings

',5),u=n('
SettingDescription
Any (default)Object-specific ABAP language version
IgnoreABAP language version not serialized
Standard ABAPOnly objects with "Standard ABAP" are allowed
ABAP for Key UsersOnly objects with "ABAP for Key Users" are allowed
ABAP for Cloud DevelopmentOnly objects with "ABAP for Cloud Development" are allowed

Any ABAP Language Version

If you do not define the ABAP language version (default setting "Any"), you can mix objects of any ABAP language version in a repository.

Info

This setting is recommended for repositories containing objects of more than one ABAP language version, which you would like to keep during import.

Export

When serializing objects, the ABAP language version will be part of the metadata of each object.

Import

When deserializing objects, abapGit will set the ABAP language version according to the metadata of each object.

Note

The ABAP language version of an object might lead to errors during import or when trying to activate objects. For example, if you try to import "Standard ABAP" into BTP which requires "ABAP for Cloud Development" you might get syntax errors.

Ignore ABAP Language Version

If you set the ABAP language version to "Ignore" it will not be serialized. This avoids diffs due to variations in development and target environments.

Info

This setting is recommended for cross-platform repositories with code running on-premises and BTP.

Export

When serializing objects, the ABAP language version will not be part of the object metadata.

Import

When deserializing objects, abapGit will set the ABAP language version according to the target SAP package (software component).

Note

The ABAP language version of an object might lead to errors during import or when trying to activate objects.

Standard ABAP, ABAP for Key Users, ABAP for Cloud Development

If a specific ABAP language version is defined, then all objects in the repository must adhere to this ABAP language version. If not, you will receive an error message.

Info

This setting is recommended for repositories that support only one platform.

Export

When serializing objects, the ABAP language version will be part of the metadata of each object.

Import

We distinguish two cases:

  1. The root package has the same or an undefined ABAP language version as specified in the repository

    When deserializing objects, abapGit will set the ABAP language version according to the setting in the repository.

  2. The root package has a different ABAP language version than specified in the repository

    When deserializing objects, abapGit will raise an error message alerting you to the mismatch. To import objects, change the ABAP language version of your root package to match the repository. However, this might not be possible since you can't use "Standard ABAP" on BTP, for example.

Summary

The following table shows the combinations of ABAP language settings of the repository and of the root package used for importing:

Root Package:Repo:
Any or Ignore
Repo:
Standard ABAP
Repo:
ABAP for Key Users
Repo:
ABAP for Cloud Development
Undefined (Any)(1)(1)(1)(1)
Standard ABAP(1)(2)(3)(3)
ABAP for Key Users(1)(3)(2)(3)
ABAP for Cloud Development(1)(3)(3)(2)

(1) Import possible (success if the individual objects are compatible with the target system and ABAP language version)

(2) Import possible

(3) Import not possible (error message)

Examples

If your project uses programs, function modules, or classes not released for "ABAP for Cloud Development", set the ABAP language version to "Standard ABAP".
This will ensure that users will not be able to install the project in systems where the use of "ABAP for Cloud Development" is enforced*.

Conversely, if your project uses exclusively objects and code released for ABAP for Key Users or Cloud Development, set the ABAP language version accordingly.
This will ensure that only objects compatible with systems will be included in your project, where the use of "ABAP for Cloud Development" is enforced*.

When transferring code from an on premise system to a system where the use of "ABAP for Cloud Development" is enforced* you can use the repository setting Ignore ABAP Language Version if your code has been developed using ABAP language version "Standard ABAP" though it could be activated using ABAP language version "ABAP for Cloud Development" as well. An example for this would be a RAP business object that uses tables with custom developed data elements. In this case the ABAP language version would be set to "ABAP for Cloud Development" based on the settings of the target package.

*(SAP BTP ABAP Environment, SAP S/4HANA ABAP Environment or SAP S/4HANA on prem / private cloud when using a software component with ABAP language version "ABAP for Cloud Development")

',36),g={class:"hint-container info"},A=e("p",{class:"hint-container-title"},"Info",-1),f={href:"https://github.com/abaplint/abaplint/blob/main/docs/getting_started.md",target:"_blank",rel:"noopener noreferrer"},b=n('

Supported Object Types

So far, handling of ABAP language version is implemented for the following object types:

CLAS, DEVC, FUGR, INTF, PROG, and objects based on the ABAP file format.

It's planned to support other object types that include the ABAP language version as well.

',4),m=e("h3",{id:"further-information",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#further-information","aria-hidden":"true"},"#"),t(" Further Information")],-1),v={href:"https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenabap_versions.htm",target:"_blank",rel:"noopener noreferrer"},y=e("br",null,null,-1),P={href:"https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/abenabap_versions.htm",target:"_blank",rel:"noopener noreferrer"},B=e("br",null,null,-1),_={href:"https://blogs.sap.com/2022/09/09/abap-language-versions-faqs/",target:"_blank",rel:"noopener noreferrer"},w=e("br",null,null,-1),x={href:"https://github.com/abapGit/abapGit/issues/6154#issuecomment-1749086748",target:"_blank",rel:"noopener noreferrer"};function j(q,S){const r=s("RouterLink"),a=s("ExternalLinkIcon");return l(),p("div",null,[c,e("p",null,[t("There are five possible "),o(r,{to:"/user-guide/repo-settings/dot-abapgit.html"},{default:i(()=>[t("settings")]),_:1}),t(" for defining how the ABAP language version is handled by abapGit:")]),u,e("div",g,[A,e("p",null,[t("You can use "),e("a",f,[t("abaplint"),o(a)]),t(" to automatically check for compatibility.")])]),b,e("p",null,[t("See "),o(r,{to:"/user-guide/reference/supported.html"},{default:i(()=>[t("Supported Object Types")]),_:1}),t(" for details.")]),m,e("p",null,[e("a",v,[t("Standard Documentation"),o(a)]),y,e("a",P,[t("Cloud Documentation"),o(a)]),B,e("a",_,[t("Blog and FAQ"),o(a)]),w,e("a",x,[t("Object Types Supporting ABAP Language Version (in general)"),o(a)])])])}const k=d(h,[["render",j],["__file","abap-language-version.html.vue"]]);export{k as default}; diff --git a/assets/adding-icons.html-79bca7fa.js b/assets/adding-icons.html-1b731554.js similarity index 94% rename from assets/adding-icons.html-79bca7fa.js rename to assets/adding-icons.html-1b731554.js index 2e9c8d750..8d5d88836 100644 --- a/assets/adding-icons.html-79bca7fa.js +++ b/assets/adding-icons.html-1b731554.js @@ -1 +1 @@ -import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as s,c as r,a as e,b as t,d as n,w as c}from"./app-2405b29a.js";const d={},_=e("p",null,"abapGit uses SIL and MIT-licensed fonts, they are included in the distribution as a MIME object. This includes MIME objects:",-1),h=e("ul",null,[e("li",null,[e("code",null,"ZABAPGIT_ICON_FONT"),t(" - font in WOFF format containing the custom icon set. WOFF is used due to compatibility, SAP GUI for Windows reusing Internet Explorer control (IE 11)")]),e("li",null,[e("code",null,"ZABAPGIT_ICON_FONT_CSS"),t(" - CSS icon map")])],-1),p=e("p",null,"To add an icon to the icon set follow the next procedure:",-1),u={href:"https://github.com/abapGit/icon-font",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/abapGit/icon-font/blob/main/README.md",target:"_blank",rel:"noopener noreferrer"},m=e("li",null,"Get the new abapGit font and icon files from the icon-font GitHub action",-1),b=e("li",null,[t("Go to transaction "),e("code",null,"SMW0"),t(" and display the abapGit MIME objects (Binary > Package $abapgit)")],-1),I=e("li",null,[t("Upload the new font file to "),e("code",null,"ZABAPGIT_ICON_FONT")],-1),g=e("li",null,[t("Upload the new CSS file to "),e("code",null,"ZABAPGIT_ICON_FONT_CSS")],-1),G={href:"https://github.com/abapGit/abapGit",target:"_blank",rel:"noopener noreferrer"},S=e("p",null,[t("Please "),e("strong",null,"mind the licensing"),t(" when adding icons that are not from Font Awesome.")],-1),A={class:"hint-container info"},T=e("p",{class:"hint-container-title"},"Info",-1),k={href:"https://github.com/sbcgua/abap_w3mi_poller",target:"_blank",rel:"noopener noreferrer"};function w(C,N){const o=i("ExternalLinkIcon"),a=i("RouterLink");return s(),r("div",null,[_,h,p,e("ol",null,[e("li",null,[t("Add the icon to repo "),e("a",u,[t("abapGit Icon Font"),n(o)]),t(" as documented "),e("a",f,[t("here"),n(o)])]),m,b,I,g,e("li",null,[t("Start abapGit and commit the changes the "),e("a",G,[t("abapGit/abapGit"),n(o)]),t(" repo (preferably in a separate commit)")])]),S,e("div",A,[T,e("p",null,[t("Alternatively you can use "),e("a",k,[t("w3mipoller"),n(o)]),t(" for the upload step. See also "),n(a,{to:"/development-guide/user-interface/developing-ui-css.html"},{default:c(()=>[t("UI - CSS and assets")]),_:1}),t(".")])])])}const O=l(d,[["render",w],["__file","adding-icons.html.vue"]]);export{O as default}; +import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as s,c as r,a as e,b as t,d as n,w as c}from"./app-5fb8f6f8.js";const d={},_=e("p",null,"abapGit uses SIL and MIT-licensed fonts, they are included in the distribution as a MIME object. This includes MIME objects:",-1),h=e("ul",null,[e("li",null,[e("code",null,"ZABAPGIT_ICON_FONT"),t(" - font in WOFF format containing the custom icon set. WOFF is used due to compatibility, SAP GUI for Windows reusing Internet Explorer control (IE 11)")]),e("li",null,[e("code",null,"ZABAPGIT_ICON_FONT_CSS"),t(" - CSS icon map")])],-1),p=e("p",null,"To add an icon to the icon set follow the next procedure:",-1),u={href:"https://github.com/abapGit/icon-font",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/abapGit/icon-font/blob/main/README.md",target:"_blank",rel:"noopener noreferrer"},m=e("li",null,"Get the new abapGit font and icon files from the icon-font GitHub action",-1),b=e("li",null,[t("Go to transaction "),e("code",null,"SMW0"),t(" and display the abapGit MIME objects (Binary > Package $abapgit)")],-1),I=e("li",null,[t("Upload the new font file to "),e("code",null,"ZABAPGIT_ICON_FONT")],-1),g=e("li",null,[t("Upload the new CSS file to "),e("code",null,"ZABAPGIT_ICON_FONT_CSS")],-1),G={href:"https://github.com/abapGit/abapGit",target:"_blank",rel:"noopener noreferrer"},S=e("p",null,[t("Please "),e("strong",null,"mind the licensing"),t(" when adding icons that are not from Font Awesome.")],-1),A={class:"hint-container info"},T=e("p",{class:"hint-container-title"},"Info",-1),k={href:"https://github.com/sbcgua/abap_w3mi_poller",target:"_blank",rel:"noopener noreferrer"};function w(C,N){const o=i("ExternalLinkIcon"),a=i("RouterLink");return s(),r("div",null,[_,h,p,e("ol",null,[e("li",null,[t("Add the icon to repo "),e("a",u,[t("abapGit Icon Font"),n(o)]),t(" as documented "),e("a",f,[t("here"),n(o)])]),m,b,I,g,e("li",null,[t("Start abapGit and commit the changes the "),e("a",G,[t("abapGit/abapGit"),n(o)]),t(" repo (preferably in a separate commit)")])]),S,e("div",A,[T,e("p",null,[t("Alternatively you can use "),e("a",k,[t("w3mipoller"),n(o)]),t(" for the upload step. See also "),n(a,{to:"/development-guide/user-interface/developing-ui-css.html"},{default:c(()=>[t("UI - CSS and assets")]),_:1}),t(".")])])])}const O=l(d,[["render",w],["__file","adding-icons.html.vue"]]);export{O as default}; diff --git a/assets/apack.html-fddc446d.js b/assets/apack.html-8b739e8b.js similarity index 97% rename from assets/apack.html-fddc446d.js rename to assets/apack.html-8b739e8b.js index 63a019505..d377bf453 100644 --- a/assets/apack.html-fddc446d.js +++ b/assets/apack.html-8b739e8b.js @@ -1 +1 @@ -import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as r,c,a as e,b as t,d as a,e as n}from"./app-2405b29a.js";const l={},d=e("p",null,[t("Packages with a class that implements "),e("code",null,"ZIF_APACK_MANIFEST"),t(" (the interface is automatically created at the initial start of abapGit) can define metadata that is interpreted by clients that support the APACK package and dependency management framework.")],-1),p={class:"hint-container info"},h=e("p",{class:"hint-container-title"},"Info",-1),u={href:"https://developers.sap.com/tutorials/abap-environment-abapgit.html",target:"_blank",rel:"noopener noreferrer"},m=e("p",null,[t("Such an APACK implementation class must reside in the top-level ABAP package which is serialized by abapGit so that it can be detected properly. After the class is instantiated, it needs to have the field "),e("code",null,"ZIF_APACK_MANIFEST~DESCRIPTOR"),t(" populated with the respective APACK metadata.")],-1),_=e("p",null,[e("strong",null,"Note:"),t(" Don't put any functionality in such implementation classes, only use them to advertise APACK metadata.")],-1),f={href:"https://maven.apache.org/pom.html#Maven_Coordinates",target:"_blank",rel:"noopener noreferrer"},A=e("li",null,[e("code",null,"group_id"),t(": Unique name for your organization or project, e.g. "),e("code",null,"github.com/abapGit")],-1),g=e("li",null,[e("code",null,"artifact_id"),t(": The name for the project, needs to be unique together with the specified "),e("code",null,"group_id"),t(", e.g. "),e("code",null,"abapGit")],-1),y=e("code",null,"version",-1),b={href:"https://semver.org/",target:"_blank",rel:"noopener noreferrer"},v=e("code",null,"1.85",-1),P=n("
  • repository_type: Currently fixed to abapGit as it's currently the only supported repository type and is set automatically during serialization
  • git_url: The URL where your main repository is located, e.g. https://github.com/abapGit/abapGit.git
  • dependencies: Optional, only needs to be filled if this project has dependencies to other projects. You only need to specify group_id, artifact_id, version, and git_url to identify the dependency. target_package is ignored during serialization. Note: Be sure to specify the git_url for each dependency properly as this is currently the only way how dependencies can automatically be resolved.
  • ",3),k=n('

    If such an implementation class is detected during the serialization process, a corresponding .apack-manifest.xml file will be created on the top level of the Git repository. This contains the APACK metadata information.

    APACK in Namespaces

    If your project is using a namespace, then using ZIF_APACK_MANIFEST will not work (since it's not part of the namespace, obviously). Simply copy ZIF_APACK_MANIFEST to /namespace/ZIF_APACK_MANIFEST and use this interface in your APACK implementation class (requires abapGit v1.126.0 or higher).

    Transporting APACK implementation classes

    The interface ZIF_APACK_MANIFEST is automatically created as a local object, i.e. in package $TMP. If you intend to transport projects containing an implementation class to follow-on systems, you either need to remove the implementation class from the transport or ensure that ZIF_APACK_MANIFEST is available on each follow-on system to avoid syntax errors. So, either let abapGit create it in all systems (don't do that on production) or change the package assignment to a package with the same transport target as your projects and transport them together.

    Examples

    See the sample code on GitHub (uses IF_APACK_MANIFEST which is exclusively available on the SAP Cloud Platform ABAP Environment. However, the descriptor format is compatible with ZIF_APACK_MANIFEST.):

    ',7),I={href:"https://github.com/SAP/abap-platform-yy",target:"_blank",rel:"noopener noreferrer"},C={href:"https://github.com/SAP/abap-platform-jak",target:"_blank",rel:"noopener noreferrer"};function S(T,w){const o=s("ExternalLinkIcon");return r(),c("div",null,[d,e("div",p,[h,e("p",null,[t("APACK including dependencies is currently only supported by abapGit for ABAP Development Tools (ADT). Please also see the "),e("a",u,[t("respective tutorial"),a(o)]),t(" for details.")])]),m,_,e("p",null,[t("The metadata follows the "),e("a",f,[t("POM format by Apache Maven"),a(o)]),t(" and specifies additional information as well:")]),e("ul",null,[A,g,e("li",null,[y,t(": The version of your project, should adhere to the "),e("a",b,[t("semantic versioning concept"),a(o)]),t(", e.g. "),v]),P]),k,e("ul",null,[e("li",null,[e("a",I,[t("YY Data Service"),a(o)])]),e("li",null,[e("a",C,[t("JSON ABAP Konverter"),a(o)]),t(" (specifies a dependency on the YY Data Service)")])])])}const N=i(l,[["render",S],["__file","apack.html.vue"]]);export{N as default}; +import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as r,c,a as e,b as t,d as a,e as n}from"./app-5fb8f6f8.js";const l={},d=e("p",null,[t("Packages with a class that implements "),e("code",null,"ZIF_APACK_MANIFEST"),t(" (the interface is automatically created at the initial start of abapGit) can define metadata that is interpreted by clients that support the APACK package and dependency management framework.")],-1),p={class:"hint-container info"},h=e("p",{class:"hint-container-title"},"Info",-1),u={href:"https://developers.sap.com/tutorials/abap-environment-abapgit.html",target:"_blank",rel:"noopener noreferrer"},m=e("p",null,[t("Such an APACK implementation class must reside in the top-level ABAP package which is serialized by abapGit so that it can be detected properly. After the class is instantiated, it needs to have the field "),e("code",null,"ZIF_APACK_MANIFEST~DESCRIPTOR"),t(" populated with the respective APACK metadata.")],-1),_=e("p",null,[e("strong",null,"Note:"),t(" Don't put any functionality in such implementation classes, only use them to advertise APACK metadata.")],-1),f={href:"https://maven.apache.org/pom.html#Maven_Coordinates",target:"_blank",rel:"noopener noreferrer"},A=e("li",null,[e("code",null,"group_id"),t(": Unique name for your organization or project, e.g. "),e("code",null,"github.com/abapGit")],-1),g=e("li",null,[e("code",null,"artifact_id"),t(": The name for the project, needs to be unique together with the specified "),e("code",null,"group_id"),t(", e.g. "),e("code",null,"abapGit")],-1),y=e("code",null,"version",-1),b={href:"https://semver.org/",target:"_blank",rel:"noopener noreferrer"},v=e("code",null,"1.85",-1),P=n("
  • repository_type: Currently fixed to abapGit as it's currently the only supported repository type and is set automatically during serialization
  • git_url: The URL where your main repository is located, e.g. https://github.com/abapGit/abapGit.git
  • dependencies: Optional, only needs to be filled if this project has dependencies to other projects. You only need to specify group_id, artifact_id, version, and git_url to identify the dependency. target_package is ignored during serialization. Note: Be sure to specify the git_url for each dependency properly as this is currently the only way how dependencies can automatically be resolved.
  • ",3),k=n('

    If such an implementation class is detected during the serialization process, a corresponding .apack-manifest.xml file will be created on the top level of the Git repository. This contains the APACK metadata information.

    APACK in Namespaces

    If your project is using a namespace, then using ZIF_APACK_MANIFEST will not work (since it's not part of the namespace, obviously). Simply copy ZIF_APACK_MANIFEST to /namespace/ZIF_APACK_MANIFEST and use this interface in your APACK implementation class (requires abapGit v1.126.0 or higher).

    Transporting APACK implementation classes

    The interface ZIF_APACK_MANIFEST is automatically created as a local object, i.e. in package $TMP. If you intend to transport projects containing an implementation class to follow-on systems, you either need to remove the implementation class from the transport or ensure that ZIF_APACK_MANIFEST is available on each follow-on system to avoid syntax errors. So, either let abapGit create it in all systems (don't do that on production) or change the package assignment to a package with the same transport target as your projects and transport them together.

    Examples

    See the sample code on GitHub (uses IF_APACK_MANIFEST which is exclusively available on the SAP Cloud Platform ABAP Environment. However, the descriptor format is compatible with ZIF_APACK_MANIFEST.):

    ',7),I={href:"https://github.com/SAP/abap-platform-yy",target:"_blank",rel:"noopener noreferrer"},C={href:"https://github.com/SAP/abap-platform-jak",target:"_blank",rel:"noopener noreferrer"};function S(T,w){const o=s("ExternalLinkIcon");return r(),c("div",null,[d,e("div",p,[h,e("p",null,[t("APACK including dependencies is currently only supported by abapGit for ABAP Development Tools (ADT). Please also see the "),e("a",u,[t("respective tutorial"),a(o)]),t(" for details.")])]),m,_,e("p",null,[t("The metadata follows the "),e("a",f,[t("POM format by Apache Maven"),a(o)]),t(" and specifies additional information as well:")]),e("ul",null,[A,g,e("li",null,[y,t(": The version of your project, should adhere to the "),e("a",b,[t("semantic versioning concept"),a(o)]),t(", e.g. "),v]),P]),k,e("ul",null,[e("li",null,[e("a",I,[t("YY Data Service"),a(o)])]),e("li",null,[e("a",C,[t("JSON ABAP Konverter"),a(o)]),t(" (specifies a dependency on the YY Data Service)")])])])}const N=i(l,[["render",S],["__file","apack.html.vue"]]);export{N as default}; diff --git a/assets/api.html-fc302536.js b/assets/api.html-19da73c6.js similarity index 99% rename from assets/api.html-fc302536.js rename to assets/api.html-19da73c6.js index 4d890bc61..a69a139a0 100644 --- a/assets/api.html-fc302536.js +++ b/assets/api.html-19da73c6.js @@ -1,4 +1,4 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as p,o as i,c,a,b as n,d as t,e as s}from"./app-2405b29a.js";const l={},r=s(`

    This page describes how to execute various abapGit tasks using your code.

    Note

    These classes and methods have existed for quite some time and are stable.
    However, they do not provide a guaranteed API. Future changes are a possibility.

    Repositories

    Create Online

    Create a new abapGit repository for a given online project and branch and associate it with an SAP package:

    DATA(lo_repo) = zcl_abapgit_repo_srv=>get_instance( )->new_online(
    +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as p,o as i,c,a,b as n,d as t,e as s}from"./app-5fb8f6f8.js";const l={},r=s(`

    This page describes how to execute various abapGit tasks using your code.

    Note

    These classes and methods have existed for quite some time and are stable.
    However, they do not provide a guaranteed API. Future changes are a possibility.

    Repositories

    Create Online

    Create a new abapGit repository for a given online project and branch and associate it with an SAP package:

    DATA(lo_repo) = zcl_abapgit_repo_srv=>get_instance( )->new_online(
       iv_url         = lv_url
       iv_branch_name = lv_branch_name " optional
       iv_package     = lv_package ).
    diff --git a/assets/app-2405b29a.js b/assets/app-5fb8f6f8.js
    similarity index 95%
    rename from assets/app-2405b29a.js
    rename to assets/app-5fb8f6f8.js
    index c0637514c..01535f8ad 100644
    --- a/assets/app-2405b29a.js
    +++ b/assets/app-5fb8f6f8.js
    @@ -1,4 +1,4 @@
    -const Ou="modulepreload",Au=function(e){return"/"+e},ra={},b=function(t,n,r){if(!n||n.length===0)return t();const o=document.getElementsByTagName("link");return Promise.all(n.map(l=>{if(l=Au(l),l in ra)return;ra[l]=!0;const a=l.endsWith(".css"),s=a?'[rel="stylesheet"]':"";if(!!r)for(let i=o.length-1;i>=0;i--){const f=o[i];if(f.href===l&&(!a||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${l}"]${s}`))return;const u=document.createElement("link");if(u.rel=a?"stylesheet":Ou,a||(u.as="script",u.crossOrigin=""),u.href=l,document.head.appendChild(u),a)return new Promise((i,f)=>{u.addEventListener("load",i),u.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${l}`)))})})).then(()=>t()).catch(l=>{const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=l,window.dispatchEvent(a),!a.defaultPrevented)throw l})};function ll(e,t){const n=Object.create(null),r=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}const Te={},En=[],ut=()=>{},Pu=()=>!1,Cu=/^on[^a-z]/,ir=e=>Cu.test(e),al=e=>e.startsWith("onUpdate:"),Ce=Object.assign,sl=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},ku=Object.prototype.hasOwnProperty,ue=(e,t)=>ku.call(e,t),J=Array.isArray,Un=e=>Kr(e)==="[object Map]",xu=e=>Kr(e)==="[object Set]",ne=e=>typeof e=="function",pe=e=>typeof e=="string",il=e=>typeof e=="symbol",Le=e=>e!==null&&typeof e=="object",xs=e=>Le(e)&&ne(e.then)&&ne(e.catch),Iu=Object.prototype.toString,Kr=e=>Iu.call(e),Ru=e=>Kr(e).slice(8,-1),Su=e=>Kr(e)==="[object Object]",cl=e=>pe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Kn=ll(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),qr=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Du=/-(\w)/g,tt=qr(e=>e.replace(Du,(t,n)=>n?n.toUpperCase():"")),$u=/\B([A-Z])/g,$n=qr(e=>e.replace($u,"-$1").toLowerCase()),cr=qr(e=>e.charAt(0).toUpperCase()+e.slice(1)),io=qr(e=>e?`on${cr(e)}`:""),er=(e,t)=>!Object.is(e,t),co=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Mu=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Vu=e=>{const t=pe(e)?Number(e):NaN;return isNaN(t)?e:t};let oa;const Do=()=>oa||(oa=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function ul(e){if(J(e)){const t={};for(let n=0;n{if(n){const r=n.split(ju);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function dl(e){let t="";if(pe(e))t=e;else if(J(e))for(let n=0;n{const t=new Set(e);return t.w=0,t.n=0,t},Ss=e=>(e.w&Bt)>0,Ds=e=>(e.n&Bt)>0,qu=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(i==="length"||i>=c)&&s.push(u)})}else switch(n!==void 0&&s.push(a.get(n)),t){case"add":J(e)?cl(n)&&s.push(a.get("length")):(s.push(a.get(en)),Un(e)&&s.push(a.get(Mo)));break;case"delete":J(e)||(s.push(a.get(en)),Un(e)&&s.push(a.get(Mo)));break;case"set":Un(e)&&s.push(a.get(en));break}if(s.length===1)s[0]&&Vo(s[0]);else{const c=[];for(const u of s)u&&c.push(...u);Vo(fl(c))}}function Vo(e,t){const n=J(e)?e:[...e];for(const r of n)r.computed&&aa(r);for(const r of n)r.computed||aa(r)}function aa(e,t){(e!==it||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function Zu(e,t){var n;return(n=$r.get(e))==null?void 0:n.get(t)}const Yu=ll("__proto__,__v_isRef,__isVue"),Vs=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(il)),Xu=vl(),Ju=vl(!1,!0),Qu=vl(!0),sa=ed();function ed(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=se(this);for(let l=0,a=this.length;l{e[t]=function(...n){Mn();const r=se(this)[t].apply(this,n);return Vn(),r}}),e}function td(e){const t=se(this);return ze(t,"has",e),t.hasOwnProperty(e)}function vl(e=!1,t=!1){return function(r,o,l){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&l===(e?t?gd:Bs:t?Hs:Fs).get(r))return r;const a=J(r);if(!e){if(a&&ue(sa,o))return Reflect.get(sa,o,l);if(o==="hasOwnProperty")return td}const s=Reflect.get(r,o,l);return(il(o)?Vs.has(o):Yu(o))||(e||ze(r,"get",o),t)?s:Se(s)?a&&cl(o)?s:s.value:Le(s)?e?ln(s):ur(s):s}}const nd=Ns(),rd=Ns(!0);function Ns(e=!1){return function(n,r,o,l){let a=n[r];if(Cn(a)&&Se(a)&&!Se(o))return!1;if(!e&&(!Mr(o)&&!Cn(o)&&(a=se(a),o=se(o)),!J(n)&&Se(a)&&!Se(o)))return a.value=o,!0;const s=J(n)&&cl(r)?Number(r)e,Gr=e=>Reflect.getPrototypeOf(e);function br(e,t,n=!1,r=!1){e=e.__v_raw;const o=se(e),l=se(t);n||(t!==l&&ze(o,"get",t),ze(o,"get",l));const{has:a}=Gr(o),s=r?hl:n?_l:tr;if(a.call(o,t))return s(e.get(t));if(a.call(o,l))return s(e.get(l));e!==o&&e.get(t)}function yr(e,t=!1){const n=this.__v_raw,r=se(n),o=se(e);return t||(e!==o&&ze(r,"has",e),ze(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Er(e,t=!1){return e=e.__v_raw,!t&&ze(se(e),"iterate",en),Reflect.get(e,"size",e)}function ia(e){e=se(e);const t=se(this);return Gr(t).has.call(t,e)||(t.add(e),Pt(t,"add",e,e)),this}function ca(e,t){t=se(t);const n=se(this),{has:r,get:o}=Gr(n);let l=r.call(n,e);l||(e=se(e),l=r.call(n,e));const a=o.call(n,e);return n.set(e,t),l?er(t,a)&&Pt(n,"set",e,t):Pt(n,"add",e,t),this}function ua(e){const t=se(this),{has:n,get:r}=Gr(t);let o=n.call(t,e);o||(e=se(e),o=n.call(t,e)),r&&r.call(t,e);const l=t.delete(e);return o&&Pt(t,"delete",e,void 0),l}function da(){const e=se(this),t=e.size!==0,n=e.clear();return t&&Pt(e,"clear",void 0,void 0),n}function wr(e,t){return function(r,o){const l=this,a=l.__v_raw,s=se(a),c=t?hl:e?_l:tr;return!e&&ze(s,"iterate",en),a.forEach((u,i)=>r.call(o,c(u),c(i),l))}}function Tr(e,t,n){return function(...r){const o=this.__v_raw,l=se(o),a=Un(l),s=e==="entries"||e===Symbol.iterator&&a,c=e==="keys"&&a,u=o[e](...r),i=n?hl:t?_l:tr;return!t&&ze(l,"iterate",c?Mo:en),{next(){const{value:f,done:p}=u.next();return p?{value:f,done:p}:{value:s?[i(f[0]),i(f[1])]:i(f),done:p}},[Symbol.iterator](){return this}}}}function Rt(e){return function(...t){return e==="delete"?!1:this}}function cd(){const e={get(l){return br(this,l)},get size(){return Er(this)},has:yr,add:ia,set:ca,delete:ua,clear:da,forEach:wr(!1,!1)},t={get(l){return br(this,l,!1,!0)},get size(){return Er(this)},has:yr,add:ia,set:ca,delete:ua,clear:da,forEach:wr(!1,!0)},n={get(l){return br(this,l,!0)},get size(){return Er(this,!0)},has(l){return yr.call(this,l,!0)},add:Rt("add"),set:Rt("set"),delete:Rt("delete"),clear:Rt("clear"),forEach:wr(!0,!1)},r={get(l){return br(this,l,!0,!0)},get size(){return Er(this,!0)},has(l){return yr.call(this,l,!0)},add:Rt("add"),set:Rt("set"),delete:Rt("delete"),clear:Rt("clear"),forEach:wr(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(l=>{e[l]=Tr(l,!1,!1),n[l]=Tr(l,!0,!1),t[l]=Tr(l,!1,!0),r[l]=Tr(l,!0,!0)}),[e,n,t,r]}const[ud,dd,fd,pd]=cd();function ml(e,t){const n=t?e?pd:fd:e?dd:ud;return(r,o,l)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(ue(n,o)&&o in r?n:r,o,l)}const vd={get:ml(!1,!1)},hd={get:ml(!1,!0)},md={get:ml(!0,!1)},Fs=new WeakMap,Hs=new WeakMap,Bs=new WeakMap,gd=new WeakMap;function _d(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function bd(e){return e.__v_skip||!Object.isExtensible(e)?0:_d(Ru(e))}function ur(e){return Cn(e)?e:gl(e,!1,js,vd,Fs)}function zs(e){return gl(e,!1,id,hd,Hs)}function ln(e){return gl(e,!0,sd,md,Bs)}function gl(e,t,n,r,o){if(!Le(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const l=o.get(e);if(l)return l;const a=bd(e);if(a===0)return e;const s=new Proxy(e,a===2?r:n);return o.set(e,s),s}function wn(e){return Cn(e)?wn(e.__v_raw):!!(e&&e.__v_isReactive)}function Cn(e){return!!(e&&e.__v_isReadonly)}function Mr(e){return!!(e&&e.__v_isShallow)}function Ws(e){return wn(e)||Cn(e)}function se(e){const t=e&&e.__v_raw;return t?se(t):e}function Us(e){return Dr(e,"__v_skip",!0),e}const tr=e=>Le(e)?ur(e):e,_l=e=>Le(e)?ln(e):e;function bl(e){Ft&&it&&(e=se(e),Ms(e.dep||(e.dep=fl())))}function yl(e,t){e=se(e);const n=e.dep;n&&Vo(n)}function Se(e){return!!(e&&e.__v_isRef===!0)}function K(e){return Ks(e,!1)}function Oe(e){return Ks(e,!0)}function Ks(e,t){return Se(e)?e:new yd(e,t)}class yd{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:se(t),this._value=n?t:tr(t)}get value(){return bl(this),this._value}set value(t){const n=this.__v_isShallow||Mr(t)||Cn(t);t=n?t:se(t),er(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:tr(t),yl(this))}}function tn(e){return Se(e)?e.value:e}const Ed={get:(e,t,n)=>tn(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Se(o)&&!Se(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function qs(e){return wn(e)?e:new Proxy(e,Ed)}class wd{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>bl(this),()=>yl(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function Td(e){return new wd(e)}class Ld{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Zu(se(this._object),this._key)}}class Od{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Zr(e,t,n){return Se(e)?e:ne(e)?new Od(e):Le(e)&&arguments.length>1?Ad(e,t,n):K(e)}function Ad(e,t,n){const r=e[t];return Se(r)?r:new Ld(e,t,n)}class Pd{constructor(t,n,r,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new pl(t,()=>{this._dirty||(this._dirty=!0,yl(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=se(this);return bl(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function Cd(e,t,n=!1){let r,o;const l=ne(e);return l?(r=e,o=ut):(r=e.get,o=e.set),new Pd(r,o,l||!o,n)}function Ht(e,t,n,r){let o;try{o=r?e(...r):e()}catch(l){dr(l,t,n)}return o}function et(e,t,n,r){if(ne(e)){const l=Ht(e,t,n,r);return l&&xs(l)&&l.catch(a=>{dr(a,t,n)}),l}const o=[];for(let l=0;l>>1;rr($e[r])gt&&$e.splice(t,1)}function Rd(e){J(e)?Tn.push(...e):(!Ot||!Ot.includes(e,e.allowRecurse?Xt+1:Xt))&&Tn.push(e),Zs()}function fa(e,t=nr?gt+1:0){for(;t<$e.length;t++){const n=$e[t];n&&n.pre&&($e.splice(t,1),t--,n())}}function Vr(e){if(Tn.length){const t=[...new Set(Tn)];if(Tn.length=0,Ot){Ot.push(...t);return}for(Ot=t,Ot.sort((n,r)=>rr(n)-rr(r)),Xt=0;Xte.id==null?1/0:e.id,Sd=(e,t)=>{const n=rr(e)-rr(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Ys(e){No=!1,nr=!0,$e.sort(Sd);const t=ut;try{for(gt=0;gt<$e.length;gt++){const n=$e[gt];n&&n.active!==!1&&Ht(n,null,14)}}finally{gt=0,$e.length=0,Vr(),nr=!1,El=null,($e.length||Tn.length)&&Ys()}}function Dd(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||Te;let o=n;const l=t.startsWith("update:"),a=l&&t.slice(7);if(a&&a in r){const i=`${a==="modelValue"?"model":a}Modifiers`,{number:f,trim:p}=r[i]||Te;p&&(o=n.map(v=>pe(v)?v.trim():v)),f&&(o=n.map(Mu))}let s,c=r[s=io(t)]||r[s=io(tt(t))];!c&&l&&(c=r[s=io($n(t))]),c&&et(c,e,6,o);const u=r[s+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[s])return;e.emitted[s]=!0,et(u,e,6,o)}}function Xs(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const l=e.emits;let a={},s=!1;if(!ne(e)){const c=u=>{const i=Xs(u,t,!0);i&&(s=!0,Ce(a,i))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!l&&!s?(Le(e)&&r.set(e,null),null):(J(l)?l.forEach(c=>a[c]=null):Ce(a,l),Le(e)&&r.set(e,a),a)}function Xr(e,t){return!e||!ir(t)?!1:(t=t.slice(2).replace(/Once$/,""),ue(e,t[0].toLowerCase()+t.slice(1))||ue(e,$n(t))||ue(e,t))}let Qe=null,Js=null;function Nr(e){const t=Qe;return Qe=e,Js=e&&e.type.__scopeId||null,t}function $d(e,t=Qe,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&La(-1);const l=Nr(t);let a;try{a=e(...o)}finally{Nr(l),r._d&&La(1)}return a};return r._n=!0,r._c=!0,r._d=!0,r}function uo(e){const{type:t,vnode:n,proxy:r,withProxy:o,props:l,propsOptions:[a],slots:s,attrs:c,emit:u,render:i,renderCache:f,data:p,setupState:v,ctx:_,inheritAttrs:w}=e;let T,g;const y=Nr(e);try{if(n.shapeFlag&4){const R=o||r;T=st(i.call(R,R,f,l,v,p,_)),g=c}else{const R=t;T=st(R.length>1?R(l,{attrs:c,slots:s,emit:u}):R(l,null)),g=t.props?c:Md(c)}}catch(R){Yn.length=0,dr(R,e,1),T=De(_t)}let D=T;if(g&&w!==!1){const R=Object.keys(g),{shapeFlag:U}=D;R.length&&U&7&&(a&&R.some(al)&&(g=Vd(g,a)),D=zt(D,g))}return n.dirs&&(D=zt(D),D.dirs=D.dirs?D.dirs.concat(n.dirs):n.dirs),n.transition&&(D.transition=n.transition),T=D,Nr(y),T}const Md=e=>{let t;for(const n in e)(n==="class"||n==="style"||ir(n))&&((t||(t={}))[n]=e[n]);return t},Vd=(e,t)=>{const n={};for(const r in e)(!al(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Nd(e,t,n){const{props:r,children:o,component:l}=e,{props:a,children:s,patchFlag:c}=t,u=l.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?pa(r,a,u):!!a;if(c&8){const i=t.dynamicProps;for(let f=0;fe.__isSuspense;function Qs(e,t){t&&t.pendingBranch?J(e)?t.effects.push(...e):t.effects.push(e):Rd(e)}function ei(e,t){return wl(e,null,t)}const Lr={};function ae(e,t,n){return wl(e,t,n)}function wl(e,t,{immediate:n,deep:r,flush:o,onTrack:l,onTrigger:a}=Te){var s;const c=Rs()===((s=Re)==null?void 0:s.scope)?Re:null;let u,i=!1,f=!1;if(Se(e)?(u=()=>e.value,i=Mr(e)):wn(e)?(u=()=>e,r=!0):J(e)?(f=!0,i=e.some(R=>wn(R)||Mr(R)),u=()=>e.map(R=>{if(Se(R))return R.value;if(wn(R))return gn(R);if(ne(R))return Ht(R,c,2)})):ne(e)?t?u=()=>Ht(e,c,2):u=()=>{if(!(c&&c.isUnmounted))return p&&p(),et(e,c,3,[v])}:u=ut,t&&r){const R=u;u=()=>gn(R())}let p,v=R=>{p=y.onStop=()=>{Ht(R,c,4)}},_;if(In)if(v=ut,t?n&&et(t,c,3,[u(),f?[]:void 0,v]):u(),o==="sync"){const R=$f();_=R.__watcherHandles||(R.__watcherHandles=[])}else return ut;let w=f?new Array(e.length).fill(Lr):Lr;const T=()=>{if(y.active)if(t){const R=y.run();(r||i||(f?R.some((U,x)=>er(U,w[x])):er(R,w)))&&(p&&p(),et(t,c,3,[R,w===Lr?void 0:f&&w[0]===Lr?[]:w,v]),w=R)}else y.run()};T.allowRecurse=!!t;let g;o==="sync"?g=T:o==="post"?g=()=>Fe(T,c&&c.suspense):(T.pre=!0,c&&(T.id=c.uid),g=()=>Yr(T));const y=new pl(u,g);t?n?T():w=y.run():o==="post"?Fe(y.run.bind(y),c&&c.suspense):y.run();const D=()=>{y.stop(),c&&c.scope&&sl(c.scope.effects,y)};return _&&_.push(D),D}function Hd(e,t,n){const r=this.proxy,o=pe(e)?e.includes(".")?ti(r,e):()=>r[e]:e.bind(r,r);let l;ne(t)?l=t:(l=t.handler,n=t);const a=Re;xn(this);const s=wl(o,l.bind(r),n);return a?xn(a):rn(),s}function ti(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{gn(n,t)});else if(Su(e))for(const n in e)gn(e[n],t);return e}function mt(e,t,n,r){const o=e.dirs,l=t&&t.dirs;for(let a=0;a{e.isMounted=!0}),Ll(()=>{e.isUnmounting=!0}),e}const Ye=[Function,Array],ri={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Ye,onEnter:Ye,onAfterEnter:Ye,onEnterCancelled:Ye,onBeforeLeave:Ye,onLeave:Ye,onAfterLeave:Ye,onLeaveCancelled:Ye,onBeforeAppear:Ye,onAppear:Ye,onAfterAppear:Ye,onAppearCancelled:Ye},Bd={name:"BaseTransition",props:ri,setup(e,{slots:t}){const n=sn(),r=ni();let o;return()=>{const l=t.default&&Tl(t.default(),!0);if(!l||!l.length)return;let a=l[0];if(l.length>1){for(const w of l)if(w.type!==_t){a=w;break}}const s=se(e),{mode:c}=s;if(r.isLeaving)return fo(a);const u=va(a);if(!u)return fo(a);const i=or(u,s,r,n);lr(u,i);const f=n.subTree,p=f&&va(f);let v=!1;const{getTransitionKey:_}=u.type;if(_){const w=_();o===void 0?o=w:w!==o&&(o=w,v=!0)}if(p&&p.type!==_t&&(!Jt(u,p)||v)){const w=or(p,s,r,n);if(lr(p,w),c==="out-in")return r.isLeaving=!0,w.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&n.update()},fo(a);c==="in-out"&&u.type!==_t&&(w.delayLeave=(T,g,y)=>{const D=oi(r,p);D[String(p.key)]=p,T._leaveCb=()=>{g(),T._leaveCb=void 0,delete i.delayedLeave},i.delayedLeave=y})}return a}}},zd=Bd;function oi(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function or(e,t,n,r){const{appear:o,mode:l,persisted:a=!1,onBeforeEnter:s,onEnter:c,onAfterEnter:u,onEnterCancelled:i,onBeforeLeave:f,onLeave:p,onAfterLeave:v,onLeaveCancelled:_,onBeforeAppear:w,onAppear:T,onAfterAppear:g,onAppearCancelled:y}=t,D=String(e.key),R=oi(n,e),U=(O,B)=>{O&&et(O,r,9,B)},x=(O,B)=>{const z=B[1];U(O,B),J(O)?O.every(re=>re.length<=1)&&z():O.length<=1&&z()},M={mode:l,persisted:a,beforeEnter(O){let B=s;if(!n.isMounted)if(o)B=w||s;else return;O._leaveCb&&O._leaveCb(!0);const z=R[D];z&&Jt(e,z)&&z.el._leaveCb&&z.el._leaveCb(),U(B,[O])},enter(O){let B=c,z=u,re=i;if(!n.isMounted)if(o)B=T||c,z=g||u,re=y||i;else return;let W=!1;const Q=O._enterCb=q=>{W||(W=!0,q?U(re,[O]):U(z,[O]),M.delayedLeave&&M.delayedLeave(),O._enterCb=void 0)};B?x(B,[O,Q]):Q()},leave(O,B){const z=String(e.key);if(O._enterCb&&O._enterCb(!0),n.isUnmounting)return B();U(f,[O]);let re=!1;const W=O._leaveCb=Q=>{re||(re=!0,B(),Q?U(_,[O]):U(v,[O]),O._leaveCb=void 0,R[z]===e&&delete R[z])};R[z]=e,p?x(p,[O,W]):W()},clone(O){return or(O,t,n,r)}};return M}function fo(e){if(fr(e))return e=zt(e),e.children=null,e}function va(e){return fr(e)?e.children?e.children[0]:void 0:e}function lr(e,t){e.shapeFlag&6&&e.component?lr(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Tl(e,t=!1,n){let r=[],o=0;for(let l=0;l1)for(let l=0;lCe({name:e.name},t,{setup:e}))():e}const qn=e=>!!e.type.__asyncLoader;function S(e){ne(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:l,suspensible:a=!0,onError:s}=e;let c=null,u,i=0;const f=()=>(i++,c=null,p()),p=()=>{let v;return c||(v=c=t().catch(_=>{if(_=_ instanceof Error?_:new Error(String(_)),s)return new Promise((w,T)=>{s(_,()=>w(f()),()=>T(_),i+1)});throw _}).then(_=>v!==c&&c?c:(_&&(_.__esModule||_[Symbol.toStringTag]==="Module")&&(_=_.default),u=_,_)))};return H({name:"AsyncComponentWrapper",__asyncLoader:p,get __asyncResolved(){return u},setup(){const v=Re;if(u)return()=>po(u,v);const _=y=>{c=null,dr(y,v,13,!r)};if(a&&v.suspense||In)return p().then(y=>()=>po(y,v)).catch(y=>(_(y),()=>r?De(r,{error:y}):null));const w=K(!1),T=K(),g=K(!!o);return o&&setTimeout(()=>{g.value=!1},o),l!=null&&setTimeout(()=>{if(!w.value&&!T.value){const y=new Error(`Async component timed out after ${l}ms.`);_(y),T.value=y}},l),p().then(()=>{w.value=!0,v.parent&&fr(v.parent.vnode)&&Yr(v.parent.update)}).catch(y=>{_(y),T.value=y}),()=>{if(w.value&&u)return po(u,v);if(T.value&&r)return De(r,{error:T.value});if(n&&!g.value)return De(n)}}})}function po(e,t){const{ref:n,props:r,children:o,ce:l}=t.vnode,a=De(e,r,o);return a.ref=n,a.ce=l,delete t.vnode.ce,a}const fr=e=>e.type.__isKeepAlive;function Wd(e,t){li(e,"a",t)}function Ud(e,t){li(e,"da",t)}function li(e,t,n=Re){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Jr(t,r,n),n){let o=n.parent;for(;o&&o.parent;)fr(o.parent.vnode)&&Kd(r,t,n,o),o=o.parent}}function Kd(e,t,n,r){const o=Jr(t,e,r,!0);kt(()=>{sl(r[t],o)},n)}function Jr(e,t,n=Re,r=!1){if(n){const o=n[e]||(n[e]=[]),l=t.__weh||(t.__weh=(...a)=>{if(n.isUnmounted)return;Mn(),xn(n);const s=et(t,n,e,a);return rn(),Vn(),s});return r?o.unshift(l):o.push(l),l}}const Ct=e=>(t,n=Re)=>(!In||e==="sp")&&Jr(e,(...r)=>t(...r),n),qd=Ct("bm"),de=Ct("m"),Gd=Ct("bu"),ai=Ct("u"),Ll=Ct("bum"),kt=Ct("um"),Zd=Ct("sp"),Yd=Ct("rtg"),Xd=Ct("rtc");function Jd(e,t=Re){Jr("ec",e,t)}const si="components";function dt(e,t){return ef(si,e,!0,t)||e}const Qd=Symbol.for("v-ndc");function ef(e,t,n=!0,r=!1){const o=Qe||Re;if(o){const l=o.type;if(e===si){const s=Rf(l,!1);if(s&&(s===t||s===tt(t)||s===cr(tt(t))))return l}const a=ha(o[e]||l[e],t)||ha(o.appContext[e],t);return!a&&r?l:a}}function ha(e,t){return e&&(e[t]||e[tt(t)]||e[cr(tt(t))])}const jo=e=>e?bi(e)?kl(e)||e.proxy:jo(e.parent):null,Gn=Ce(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>jo(e.parent),$root:e=>jo(e.root),$emit:e=>e.emit,$options:e=>Ol(e),$forceUpdate:e=>e.f||(e.f=()=>Yr(e.update)),$nextTick:e=>e.n||(e.n=an.bind(e.proxy)),$watch:e=>Hd.bind(e)}),vo=(e,t)=>e!==Te&&!e.__isScriptSetup&&ue(e,t),tf={get({_:e},t){const{ctx:n,setupState:r,data:o,props:l,accessCache:a,type:s,appContext:c}=e;let u;if(t[0]!=="$"){const v=a[t];if(v!==void 0)switch(v){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return l[t]}else{if(vo(r,t))return a[t]=1,r[t];if(o!==Te&&ue(o,t))return a[t]=2,o[t];if((u=e.propsOptions[0])&&ue(u,t))return a[t]=3,l[t];if(n!==Te&&ue(n,t))return a[t]=4,n[t];Fo&&(a[t]=0)}}const i=Gn[t];let f,p;if(i)return t==="$attrs"&&ze(e,"get",t),i(e);if((f=s.__cssModules)&&(f=f[t]))return f;if(n!==Te&&ue(n,t))return a[t]=4,n[t];if(p=c.config.globalProperties,ue(p,t))return p[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:l}=e;return vo(o,t)?(o[t]=n,!0):r!==Te&&ue(r,t)?(r[t]=n,!0):ue(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(l[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:l}},a){let s;return!!n[a]||e!==Te&&ue(e,a)||vo(t,a)||(s=l[0])&&ue(s,a)||ue(r,a)||ue(Gn,a)||ue(o.config.globalProperties,a)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ue(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function ma(e){return J(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Fo=!0;function nf(e){const t=Ol(e),n=e.proxy,r=e.ctx;Fo=!1,t.beforeCreate&&ga(t.beforeCreate,e,"bc");const{data:o,computed:l,methods:a,watch:s,provide:c,inject:u,created:i,beforeMount:f,mounted:p,beforeUpdate:v,updated:_,activated:w,deactivated:T,beforeDestroy:g,beforeUnmount:y,destroyed:D,unmounted:R,render:U,renderTracked:x,renderTriggered:M,errorCaptured:O,serverPrefetch:B,expose:z,inheritAttrs:re,components:W,directives:Q,filters:q}=t;if(u&&rf(u,r,null),a)for(const fe in a){const te=a[fe];ne(te)&&(r[fe]=te.bind(n))}if(o){const fe=o.call(n,n);Le(fe)&&(e.data=ur(fe))}if(Fo=!0,l)for(const fe in l){const te=l[fe],ot=ne(te)?te.bind(n,n):ne(te.get)?te.get.bind(n,n):ut,vt=!ne(te)&&ne(te.set)?te.set.bind(n):ut,je=A({get:ot,set:vt});Object.defineProperty(r,fe,{enumerable:!0,configurable:!0,get:()=>je.value,set:Ae=>je.value=Ae})}if(s)for(const fe in s)ii(s[fe],r,n,fe);if(c){const fe=ne(c)?c.call(n):c;Reflect.ownKeys(fe).forEach(te=>{nn(te,fe[te])})}i&&ga(i,e,"c");function oe(fe,te){J(te)?te.forEach(ot=>fe(ot.bind(n))):te&&fe(te.bind(n))}if(oe(qd,f),oe(de,p),oe(Gd,v),oe(ai,_),oe(Wd,w),oe(Ud,T),oe(Jd,O),oe(Xd,x),oe(Yd,M),oe(Ll,y),oe(kt,R),oe(Zd,B),J(z))if(z.length){const fe=e.exposed||(e.exposed={});z.forEach(te=>{Object.defineProperty(fe,te,{get:()=>n[te],set:ot=>n[te]=ot})})}else e.exposed||(e.exposed={});U&&e.render===ut&&(e.render=U),re!=null&&(e.inheritAttrs=re),W&&(e.components=W),Q&&(e.directives=Q)}function rf(e,t,n=ut){J(e)&&(e=Ho(e));for(const r in e){const o=e[r];let l;Le(o)?"default"in o?l=ye(o.from||r,o.default,!0):l=ye(o.from||r):l=ye(o),Se(l)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>l.value,set:a=>l.value=a}):t[r]=l}}function ga(e,t,n){et(J(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function ii(e,t,n,r){const o=r.includes(".")?ti(n,r):()=>n[r];if(pe(e)){const l=t[e];ne(l)&&ae(o,l)}else if(ne(e))ae(o,e.bind(n));else if(Le(e))if(J(e))e.forEach(l=>ii(l,t,n,r));else{const l=ne(e.handler)?e.handler.bind(n):t[e.handler];ne(l)&&ae(o,l,e)}}function Ol(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:l,config:{optionMergeStrategies:a}}=e.appContext,s=l.get(t);let c;return s?c=s:!o.length&&!n&&!r?c=t:(c={},o.length&&o.forEach(u=>jr(c,u,a,!0)),jr(c,t,a)),Le(t)&&l.set(t,c),c}function jr(e,t,n,r=!1){const{mixins:o,extends:l}=t;l&&jr(e,l,n,!0),o&&o.forEach(a=>jr(e,a,n,!0));for(const a in t)if(!(r&&a==="expose")){const s=of[a]||n&&n[a];e[a]=s?s(e[a],t[a]):t[a]}return e}const of={data:_a,props:ba,emits:ba,methods:Wn,computed:Wn,beforeCreate:Me,created:Me,beforeMount:Me,mounted:Me,beforeUpdate:Me,updated:Me,beforeDestroy:Me,beforeUnmount:Me,destroyed:Me,unmounted:Me,activated:Me,deactivated:Me,errorCaptured:Me,serverPrefetch:Me,components:Wn,directives:Wn,watch:af,provide:_a,inject:lf};function _a(e,t){return t?e?function(){return Ce(ne(e)?e.call(this,this):e,ne(t)?t.call(this,this):t)}:t:e}function lf(e,t){return Wn(Ho(e),Ho(t))}function Ho(e){if(J(e)){const t={};for(let n=0;n1)return n&&ne(t)?t.call(r&&r.proxy):t}}function uf(e,t,n,r=!1){const o={},l={};Dr(l,Qr,1),e.propsDefaults=Object.create(null),ui(e,t,o,l);for(const a in e.propsOptions[0])a in o||(o[a]=void 0);n?e.props=r?o:zs(o):e.type.props?e.props=o:e.props=l,e.attrs=l}function df(e,t,n,r){const{props:o,attrs:l,vnode:{patchFlag:a}}=e,s=se(o),[c]=e.propsOptions;let u=!1;if((r||a>0)&&!(a&16)){if(a&8){const i=e.vnode.dynamicProps;for(let f=0;f{c=!0;const[p,v]=di(f,t,!0);Ce(a,p),v&&s.push(...v)};!n&&t.mixins.length&&t.mixins.forEach(i),e.extends&&i(e.extends),e.mixins&&e.mixins.forEach(i)}if(!l&&!c)return Le(e)&&r.set(e,En),En;if(J(l))for(let i=0;i-1,v[1]=w<0||_-1||ue(v,"default"))&&s.push(f)}}}const u=[a,s];return Le(e)&&r.set(e,u),u}function ya(e){return e[0]!=="$"}function Ea(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function wa(e,t){return Ea(e)===Ea(t)}function Ta(e,t){return J(t)?t.findIndex(n=>wa(n,e)):ne(t)&&wa(t,e)?0:-1}const fi=e=>e[0]==="_"||e==="$stable",Al=e=>J(e)?e.map(st):[st(e)],ff=(e,t,n)=>{if(t._n)return t;const r=$d((...o)=>Al(t(...o)),n);return r._c=!1,r},pi=(e,t,n)=>{const r=e._ctx;for(const o in e){if(fi(o))continue;const l=e[o];if(ne(l))t[o]=ff(o,l,r);else if(l!=null){const a=Al(l);t[o]=()=>a}}},vi=(e,t)=>{const n=Al(t);e.slots.default=()=>n},pf=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=se(t),Dr(t,"_",n)):pi(t,e.slots={})}else e.slots={},t&&vi(e,t);Dr(e.slots,Qr,1)},vf=(e,t,n)=>{const{vnode:r,slots:o}=e;let l=!0,a=Te;if(r.shapeFlag&32){const s=t._;s?n&&s===1?l=!1:(Ce(o,t),!n&&s===1&&delete o._):(l=!t.$stable,pi(t,o)),a=t}else t&&(vi(e,t),a={default:1});if(l)for(const s in o)!fi(s)&&!(s in a)&&delete o[s]};function Hr(e,t,n,r,o=!1){if(J(e)){e.forEach((p,v)=>Hr(p,t&&(J(t)?t[v]:t),n,r,o));return}if(qn(r)&&!o)return;const l=r.shapeFlag&4?kl(r.component)||r.component.proxy:r.el,a=o?null:l,{i:s,r:c}=e,u=t&&t.r,i=s.refs===Te?s.refs={}:s.refs,f=s.setupState;if(u!=null&&u!==c&&(pe(u)?(i[u]=null,ue(f,u)&&(f[u]=null)):Se(u)&&(u.value=null)),ne(c))Ht(c,s,12,[a,i]);else{const p=pe(c),v=Se(c);if(p||v){const _=()=>{if(e.f){const w=p?ue(f,c)?f[c]:i[c]:c.value;o?J(w)&&sl(w,l):J(w)?w.includes(l)||w.push(l):p?(i[c]=[l],ue(f,c)&&(f[c]=i[c])):(c.value=[l],e.k&&(i[e.k]=c.value))}else p?(i[c]=a,ue(f,c)&&(f[c]=a)):v&&(c.value=a,e.k&&(i[e.k]=a))};a?(_.id=-1,Fe(_,n)):_()}}}let St=!1;const Or=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Ar=e=>e.nodeType===8;function hf(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:l,parentNode:a,remove:s,insert:c,createComment:u}}=e,i=(g,y)=>{if(!y.hasChildNodes()){n(null,g,y),Vr(),y._vnode=g;return}St=!1,f(y.firstChild,g,null,null,null),Vr(),y._vnode=g,St&&console.error("Hydration completed but contains mismatches.")},f=(g,y,D,R,U,x=!1)=>{const M=Ar(g)&&g.data==="[",O=()=>w(g,y,D,R,U,M),{type:B,ref:z,shapeFlag:re,patchFlag:W}=y;let Q=g.nodeType;y.el=g,W===-2&&(x=!1,y.dynamicChildren=null);let q=null;switch(B){case kn:Q!==3?y.children===""?(c(y.el=o(""),a(g),g),q=g):q=O():(g.data!==y.children&&(St=!0,g.data=y.children),q=l(g));break;case _t:Q!==8||M?q=O():q=l(g);break;case Zn:if(M&&(g=l(g),Q=g.nodeType),Q===1||Q===3){q=g;const we=!y.children.length;for(let oe=0;oe{x=x||!!y.dynamicChildren;const{type:M,props:O,patchFlag:B,shapeFlag:z,dirs:re}=y,W=M==="input"&&re||M==="option";if(W||B!==-1){if(re&&mt(y,null,D,"created"),O)if(W||!x||B&48)for(const q in O)(W&&q.endsWith("value")||ir(q)&&!Kn(q))&&r(g,q,null,O[q],!1,void 0,D);else O.onClick&&r(g,"onClick",null,O.onClick,!1,void 0,D);let Q;if((Q=O&&O.onVnodeBeforeMount)&&Xe(Q,D,y),re&&mt(y,null,D,"beforeMount"),((Q=O&&O.onVnodeMounted)||re)&&Qs(()=>{Q&&Xe(Q,D,y),re&&mt(y,null,D,"mounted")},R),z&16&&!(O&&(O.innerHTML||O.textContent))){let q=v(g.firstChild,y,g,D,R,U,x);for(;q;){St=!0;const we=q;q=q.nextSibling,s(we)}}else z&8&&g.textContent!==y.children&&(St=!0,g.textContent=y.children)}return g.nextSibling},v=(g,y,D,R,U,x,M)=>{M=M||!!y.dynamicChildren;const O=y.children,B=O.length;for(let z=0;z{const{slotScopeIds:M}=y;M&&(U=U?U.concat(M):M);const O=a(g),B=v(l(g),y,O,D,R,U,x);return B&&Ar(B)&&B.data==="]"?l(y.anchor=B):(St=!0,c(y.anchor=u("]"),O,B),B)},w=(g,y,D,R,U,x)=>{if(St=!0,y.el=null,x){const B=T(g);for(;;){const z=l(g);if(z&&z!==B)s(z);else break}}const M=l(g),O=a(g);return s(g),n(null,y,O,M,D,R,Or(O),U),M},T=g=>{let y=0;for(;g;)if(g=l(g),g&&Ar(g)&&(g.data==="["&&y++,g.data==="]")){if(y===0)return l(g);y--}return g};return[i,f]}const Fe=Qs;function mf(e){return gf(e,hf)}function gf(e,t){const n=Do();n.__VUE__=!0;const{insert:r,remove:o,patchProp:l,createElement:a,createText:s,createComment:c,setText:u,setElementText:i,parentNode:f,nextSibling:p,setScopeId:v=ut,insertStaticContent:_}=e,w=(h,m,E,L=null,C=null,k=null,j=!1,$=null,N=!!m.dynamicChildren)=>{if(h===m)return;h&&!Jt(h,m)&&(L=P(h),Ae(h,C,k,!0),h=null),m.patchFlag===-2&&(N=!1,m.dynamicChildren=null);const{type:I,ref:Y,shapeFlag:G}=m;switch(I){case kn:T(h,m,E,L);break;case _t:g(h,m,E,L);break;case Zn:h==null&&y(m,E,L,j);break;case Ke:W(h,m,E,L,C,k,j,$,N);break;default:G&1?U(h,m,E,L,C,k,j,$,N):G&6?Q(h,m,E,L,C,k,j,$,N):(G&64||G&128)&&I.process(h,m,E,L,C,k,j,$,N,V)}Y!=null&&C&&Hr(Y,h&&h.ref,k,m||h,!m)},T=(h,m,E,L)=>{if(h==null)r(m.el=s(m.children),E,L);else{const C=m.el=h.el;m.children!==h.children&&u(C,m.children)}},g=(h,m,E,L)=>{h==null?r(m.el=c(m.children||""),E,L):m.el=h.el},y=(h,m,E,L)=>{[h.el,h.anchor]=_(h.children,m,E,L,h.el,h.anchor)},D=({el:h,anchor:m},E,L)=>{let C;for(;h&&h!==m;)C=p(h),r(h,E,L),h=C;r(m,E,L)},R=({el:h,anchor:m})=>{let E;for(;h&&h!==m;)E=p(h),o(h),h=E;o(m)},U=(h,m,E,L,C,k,j,$,N)=>{j=j||m.type==="svg",h==null?x(m,E,L,C,k,j,$,N):B(h,m,C,k,j,$,N)},x=(h,m,E,L,C,k,j,$)=>{let N,I;const{type:Y,props:G,shapeFlag:X,transition:ee,dirs:le}=h;if(N=h.el=a(h.type,k,G&&G.is,G),X&8?i(N,h.children):X&16&&O(h.children,N,null,L,C,k&&Y!=="foreignObject",j,$),le&&mt(h,null,L,"created"),M(N,h,h.scopeId,j,L),G){for(const he in G)he!=="value"&&!Kn(he)&&l(N,he,null,G[he],k,h.children,L,C,ke);"value"in G&&l(N,"value",null,G.value),(I=G.onVnodeBeforeMount)&&Xe(I,L,h)}le&&mt(h,null,L,"beforeMount");const be=(!C||C&&!C.pendingBranch)&&ee&&!ee.persisted;be&&ee.beforeEnter(N),r(N,m,E),((I=G&&G.onVnodeMounted)||be||le)&&Fe(()=>{I&&Xe(I,L,h),be&&ee.enter(N),le&&mt(h,null,L,"mounted")},C)},M=(h,m,E,L,C)=>{if(E&&v(h,E),L)for(let k=0;k{for(let I=N;I{const $=m.el=h.el;let{patchFlag:N,dynamicChildren:I,dirs:Y}=m;N|=h.patchFlag&16;const G=h.props||Te,X=m.props||Te;let ee;E&&Zt(E,!1),(ee=X.onVnodeBeforeUpdate)&&Xe(ee,E,m,h),Y&&mt(m,h,E,"beforeUpdate"),E&&Zt(E,!0);const le=C&&m.type!=="foreignObject";if(I?z(h.dynamicChildren,I,$,E,L,le,k):j||te(h,m,$,null,E,L,le,k,!1),N>0){if(N&16)re($,m,G,X,E,L,C);else if(N&2&&G.class!==X.class&&l($,"class",null,X.class,C),N&4&&l($,"style",G.style,X.style,C),N&8){const be=m.dynamicProps;for(let he=0;he{ee&&Xe(ee,E,m,h),Y&&mt(m,h,E,"updated")},L)},z=(h,m,E,L,C,k,j)=>{for(let $=0;${if(E!==L){if(E!==Te)for(const $ in E)!Kn($)&&!($ in L)&&l(h,$,E[$],null,j,m.children,C,k,ke);for(const $ in L){if(Kn($))continue;const N=L[$],I=E[$];N!==I&&$!=="value"&&l(h,$,I,N,j,m.children,C,k,ke)}"value"in L&&l(h,"value",E.value,L.value)}},W=(h,m,E,L,C,k,j,$,N)=>{const I=m.el=h?h.el:s(""),Y=m.anchor=h?h.anchor:s("");let{patchFlag:G,dynamicChildren:X,slotScopeIds:ee}=m;ee&&($=$?$.concat(ee):ee),h==null?(r(I,E,L),r(Y,E,L),O(m.children,E,Y,C,k,j,$,N)):G>0&&G&64&&X&&h.dynamicChildren?(z(h.dynamicChildren,X,E,C,k,j,$),(m.key!=null||C&&m===C.subTree)&&hi(h,m,!0)):te(h,m,E,Y,C,k,j,$,N)},Q=(h,m,E,L,C,k,j,$,N)=>{m.slotScopeIds=$,h==null?m.shapeFlag&512?C.ctx.activate(m,E,L,j,N):q(m,E,L,C,k,j,N):we(h,m,N)},q=(h,m,E,L,C,k,j)=>{const $=h.component=Pf(h,L,C);if(fr(h)&&($.ctx.renderer=V),Cf($),$.asyncDep){if(C&&C.registerDep($,oe),!h.el){const N=$.subTree=De(_t);g(null,N,m,E)}return}oe($,h,m,E,C,k,j)},we=(h,m,E)=>{const L=m.component=h.component;if(Nd(h,m,E))if(L.asyncDep&&!L.asyncResolved){fe(L,m,E);return}else L.next=m,Id(L.update),L.update();else m.el=h.el,L.vnode=m},oe=(h,m,E,L,C,k,j)=>{const $=()=>{if(h.isMounted){let{next:Y,bu:G,u:X,parent:ee,vnode:le}=h,be=Y,he;Zt(h,!1),Y?(Y.el=le.el,fe(h,Y,j)):Y=le,G&&co(G),(he=Y.props&&Y.props.onVnodeBeforeUpdate)&&Xe(he,ee,Y,le),Zt(h,!0);const xe=uo(h),lt=h.subTree;h.subTree=xe,w(lt,xe,f(lt.el),P(lt),h,C,k),Y.el=xe.el,be===null&&jd(h,xe.el),X&&Fe(X,C),(he=Y.props&&Y.props.onVnodeUpdated)&&Fe(()=>Xe(he,ee,Y,le),C)}else{let Y;const{el:G,props:X}=m,{bm:ee,m:le,parent:be}=h,he=qn(m);if(Zt(h,!1),ee&&co(ee),!he&&(Y=X&&X.onVnodeBeforeMount)&&Xe(Y,be,m),Zt(h,!0),G&&ie){const xe=()=>{h.subTree=uo(h),ie(G,h.subTree,h,C,null)};he?m.type.__asyncLoader().then(()=>!h.isUnmounted&&xe()):xe()}else{const xe=h.subTree=uo(h);w(null,xe,E,L,h,C,k),m.el=xe.el}if(le&&Fe(le,C),!he&&(Y=X&&X.onVnodeMounted)){const xe=m;Fe(()=>Xe(Y,be,xe),C)}(m.shapeFlag&256||be&&qn(be.vnode)&&be.vnode.shapeFlag&256)&&h.a&&Fe(h.a,C),h.isMounted=!0,m=E=L=null}},N=h.effect=new pl($,()=>Yr(I),h.scope),I=h.update=()=>N.run();I.id=h.uid,Zt(h,!0),I()},fe=(h,m,E)=>{m.component=h;const L=h.vnode.props;h.vnode=m,h.next=null,df(h,m.props,L,E),vf(h,m.children,E),Mn(),fa(),Vn()},te=(h,m,E,L,C,k,j,$,N=!1)=>{const I=h&&h.children,Y=h?h.shapeFlag:0,G=m.children,{patchFlag:X,shapeFlag:ee}=m;if(X>0){if(X&128){vt(I,G,E,L,C,k,j,$,N);return}else if(X&256){ot(I,G,E,L,C,k,j,$,N);return}}ee&8?(Y&16&&ke(I,C,k),G!==I&&i(E,G)):Y&16?ee&16?vt(I,G,E,L,C,k,j,$,N):ke(I,C,k,!0):(Y&8&&i(E,""),ee&16&&O(G,E,L,C,k,j,$,N))},ot=(h,m,E,L,C,k,j,$,N)=>{h=h||En,m=m||En;const I=h.length,Y=m.length,G=Math.min(I,Y);let X;for(X=0;XY?ke(h,C,k,!0,!1,G):O(m,E,L,C,k,j,$,N,G)},vt=(h,m,E,L,C,k,j,$,N)=>{let I=0;const Y=m.length;let G=h.length-1,X=Y-1;for(;I<=G&&I<=X;){const ee=h[I],le=m[I]=N?Vt(m[I]):st(m[I]);if(Jt(ee,le))w(ee,le,E,null,C,k,j,$,N);else break;I++}for(;I<=G&&I<=X;){const ee=h[G],le=m[X]=N?Vt(m[X]):st(m[X]);if(Jt(ee,le))w(ee,le,E,null,C,k,j,$,N);else break;G--,X--}if(I>G){if(I<=X){const ee=X+1,le=eeX)for(;I<=G;)Ae(h[I],C,k,!0),I++;else{const ee=I,le=I,be=new Map;for(I=le;I<=X;I++){const We=m[I]=N?Vt(m[I]):st(m[I]);We.key!=null&&be.set(We.key,I)}let he,xe=0;const lt=X-le+1;let pn=!1,ea=0;const Fn=new Array(lt);for(I=0;I=lt){Ae(We,C,k,!0);continue}let ht;if(We.key!=null)ht=be.get(We.key);else for(he=le;he<=X;he++)if(Fn[he-le]===0&&Jt(We,m[he])){ht=he;break}ht===void 0?Ae(We,C,k,!0):(Fn[ht-le]=I+1,ht>=ea?ea=ht:pn=!0,w(We,m[ht],E,null,C,k,j,$,N),xe++)}const ta=pn?_f(Fn):En;for(he=ta.length-1,I=lt-1;I>=0;I--){const We=le+I,ht=m[We],na=We+1{const{el:k,type:j,transition:$,children:N,shapeFlag:I}=h;if(I&6){je(h.component.subTree,m,E,L);return}if(I&128){h.suspense.move(m,E,L);return}if(I&64){j.move(h,m,E,V);return}if(j===Ke){r(k,m,E);for(let G=0;G$.enter(k),C);else{const{leave:G,delayLeave:X,afterLeave:ee}=$,le=()=>r(k,m,E),be=()=>{G(k,()=>{le(),ee&&ee()})};X?X(k,le,be):be()}else r(k,m,E)},Ae=(h,m,E,L=!1,C=!1)=>{const{type:k,props:j,ref:$,children:N,dynamicChildren:I,shapeFlag:Y,patchFlag:G,dirs:X}=h;if($!=null&&Hr($,null,E,h,!0),Y&256){m.ctx.deactivate(h);return}const ee=Y&1&&X,le=!qn(h);let be;if(le&&(be=j&&j.onVnodeBeforeUnmount)&&Xe(be,m,h),Y&6)It(h.component,E,L);else{if(Y&128){h.suspense.unmount(E,L);return}ee&&mt(h,null,m,"beforeUnmount"),Y&64?h.type.remove(h,m,E,C,V,L):I&&(k!==Ke||G>0&&G&64)?ke(I,m,E,!1,!0):(k===Ke&&G&384||!C&&Y&16)&&ke(N,m,E),L&&yt(h)}(le&&(be=j&&j.onVnodeUnmounted)||ee)&&Fe(()=>{be&&Xe(be,m,h),ee&&mt(h,null,m,"unmounted")},E)},yt=h=>{const{type:m,el:E,anchor:L,transition:C}=h;if(m===Ke){Ze(E,L);return}if(m===Zn){R(h);return}const k=()=>{o(E),C&&!C.persisted&&C.afterLeave&&C.afterLeave()};if(h.shapeFlag&1&&C&&!C.persisted){const{leave:j,delayLeave:$}=C,N=()=>j(E,k);$?$(h.el,k,N):N()}else k()},Ze=(h,m)=>{let E;for(;h!==m;)E=p(h),o(h),h=E;o(m)},It=(h,m,E)=>{const{bum:L,scope:C,update:k,subTree:j,um:$}=h;L&&co(L),C.stop(),k&&(k.active=!1,Ae(j,h,m,E)),$&&Fe($,m),Fe(()=>{h.isUnmounted=!0},m),m&&m.pendingBranch&&!m.isUnmounted&&h.asyncDep&&!h.asyncResolved&&h.suspenseId===m.pendingId&&(m.deps--,m.deps===0&&m.resolve())},ke=(h,m,E,L=!1,C=!1,k=0)=>{for(let j=k;jh.shapeFlag&6?P(h.component.subTree):h.shapeFlag&128?h.suspense.next():p(h.anchor||h.el),F=(h,m,E)=>{h==null?m._vnode&&Ae(m._vnode,null,null,!0):w(m._vnode||null,h,m,null,null,null,E),fa(),Vr(),m._vnode=h},V={p:w,um:Ae,m:je,r:yt,mt:q,mc:O,pc:te,pbc:z,n:P,o:e};let Z,ie;return t&&([Z,ie]=t(V)),{render:F,hydrate:Z,createApp:cf(F,Z)}}function Zt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function hi(e,t,n=!1){const r=e.children,o=t.children;if(J(r)&&J(o))for(let l=0;l>1,e[n[s]]0&&(t[r]=n[l-1]),n[l]=r)}}for(l=n.length,a=n[l-1];l-- >0;)n[l]=a,a=t[a];return n}const bf=e=>e.__isTeleport,Ke=Symbol.for("v-fgt"),kn=Symbol.for("v-txt"),_t=Symbol.for("v-cmt"),Zn=Symbol.for("v-stc"),Yn=[];let ct=null;function K2(e=!1){Yn.push(ct=e?null:[])}function yf(){Yn.pop(),ct=Yn[Yn.length-1]||null}let ar=1;function La(e){ar+=e}function Ef(e){return e.dynamicChildren=ar>0?ct||En:null,yf(),ar>0&&ct&&ct.push(e),e}function q2(e,t,n,r,o,l){return Ef(gi(e,t,n,r,o,l,!0))}function zo(e){return e?e.__v_isVNode===!0:!1}function Jt(e,t){return e.type===t.type&&e.key===t.key}const Qr="__vInternal",mi=({key:e})=>e??null,Sr=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?pe(e)||Se(e)||ne(e)?{i:Qe,r:e,k:t,f:!!n}:e:null);function gi(e,t=null,n=null,r=0,o=null,l=e===Ke?0:1,a=!1,s=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&mi(t),ref:t&&Sr(t),scopeId:Js,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:l,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Qe};return s?(Pl(c,n),l&128&&e.normalize(c)):n&&(c.shapeFlag|=pe(n)?8:16),ar>0&&!a&&ct&&(c.patchFlag>0||l&6)&&c.patchFlag!==32&&ct.push(c),c}const De=wf;function wf(e,t=null,n=null,r=0,o=null,l=!1){if((!e||e===Qd)&&(e=_t),zo(e)){const s=zt(e,t,!0);return n&&Pl(s,n),ar>0&&!l&&ct&&(s.shapeFlag&6?ct[ct.indexOf(e)]=s:ct.push(s)),s.patchFlag|=-2,s}if(Sf(e)&&(e=e.__vccOpts),t){t=Tf(t);let{class:s,style:c}=t;s&&!pe(s)&&(t.class=dl(s)),Le(c)&&(Ws(c)&&!J(c)&&(c=Ce({},c)),t.style=ul(c))}const a=pe(e)?1:Fd(e)?128:bf(e)?64:Le(e)?4:ne(e)?2:0;return gi(e,t,n,r,o,a,l,!0)}function Tf(e){return e?Ws(e)||Qr in e?Ce({},e):e:null}function zt(e,t,n=!1){const{props:r,ref:o,patchFlag:l,children:a}=e,s=t?Lf(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:s,key:s&&mi(s),ref:t&&t.ref?n&&o?J(o)?o.concat(Sr(t)):[o,Sr(t)]:Sr(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ke?l===-1?16:l|16:l,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&zt(e.ssContent),ssFallback:e.ssFallback&&zt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function _i(e=" ",t=0){return De(kn,null,e,t)}function G2(e,t){const n=De(Zn,null,e);return n.staticCount=t,n}function st(e){return e==null||typeof e=="boolean"?De(_t):J(e)?De(Ke,null,e.slice()):typeof e=="object"?Vt(e):De(kn,null,String(e))}function Vt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:zt(e)}function Pl(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(J(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),Pl(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(Qr in t)?t._ctx=Qe:o===3&&Qe&&(Qe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ne(t)?(t={default:t,_ctx:Qe},n=32):(t=String(t),r&64?(n=16,t=[_i(t)]):n=8);e.children=t,e.shapeFlag|=n}function Lf(...e){const t={};for(let n=0;nRe||Qe;let Cl,vn,Oa="__VUE_INSTANCE_SETTERS__";(vn=Do()[Oa])||(vn=Do()[Oa]=[]),vn.push(e=>Re=e),Cl=e=>{vn.length>1?vn.forEach(t=>t(e)):vn[0](e)};const xn=e=>{Cl(e),e.scope.on()},rn=()=>{Re&&Re.scope.off(),Cl(null)};function bi(e){return e.vnode.shapeFlag&4}let In=!1;function Cf(e,t=!1){In=t;const{props:n,children:r}=e.vnode,o=bi(e);uf(e,n,o,t),pf(e,r);const l=o?kf(e,t):void 0;return In=!1,l}function kf(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Us(new Proxy(e.ctx,tf));const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?If(e):null;xn(e),Mn();const l=Ht(r,e,0,[e.props,o]);if(Vn(),rn(),xs(l)){if(l.then(rn,rn),t)return l.then(a=>{Aa(e,a,t)}).catch(a=>{dr(a,e,0)});e.asyncDep=l}else Aa(e,l,t)}else yi(e,t)}function Aa(e,t,n){ne(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Le(t)&&(e.setupState=qs(t)),yi(e,n)}let Pa;function yi(e,t,n){const r=e.type;if(!e.render){if(!t&&Pa&&!r.render){const o=r.template||Ol(e).template;if(o){const{isCustomElement:l,compilerOptions:a}=e.appContext.config,{delimiters:s,compilerOptions:c}=r,u=Ce(Ce({isCustomElement:l,delimiters:s},a),c);r.render=Pa(o,u)}}e.render=r.render||ut}xn(e),Mn(),nf(e),Vn(),rn()}function xf(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return ze(e,"get","$attrs"),t[n]}}))}function If(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return xf(e)},slots:e.slots,emit:e.emit,expose:t}}function kl(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(qs(Us(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Gn)return Gn[n](e)},has(t,n){return n in t||n in Gn}}))}function Rf(e,t=!0){return ne(e)?e.displayName||e.name:e.name||t&&e.__name}function Sf(e){return ne(e)&&"__vccOpts"in e}const A=(e,t)=>Cd(e,t,In);function d(e,t,n){const r=arguments.length;return r===2?Le(t)&&!J(t)?zo(t)?De(e,null,[t]):De(e,t):De(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&zo(n)&&(n=[n]),De(e,t,n))}const Df=Symbol.for("v-scx"),$f=()=>ye(Df),Mf="3.3.4",Vf="http://www.w3.org/2000/svg",Qt=typeof document<"u"?document:null,Ca=Qt&&Qt.createElement("template"),Nf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?Qt.createElementNS(Vf,e):Qt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Qt.createTextNode(e),createComment:e=>Qt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Qt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,l){const a=n?n.previousSibling:t.lastChild;if(o&&(o===l||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===l||!(o=o.nextSibling)););else{Ca.innerHTML=r?`${e}`:e;const s=Ca.content;if(r){const c=s.firstChild;for(;c.firstChild;)s.appendChild(c.firstChild);s.removeChild(c)}t.insertBefore(s,n)}return[a?a.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function jf(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function Ff(e,t,n){const r=e.style,o=pe(n);if(n&&!o){if(t&&!pe(t))for(const l in t)n[l]==null&&Wo(r,l,"");for(const l in n)Wo(r,l,n[l])}else{const l=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=l)}}const ka=/\s*!important$/;function Wo(e,t,n){if(J(n))n.forEach(r=>Wo(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Hf(e,t);ka.test(n)?e.setProperty($n(r),n.replace(ka,""),"important"):e[r]=n}}const xa=["Webkit","Moz","ms"],ho={};function Hf(e,t){const n=ho[t];if(n)return n;let r=tt(t);if(r!=="filter"&&r in e)return ho[t]=r;r=cr(r);for(let o=0;omo||(Gf.then(()=>mo=0),mo=Date.now());function Yf(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;et(Xf(r,n.value),t,5,[r])};return n.value=e,n.attached=Zf(),n}function Xf(e,t){if(J(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const Sa=/^on[a-z]/,Jf=(e,t,n,r,o=!1,l,a,s,c)=>{t==="class"?jf(e,r,o):t==="style"?Ff(e,n,r):ir(t)?al(t)||Kf(e,t,n,r,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Qf(e,t,r,o))?zf(e,t,r,l,a,s,c):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Bf(e,t,r,o))};function Qf(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&Sa.test(t)&&ne(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||Sa.test(t)&&pe(n)?!1:t in e}const Dt="transition",Hn="animation",Wt=(e,{slots:t})=>d(zd,wi(e),t);Wt.displayName="Transition";const Ei={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},ep=Wt.props=Ce({},ri,Ei),Yt=(e,t=[])=>{J(e)?e.forEach(n=>n(...t)):e&&e(...t)},Da=e=>e?J(e)?e.some(t=>t.length>1):e.length>1:!1;function wi(e){const t={};for(const W in e)W in Ei||(t[W]=e[W]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:l=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:s=`${n}-enter-to`,appearFromClass:c=l,appearActiveClass:u=a,appearToClass:i=s,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,_=tp(o),w=_&&_[0],T=_&&_[1],{onBeforeEnter:g,onEnter:y,onEnterCancelled:D,onLeave:R,onLeaveCancelled:U,onBeforeAppear:x=g,onAppear:M=y,onAppearCancelled:O=D}=t,B=(W,Q,q)=>{Mt(W,Q?i:s),Mt(W,Q?u:a),q&&q()},z=(W,Q)=>{W._isLeaving=!1,Mt(W,f),Mt(W,v),Mt(W,p),Q&&Q()},re=W=>(Q,q)=>{const we=W?M:y,oe=()=>B(Q,W,q);Yt(we,[Q,oe]),$a(()=>{Mt(Q,W?c:l),wt(Q,W?i:s),Da(we)||Ma(Q,r,w,oe)})};return Ce(t,{onBeforeEnter(W){Yt(g,[W]),wt(W,l),wt(W,a)},onBeforeAppear(W){Yt(x,[W]),wt(W,c),wt(W,u)},onEnter:re(!1),onAppear:re(!0),onLeave(W,Q){W._isLeaving=!0;const q=()=>z(W,Q);wt(W,f),Li(),wt(W,p),$a(()=>{W._isLeaving&&(Mt(W,f),wt(W,v),Da(R)||Ma(W,r,T,q))}),Yt(R,[W,q])},onEnterCancelled(W){B(W,!1),Yt(D,[W])},onAppearCancelled(W){B(W,!0),Yt(O,[W])},onLeaveCancelled(W){z(W),Yt(U,[W])}})}function tp(e){if(e==null)return null;if(Le(e))return[go(e.enter),go(e.leave)];{const t=go(e);return[t,t]}}function go(e){return Vu(e)}function wt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Mt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function $a(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let np=0;function Ma(e,t,n,r){const o=e._endId=++np,l=()=>{o===e._endId&&r()};if(n)return setTimeout(l,n);const{type:a,timeout:s,propCount:c}=Ti(e,t);if(!a)return r();const u=a+"end";let i=0;const f=()=>{e.removeEventListener(u,p),l()},p=v=>{v.target===e&&++i>=c&&f()};setTimeout(()=>{i(n[_]||"").split(", "),o=r(`${Dt}Delay`),l=r(`${Dt}Duration`),a=Va(o,l),s=r(`${Hn}Delay`),c=r(`${Hn}Duration`),u=Va(s,c);let i=null,f=0,p=0;t===Dt?a>0&&(i=Dt,f=a,p=l.length):t===Hn?u>0&&(i=Hn,f=u,p=c.length):(f=Math.max(a,u),i=f>0?a>u?Dt:Hn:null,p=i?i===Dt?l.length:c.length:0);const v=i===Dt&&/\b(transform|all)(,|$)/.test(r(`${Dt}Property`).toString());return{type:i,timeout:f,propCount:p,hasTransform:v}}function Va(e,t){for(;e.lengthNa(n)+Na(e[r])))}function Na(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function Li(){return document.body.offsetHeight}const Oi=new WeakMap,Ai=new WeakMap,Pi={name:"TransitionGroup",props:Ce({},ep,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=sn(),r=ni();let o,l;return ai(()=>{if(!o.length)return;const a=e.moveClass||`${e.name||"v"}-move`;if(!ip(o[0].el,n.vnode.el,a))return;o.forEach(lp),o.forEach(ap);const s=o.filter(sp);Li(),s.forEach(c=>{const u=c.el,i=u.style;wt(u,a),i.transform=i.webkitTransform=i.transitionDuration="";const f=u._moveCb=p=>{p&&p.target!==u||(!p||/transform$/.test(p.propertyName))&&(u.removeEventListener("transitionend",f),u._moveCb=null,Mt(u,a))};u.addEventListener("transitionend",f)})}),()=>{const a=se(e),s=wi(a);let c=a.tag||Ke;o=l,l=t.default?Tl(t.default()):[];for(let u=0;udelete e.mode;Pi.props;const op=Pi;function lp(e){const t=e.el;t._moveCb&&t._moveCb(),t._enterCb&&t._enterCb()}function ap(e){Ai.set(e,e.el.getBoundingClientRect())}function sp(e){const t=Oi.get(e),n=Ai.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const l=e.el.style;return l.transform=l.webkitTransform=`translate(${r}px,${o}px)`,l.transitionDuration="0s",e}}function ip(e,t,n){const r=e.cloneNode();e._vtc&&e._vtc.forEach(a=>{a.split(/\s+/).forEach(s=>s&&r.classList.remove(s))}),n.split(/\s+/).forEach(a=>a&&r.classList.add(a)),r.style.display="none";const o=t.nodeType===1?t:t.parentNode;o.appendChild(r);const{hasTransform:l}=Ti(r);return o.removeChild(r),l}const cp=Ce({patchProp:Jf},Nf);let _o,ja=!1;function up(){return _o=ja?_o:mf(cp),ja=!0,_o}const dp=(...e)=>{const t=up().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=fp(r);if(o)return n(o,!0,o instanceof SVGElement)},t};function fp(e){return pe(e)?document.querySelector(e):e}const pp={"v-8daa1a0e":()=>b(()=>import("./index.html-9b9b4158.js"),[]).then(({data:e})=>e),"v-495a303e":()=>b(()=>import("./index.html-d9f41dac.js"),[]).then(({data:e})=>e),"v-7f4aff48":()=>b(()=>import("./index.html-308b9cfb.js"),[]).then(({data:e})=>e),"v-50b2c6d0":()=>b(()=>import("./index.html-55ed2560.js"),[]).then(({data:e})=>e),"v-26c7c346":()=>b(()=>import("./changelog.html-fca83de8.js"),[]).then(({data:e})=>e),"v-7554a597":()=>b(()=>import("./contributing.html-3080332f.js"),[]).then(({data:e})=>e),"v-1605c99e":()=>b(()=>import("./guidelines.html-4ae07334.js"),[]).then(({data:e})=>e),"v-f6ea7b76":()=>b(()=>import("./package-structure.html-443c8c9c.js"),[]).then(({data:e})=>e),"v-2ff4a912":()=>b(()=>import("./versioning.html-fbe8ba14.js"),[]).then(({data:e})=>e),"v-974caada":()=>b(()=>import("./index.html-fe59353c.js"),[]).then(({data:e})=>e),"v-174d6e92":()=>b(()=>import("./api.html-a4c0141d.js"),[]).then(({data:e})=>e),"v-cabbab28":()=>b(()=>import("./index.html-897ccc9a.js"),[]).then(({data:e})=>e),"v-4b7a327c":()=>b(()=>import("./file-formats.html-e7dbacd9.js"),[]).then(({data:e})=>e),"v-0669fc14":()=>b(()=>import("./overview.html-6ab61eb2.js"),[]).then(({data:e})=>e),"v-142be2c4":()=>b(()=>import("./serializers.html-fdbca821.js"),[]).then(({data:e})=>e),"v-4ce5761f":()=>b(()=>import("./task-list.html-137e9390.js"),[]).then(({data:e})=>e),"v-6cca6f5b":()=>b(()=>import("./index.html-803489df.js"),[]).then(({data:e})=>e),"v-35faf283":()=>b(()=>import("./docs.html-205e1811.js"),[]).then(({data:e})=>e),"v-23d1f10b":()=>b(()=>import("./technical-links.html-9084e979.js"),[]).then(({data:e})=>e),"v-6f27bb46":()=>b(()=>import("./index.html-6b27342d.js"),[]).then(({data:e})=>e),"v-14742194":()=>b(()=>import("./ci.html-83409b0c.js"),[]).then(({data:e})=>e),"v-9e17fb70":()=>b(()=>import("./debugging.html-a2143ec3.js"),[]).then(({data:e})=>e),"v-41f63175":()=>b(()=>import("./tests.html-c5c1daf8.js"),[]).then(({data:e})=>e),"v-6df5895a":()=>b(()=>import("./index.html-590bd862.js"),[]).then(({data:e})=>e),"v-0912a191":()=>b(()=>import("./adding-icons.html-f24fcef0.js"),[]).then(({data:e})=>e),"v-3b749041":()=>b(()=>import("./developing-ui-css.html-60144fe3.js"),[]).then(({data:e})=>e),"v-680c4ad5":()=>b(()=>import("./developing-ui-forms.html-44a4abad.js"),[]).then(({data:e})=>e),"v-79cd1776":()=>b(()=>import("./developing-ui-js.html-a314c253.js"),[]).then(({data:e})=>e),"v-286ba437":()=>b(()=>import("./developing-ui.html-ead98d81.js"),[]).then(({data:e})=>e),"v-0aeb53ac":()=>b(()=>import("./html-popups.html-fca1dc9e.js"),[]).then(({data:e})=>e),"v-23b84093":()=>b(()=>import("./index.html-d6c2101f.js"),[]).then(({data:e})=>e),"v-7d2e6031":()=>b(()=>import("./install.html-fee49c8c.js"),[]).then(({data:e})=>e),"v-da6c54ee":()=>b(()=>import("./ui-layout.html-225dd165.js"),[]).then(({data:e})=>e),"v-dc289a5c":()=>b(()=>import("./ui.html-aeff420e.js"),[]).then(({data:e})=>e),"v-3aecceec":()=>b(()=>import("./uninstall.html-b31faa15.js"),[]).then(({data:e})=>e),"v-97a4d760":()=>b(()=>import("./upgrade.html-e805da86.js"),[]).then(({data:e})=>e),"v-79352e7b":()=>b(()=>import("./index.html-b9ee809f.js"),[]).then(({data:e})=>e),"v-b753c16a":()=>b(()=>import("./articles-and-presentations.html-da5d93f1.js"),[]).then(({data:e})=>e),"v-8ffe8b28":()=>b(()=>import("./logos.html-162bb7f0.js"),[]).then(({data:e})=>e),"v-b4d4656a":()=>b(()=>import("./regular-backup.html-8acf0655.js"),[]).then(({data:e})=>e),"v-5c3b6510":()=>b(()=>import("./saplink.html-6b1a2306.js"),[]).then(({data:e})=>e),"v-b86e8c0a":()=>b(()=>import("./where-used.html-450401fa.js"),[]).then(({data:e})=>e),"v-c774b90c":()=>b(()=>import("./xml-mismatch.html-f032586f.js"),[]).then(({data:e})=>e),"v-52841e19":()=>b(()=>import("./index.html-31ff22f4.js"),[]).then(({data:e})=>e),"v-741130c0":()=>b(()=>import("./index.html-6920104c.js"),[]).then(({data:e})=>e),"v-0de740f9":()=>b(()=>import("./abap-language-version.html-c24cf374.js"),[]).then(({data:e})=>e),"v-088182bf":()=>b(()=>import("./apack.html-5c6a9fb4.js"),[]).then(({data:e})=>e),"v-4959a65f":()=>b(()=>import("./authorizations.html-f35033f9.js"),[]).then(({data:e})=>e),"v-72455036":()=>b(()=>import("./database-util.html-3f1e5915.js"),[]).then(({data:e})=>e),"v-4bc4da84":()=>b(()=>import("./exits.html-75a7360f.js"),[]).then(({data:e})=>e),"v-43980e6a":()=>b(()=>import("./flow.html-ccffb026.js"),[]).then(({data:e})=>e),"v-78e86c96":()=>b(()=>import("./folders-filenames.html-2b163229.js"),[]).then(({data:e})=>e),"v-71ce9558":()=>b(()=>import("./hotkeys.html-8b36de00.js"),[]).then(({data:e})=>e),"v-252f2d9f":()=>b(()=>import("./icons.html-154106d3.js"),[]).then(({data:e})=>e),"v-3914cc7e":()=>b(()=>import("./namespaces.html-00d9e871.js"),[]).then(({data:e})=>e),"v-1d61fcf8":()=>b(()=>import("./note-analyzer.html-164b616a.js"),[]).then(({data:e})=>e),"v-47821728":()=>b(()=>import("./packages.html-f02402e5.js"),[]).then(({data:e})=>e),"v-f51e8eea":()=>b(()=>import("./supported.html-1a5d1199.js"),[]).then(({data:e})=>e),"v-ec7a72d2":()=>b(()=>import("./translations.html-59a405ca.js"),[]).then(({data:e})=>e),"v-01e98f2d":()=>b(()=>import("./index.html-189dc5d5.js"),[]).then(({data:e})=>e),"v-d7ac3c38":()=>b(()=>import("./background-mode.html-75123a5b.js"),[]).then(({data:e})=>e),"v-17c01b88":()=>b(()=>import("./dot-abapgit.html-10b2e95c.js"),[]).then(({data:e})=>e),"v-ac98f18a":()=>b(()=>import("./local.html-66891a46.js"),[]).then(({data:e})=>e),"v-0be4b1f4":()=>b(()=>import("./remote.html-24ea83d4.js"),[]).then(({data:e})=>e),"v-6651c287":()=>b(()=>import("./stats.html-7906d7bc.js"),[]).then(({data:e})=>e),"v-7f3ae0ae":()=>b(()=>import("./index.html-a007e1b8.js"),[]).then(({data:e})=>e),"v-43307cf2":()=>b(()=>import("./sapgui.html-96daaaed.js"),[]).then(({data:e})=>e),"v-218e7a1a":()=>b(()=>import("./settings-global.html-12660f12.js"),[]).then(({data:e})=>e),"v-d7087ec6":()=>b(()=>import("./settings-personal.html-9ca63b6f.js"),[]).then(({data:e})=>e),"v-b4e259ea":()=>b(()=>import("./ssl-setup.html-de1aa0b4.js"),[]).then(({data:e})=>e),"v-362eb318":()=>b(()=>import("./ssl-test.html-f015a542.js"),[]).then(({data:e})=>e),"v-3e76b876":()=>b(()=>import("./index.html-4cd63ea8.js"),[]).then(({data:e})=>e),"v-7bddc9ec":()=>b(()=>import("./export-zip.html-61c11160.js"),[]).then(({data:e})=>e),"v-3ad8b04d":()=>b(()=>import("./import-rfc.html-a1eb0300.js"),[]).then(({data:e})=>e),"v-2ec3c91b":()=>b(()=>import("./import-zip.html-f068cd5e.js"),[]).then(({data:e})=>e),"v-49558863":()=>b(()=>import("./install.html-790d4438.js"),[]).then(({data:e})=>e),"v-6a30cffa":()=>b(()=>import("./index.html-668975ce.js"),[]).then(({data:e})=>e),"v-fd49d704":()=>b(()=>import("./authentication.html-e8bc75fd.js"),[]).then(({data:e})=>e),"v-c87ae4e8":()=>b(()=>import("./contributing.html-a00e311e.js"),[]).then(({data:e})=>e),"v-755a2ac0":()=>b(()=>import("./first-project.html-8e904f05.js"),[]).then(({data:e})=>e),"v-9333e0be":()=>b(()=>import("./install.html-e7b99895.js"),[]).then(({data:e})=>e),"v-aa70c2e2":()=>b(()=>import("./moving-package.html-0a98281b.js"),[]).then(({data:e})=>e),"v-d3eccfe0":()=>b(()=>import("./stage-commit.html-02ecf59b.js"),[]).then(({data:e})=>e),"v-c9cf1466":()=>b(()=>import("./update.html-876754d3.js"),[]).then(({data:e})=>e),"v-5a4f9bf2":()=>b(()=>import("./index.html-d3fe7e49.js"),[]).then(({data:e})=>e),"v-c7dbbcae":()=>b(()=>import("./uninstall.html-2610c469.js"),[]).then(({data:e})=>e),"v-3706649a":()=>b(()=>import("./404.html-e98d903c.js"),[]).then(({data:e})=>e)},vp=JSON.parse('{"base":"/","lang":"en-US","title":"","description":"","head":[["link",{"rel":"icon","href":"/favicon.svg"}]],"locales":{"/":{"lang":"en-US","title":"abapGit Docs","description":"A git client for ABAP developed in ABAP"}}}');var hp=([e,t,n])=>e==="meta"&&t.name?`${e}.${t.name}`:["title","base"].includes(e)?e:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,t,n]),mp=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=hp(r);t.has(o)||(t.add(o),n.push(r))}),n},gp=e=>e[e.length-1]==="/"||e.endsWith(".html")?e:`${e}/`,_p=e=>e.startsWith("ftp://"),Nn=e=>/^(https?:)?\/\//.test(e),bp=/.md((\?|#).*)?$/,Br=(e,t="/")=>!!(Nn(e)||_p(e)||e.startsWith("/")&&!e.startsWith(t)&&!bp.test(e)),Ci=e=>/^mailto:/.test(e),yp=e=>/^tel:/.test(e),eo=e=>Object.prototype.toString.call(e)==="[object Object]",xl=e=>e[e.length-1]==="/"?e.slice(0,-1):e,ki=e=>e[0]==="/"?e.slice(1):e,Ep=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const l=o.split("/").length-r.split("/").length;return l!==0?l:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"};const xi={"v-8daa1a0e":S(()=>b(()=>import("./index.html-0c323aca.js"),["assets/index.html-0c323aca.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-495a303e":S(()=>b(()=>import("./index.html-261c87a0.js"),["assets/index.html-261c87a0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7f4aff48":S(()=>b(()=>import("./index.html-e0f0bc99.js"),["assets/index.html-e0f0bc99.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-50b2c6d0":S(()=>b(()=>import("./index.html-8e63b2e4.js"),["assets/index.html-8e63b2e4.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-26c7c346":S(()=>b(()=>import("./changelog.html-d3f756be.js"),["assets/changelog.html-d3f756be.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7554a597":S(()=>b(()=>import("./contributing.html-d41de470.js"),["assets/contributing.html-d41de470.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1605c99e":S(()=>b(()=>import("./guidelines.html-66ba59a4.js"),["assets/guidelines.html-66ba59a4.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-f6ea7b76":S(()=>b(()=>import("./package-structure.html-b517fac7.js"),["assets/package-structure.html-b517fac7.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2ff4a912":S(()=>b(()=>import("./versioning.html-68b8ce5d.js"),["assets/versioning.html-68b8ce5d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-974caada":S(()=>b(()=>import("./index.html-d8614121.js"),["assets/index.html-d8614121.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-174d6e92":S(()=>b(()=>import("./api.html-fc302536.js"),["assets/api.html-fc302536.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-cabbab28":S(()=>b(()=>import("./index.html-ed588135.js"),["assets/index.html-ed588135.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4b7a327c":S(()=>b(()=>import("./file-formats.html-e8dfb6bb.js"),["assets/file-formats.html-e8dfb6bb.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0669fc14":S(()=>b(()=>import("./overview.html-db7a0ee2.js"),["assets/overview.html-db7a0ee2.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-142be2c4":S(()=>b(()=>import("./serializers.html-2cf89831.js"),["assets/serializers.html-2cf89831.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4ce5761f":S(()=>b(()=>import("./task-list.html-9040eaa7.js"),["assets/task-list.html-9040eaa7.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6cca6f5b":S(()=>b(()=>import("./index.html-4197723e.js"),["assets/index.html-4197723e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-35faf283":S(()=>b(()=>import("./docs.html-f7b2d2f1.js"),["assets/docs.html-f7b2d2f1.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-23d1f10b":S(()=>b(()=>import("./technical-links.html-25a2fa05.js"),["assets/technical-links.html-25a2fa05.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6f27bb46":S(()=>b(()=>import("./index.html-aacd41d3.js"),["assets/index.html-aacd41d3.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-14742194":S(()=>b(()=>import("./ci.html-8f4170b0.js"),["assets/ci.html-8f4170b0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-9e17fb70":S(()=>b(()=>import("./debugging.html-3f1a704d.js"),["assets/debugging.html-3f1a704d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-41f63175":S(()=>b(()=>import("./tests.html-2284ef11.js"),["assets/tests.html-2284ef11.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6df5895a":S(()=>b(()=>import("./index.html-775b3d41.js"),["assets/index.html-775b3d41.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0912a191":S(()=>b(()=>import("./adding-icons.html-79bca7fa.js"),["assets/adding-icons.html-79bca7fa.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3b749041":S(()=>b(()=>import("./developing-ui-css.html-f3518ed2.js"),["assets/developing-ui-css.html-f3518ed2.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-680c4ad5":S(()=>b(()=>import("./developing-ui-forms.html-92b916b9.js"),["assets/developing-ui-forms.html-92b916b9.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-79cd1776":S(()=>b(()=>import("./developing-ui-js.html-9dddb9f0.js"),["assets/developing-ui-js.html-9dddb9f0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-286ba437":S(()=>b(()=>import("./developing-ui.html-01561f6a.js"),["assets/developing-ui.html-01561f6a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0aeb53ac":S(()=>b(()=>import("./html-popups.html-8c3b469d.js"),["assets/html-popups.html-8c3b469d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-23b84093":S(()=>b(()=>import("./index.html-7892354e.js"),["assets/index.html-7892354e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7d2e6031":S(()=>b(()=>import("./install.html-85063196.js"),["assets/install.html-85063196.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-da6c54ee":S(()=>b(()=>import("./ui-layout.html-8e27960e.js"),["assets/ui-layout.html-8e27960e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-dc289a5c":S(()=>b(()=>import("./ui.html-aa6f8d2c.js"),["assets/ui.html-aa6f8d2c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3aecceec":S(()=>b(()=>import("./uninstall.html-e0945f9d.js"),["assets/uninstall.html-e0945f9d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-97a4d760":S(()=>b(()=>import("./upgrade.html-43e0e093.js"),["assets/upgrade.html-43e0e093.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-79352e7b":S(()=>b(()=>import("./index.html-9733982d.js"),["assets/index.html-9733982d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b753c16a":S(()=>b(()=>import("./articles-and-presentations.html-c2183059.js"),["assets/articles-and-presentations.html-c2183059.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8ffe8b28":S(()=>b(()=>import("./logos.html-87e56dd4.js"),["assets/logos.html-87e56dd4.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b4d4656a":S(()=>b(()=>import("./regular-backup.html-86420771.js"),["assets/regular-backup.html-86420771.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5c3b6510":S(()=>b(()=>import("./saplink.html-cea71812.js"),["assets/saplink.html-cea71812.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b86e8c0a":S(()=>b(()=>import("./where-used.html-dbc081d0.js"),["assets/where-used.html-dbc081d0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c774b90c":S(()=>b(()=>import("./xml-mismatch.html-c426850b.js"),["assets/xml-mismatch.html-c426850b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-52841e19":S(()=>b(()=>import("./index.html-698bfb7e.js"),["assets/index.html-698bfb7e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-741130c0":S(()=>b(()=>import("./index.html-67a41780.js"),["assets/index.html-67a41780.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0de740f9":S(()=>b(()=>import("./abap-language-version.html-1ef9f5b7.js"),["assets/abap-language-version.html-1ef9f5b7.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-088182bf":S(()=>b(()=>import("./apack.html-fddc446d.js"),["assets/apack.html-fddc446d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4959a65f":S(()=>b(()=>import("./authorizations.html-8a7879f1.js"),["assets/authorizations.html-8a7879f1.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-72455036":S(()=>b(()=>import("./database-util.html-0c536070.js"),["assets/database-util.html-0c536070.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4bc4da84":S(()=>b(()=>import("./exits.html-15ba0858.js"),["assets/exits.html-15ba0858.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-43980e6a":S(()=>b(()=>import("./flow.html-1b168949.js"),["assets/flow.html-1b168949.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-78e86c96":S(()=>b(()=>import("./folders-filenames.html-14186c01.js"),["assets/folders-filenames.html-14186c01.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-71ce9558":S(()=>b(()=>import("./hotkeys.html-9035bc05.js"),["assets/hotkeys.html-9035bc05.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-252f2d9f":S(()=>b(()=>import("./icons.html-4d2f99b9.js"),["assets/icons.html-4d2f99b9.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3914cc7e":S(()=>b(()=>import("./namespaces.html-54347e83.js"),["assets/namespaces.html-54347e83.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1d61fcf8":S(()=>b(()=>import("./note-analyzer.html-440d4ac5.js"),["assets/note-analyzer.html-440d4ac5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-47821728":S(()=>b(()=>import("./packages.html-b042f490.js"),["assets/packages.html-b042f490.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-f51e8eea":S(()=>b(()=>import("./supported.html-1be30fc9.js"),["assets/supported.html-1be30fc9.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-ec7a72d2":S(()=>b(()=>import("./translations.html-126c2f9e.js"),["assets/translations.html-126c2f9e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-01e98f2d":S(()=>b(()=>import("./index.html-d434c730.js"),["assets/index.html-d434c730.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d7ac3c38":S(()=>b(()=>import("./background-mode.html-5c3440ff.js"),["assets/background-mode.html-5c3440ff.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-17c01b88":S(()=>b(()=>import("./dot-abapgit.html-6151eebf.js"),["assets/dot-abapgit.html-6151eebf.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-ac98f18a":S(()=>b(()=>import("./local.html-c060560d.js"),["assets/local.html-c060560d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0be4b1f4":S(()=>b(()=>import("./remote.html-31209e23.js"),["assets/remote.html-31209e23.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6651c287":S(()=>b(()=>import("./stats.html-46d936f6.js"),["assets/stats.html-46d936f6.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7f3ae0ae":S(()=>b(()=>import("./index.html-0168c23e.js"),["assets/index.html-0168c23e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-43307cf2":S(()=>b(()=>import("./sapgui.html-d6ac0358.js"),["assets/sapgui.html-d6ac0358.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-218e7a1a":S(()=>b(()=>import("./settings-global.html-51bb3e3a.js"),["assets/settings-global.html-51bb3e3a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d7087ec6":S(()=>b(()=>import("./settings-personal.html-5e38f8ef.js"),["assets/settings-personal.html-5e38f8ef.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b4e259ea":S(()=>b(()=>import("./ssl-setup.html-f6f44222.js"),["assets/ssl-setup.html-f6f44222.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-362eb318":S(()=>b(()=>import("./ssl-test.html-9607c9ac.js"),["assets/ssl-test.html-9607c9ac.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3e76b876":S(()=>b(()=>import("./index.html-be7929f2.js"),["assets/index.html-be7929f2.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7bddc9ec":S(()=>b(()=>import("./export-zip.html-9745f092.js"),["assets/export-zip.html-9745f092.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3ad8b04d":S(()=>b(()=>import("./import-rfc.html-e4db9a79.js"),["assets/import-rfc.html-e4db9a79.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2ec3c91b":S(()=>b(()=>import("./import-zip.html-f10737b0.js"),["assets/import-zip.html-f10737b0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-49558863":S(()=>b(()=>import("./install.html-748ce29e.js"),["assets/install.html-748ce29e.js","assets/start-b8c8f9c6.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6a30cffa":S(()=>b(()=>import("./index.html-88c1c4b9.js"),["assets/index.html-88c1c4b9.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-fd49d704":S(()=>b(()=>import("./authentication.html-91487af7.js"),["assets/authentication.html-91487af7.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c87ae4e8":S(()=>b(()=>import("./contributing.html-aa12c40d.js"),["assets/contributing.html-aa12c40d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-755a2ac0":S(()=>b(()=>import("./first-project.html-a45fd0af.js"),["assets/first-project.html-a45fd0af.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-9333e0be":S(()=>b(()=>import("./install.html-27321855.js"),["assets/install.html-27321855.js","assets/start-b8c8f9c6.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-aa70c2e2":S(()=>b(()=>import("./moving-package.html-eca08bc8.js"),["assets/moving-package.html-eca08bc8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d3eccfe0":S(()=>b(()=>import("./stage-commit.html-f91ff3c5.js"),["assets/stage-commit.html-f91ff3c5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c9cf1466":S(()=>b(()=>import("./update.html-57ecfc7f.js"),["assets/update.html-57ecfc7f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5a4f9bf2":S(()=>b(()=>import("./index.html-bb562ad7.js"),["assets/index.html-bb562ad7.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c7dbbcae":S(()=>b(()=>import("./uninstall.html-cab900e7.js"),["assets/uninstall.html-cab900e7.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3706649a":S(()=>b(()=>import("./404.html-812c7b8f.js"),["assets/404.html-812c7b8f.js","assets/plugin-vue_export-helper-c27b6911.js"]))};var wp=Symbol(""),Tp=K(pp),Ii=ln({key:"",path:"",title:"",lang:"",frontmatter:{},headers:[]}),Nt=K(Ii),ge=()=>Nt,Ri=Symbol(""),Ie=()=>{const e=ye(Ri);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},Si=Symbol(""),Lp=()=>{const e=ye(Si);if(!e)throw new Error("usePageHead() is called without provider.");return e},Op=Symbol(""),Di=Symbol(""),$i=()=>{const e=ye(Di);if(!e)throw new Error("usePageLang() is called without provider.");return e},Mi=Symbol(""),Ap=()=>{const e=ye(Mi);if(!e)throw new Error("usePageLayout() is called without provider.");return e},Il=Symbol(""),cn=()=>{const e=ye(Il);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},_n=K(vp),Pp=()=>_n,Vi=Symbol(""),to=()=>{const e=ye(Vi);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},Cp=Symbol(""),kp="Layout",xp="NotFound",Tt=ur({resolveLayouts:e=>e.reduce((t,n)=>({...t,...n.layouts}),{}),resolvePageData:async e=>{const t=Tp.value[e];return await(t==null?void 0:t())??Ii},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const r=pe(t.description)?t.description:n.description,o=[...J(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:r}]];return mp(o)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||"en-US",resolvePageLayout:(e,t)=>{let n;if(e.path){const r=e.frontmatter.layout;pe(r)?n=r:n=kp}else n=xp;return t[n]},resolveRouteLocale:(e,t)=>Ep(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),no=H({name:"ClientOnly",setup(e,t){const n=K(!1);return de(()=>{n.value=!0}),()=>{var r,o;return n.value?(o=(r=t.slots).default)==null?void 0:o.call(r):null}}}),Rl=H({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=ge(),n=A(()=>xi[e.pageKey||t.value.key]);return()=>n.value?d(n.value):d("div","404 Not Found")}}),pt=(e={})=>e,He=e=>Nn(e)?e:`/${ki(e)}`;const Ip={};/*!
    +const Ou="modulepreload",Au=function(e){return"/"+e},ra={},b=function(t,n,r){if(!n||n.length===0)return t();const o=document.getElementsByTagName("link");return Promise.all(n.map(l=>{if(l=Au(l),l in ra)return;ra[l]=!0;const a=l.endsWith(".css"),s=a?'[rel="stylesheet"]':"";if(!!r)for(let i=o.length-1;i>=0;i--){const f=o[i];if(f.href===l&&(!a||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${l}"]${s}`))return;const u=document.createElement("link");if(u.rel=a?"stylesheet":Ou,a||(u.as="script",u.crossOrigin=""),u.href=l,document.head.appendChild(u),a)return new Promise((i,f)=>{u.addEventListener("load",i),u.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${l}`)))})})).then(()=>t()).catch(l=>{const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=l,window.dispatchEvent(a),!a.defaultPrevented)throw l})};function ll(e,t){const n=Object.create(null),r=e.split(",");for(let o=0;o!!n[o.toLowerCase()]:o=>!!n[o]}const Te={},En=[],ut=()=>{},Pu=()=>!1,Cu=/^on[^a-z]/,ir=e=>Cu.test(e),al=e=>e.startsWith("onUpdate:"),Ce=Object.assign,sl=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},ku=Object.prototype.hasOwnProperty,ue=(e,t)=>ku.call(e,t),J=Array.isArray,Un=e=>Kr(e)==="[object Map]",xu=e=>Kr(e)==="[object Set]",ne=e=>typeof e=="function",pe=e=>typeof e=="string",il=e=>typeof e=="symbol",Le=e=>e!==null&&typeof e=="object",xs=e=>Le(e)&&ne(e.then)&&ne(e.catch),Iu=Object.prototype.toString,Kr=e=>Iu.call(e),Ru=e=>Kr(e).slice(8,-1),Su=e=>Kr(e)==="[object Object]",cl=e=>pe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Kn=ll(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),qr=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Du=/-(\w)/g,tt=qr(e=>e.replace(Du,(t,n)=>n?n.toUpperCase():"")),$u=/\B([A-Z])/g,$n=qr(e=>e.replace($u,"-$1").toLowerCase()),cr=qr(e=>e.charAt(0).toUpperCase()+e.slice(1)),io=qr(e=>e?`on${cr(e)}`:""),er=(e,t)=>!Object.is(e,t),co=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Mu=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Vu=e=>{const t=pe(e)?Number(e):NaN;return isNaN(t)?e:t};let oa;const Do=()=>oa||(oa=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function ul(e){if(J(e)){const t={};for(let n=0;n{if(n){const r=n.split(ju);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function dl(e){let t="";if(pe(e))t=e;else if(J(e))for(let n=0;n{const t=new Set(e);return t.w=0,t.n=0,t},Ss=e=>(e.w&Bt)>0,Ds=e=>(e.n&Bt)>0,qu=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r{(i==="length"||i>=c)&&s.push(u)})}else switch(n!==void 0&&s.push(a.get(n)),t){case"add":J(e)?cl(n)&&s.push(a.get("length")):(s.push(a.get(en)),Un(e)&&s.push(a.get(Mo)));break;case"delete":J(e)||(s.push(a.get(en)),Un(e)&&s.push(a.get(Mo)));break;case"set":Un(e)&&s.push(a.get(en));break}if(s.length===1)s[0]&&Vo(s[0]);else{const c=[];for(const u of s)u&&c.push(...u);Vo(fl(c))}}function Vo(e,t){const n=J(e)?e:[...e];for(const r of n)r.computed&&aa(r);for(const r of n)r.computed||aa(r)}function aa(e,t){(e!==it||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function Zu(e,t){var n;return(n=$r.get(e))==null?void 0:n.get(t)}const Yu=ll("__proto__,__v_isRef,__isVue"),Vs=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(il)),Xu=vl(),Ju=vl(!1,!0),Qu=vl(!0),sa=ed();function ed(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=se(this);for(let l=0,a=this.length;l{e[t]=function(...n){Mn();const r=se(this)[t].apply(this,n);return Vn(),r}}),e}function td(e){const t=se(this);return ze(t,"has",e),t.hasOwnProperty(e)}function vl(e=!1,t=!1){return function(r,o,l){if(o==="__v_isReactive")return!e;if(o==="__v_isReadonly")return e;if(o==="__v_isShallow")return t;if(o==="__v_raw"&&l===(e?t?gd:Bs:t?Hs:Fs).get(r))return r;const a=J(r);if(!e){if(a&&ue(sa,o))return Reflect.get(sa,o,l);if(o==="hasOwnProperty")return td}const s=Reflect.get(r,o,l);return(il(o)?Vs.has(o):Yu(o))||(e||ze(r,"get",o),t)?s:Se(s)?a&&cl(o)?s:s.value:Le(s)?e?ln(s):ur(s):s}}const nd=Ns(),rd=Ns(!0);function Ns(e=!1){return function(n,r,o,l){let a=n[r];if(Cn(a)&&Se(a)&&!Se(o))return!1;if(!e&&(!Mr(o)&&!Cn(o)&&(a=se(a),o=se(o)),!J(n)&&Se(a)&&!Se(o)))return a.value=o,!0;const s=J(n)&&cl(r)?Number(r)e,Gr=e=>Reflect.getPrototypeOf(e);function br(e,t,n=!1,r=!1){e=e.__v_raw;const o=se(e),l=se(t);n||(t!==l&&ze(o,"get",t),ze(o,"get",l));const{has:a}=Gr(o),s=r?hl:n?_l:tr;if(a.call(o,t))return s(e.get(t));if(a.call(o,l))return s(e.get(l));e!==o&&e.get(t)}function yr(e,t=!1){const n=this.__v_raw,r=se(n),o=se(e);return t||(e!==o&&ze(r,"has",e),ze(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Er(e,t=!1){return e=e.__v_raw,!t&&ze(se(e),"iterate",en),Reflect.get(e,"size",e)}function ia(e){e=se(e);const t=se(this);return Gr(t).has.call(t,e)||(t.add(e),Pt(t,"add",e,e)),this}function ca(e,t){t=se(t);const n=se(this),{has:r,get:o}=Gr(n);let l=r.call(n,e);l||(e=se(e),l=r.call(n,e));const a=o.call(n,e);return n.set(e,t),l?er(t,a)&&Pt(n,"set",e,t):Pt(n,"add",e,t),this}function ua(e){const t=se(this),{has:n,get:r}=Gr(t);let o=n.call(t,e);o||(e=se(e),o=n.call(t,e)),r&&r.call(t,e);const l=t.delete(e);return o&&Pt(t,"delete",e,void 0),l}function da(){const e=se(this),t=e.size!==0,n=e.clear();return t&&Pt(e,"clear",void 0,void 0),n}function wr(e,t){return function(r,o){const l=this,a=l.__v_raw,s=se(a),c=t?hl:e?_l:tr;return!e&&ze(s,"iterate",en),a.forEach((u,i)=>r.call(o,c(u),c(i),l))}}function Tr(e,t,n){return function(...r){const o=this.__v_raw,l=se(o),a=Un(l),s=e==="entries"||e===Symbol.iterator&&a,c=e==="keys"&&a,u=o[e](...r),i=n?hl:t?_l:tr;return!t&&ze(l,"iterate",c?Mo:en),{next(){const{value:f,done:p}=u.next();return p?{value:f,done:p}:{value:s?[i(f[0]),i(f[1])]:i(f),done:p}},[Symbol.iterator](){return this}}}}function Rt(e){return function(...t){return e==="delete"?!1:this}}function cd(){const e={get(l){return br(this,l)},get size(){return Er(this)},has:yr,add:ia,set:ca,delete:ua,clear:da,forEach:wr(!1,!1)},t={get(l){return br(this,l,!1,!0)},get size(){return Er(this)},has:yr,add:ia,set:ca,delete:ua,clear:da,forEach:wr(!1,!0)},n={get(l){return br(this,l,!0)},get size(){return Er(this,!0)},has(l){return yr.call(this,l,!0)},add:Rt("add"),set:Rt("set"),delete:Rt("delete"),clear:Rt("clear"),forEach:wr(!0,!1)},r={get(l){return br(this,l,!0,!0)},get size(){return Er(this,!0)},has(l){return yr.call(this,l,!0)},add:Rt("add"),set:Rt("set"),delete:Rt("delete"),clear:Rt("clear"),forEach:wr(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(l=>{e[l]=Tr(l,!1,!1),n[l]=Tr(l,!0,!1),t[l]=Tr(l,!1,!0),r[l]=Tr(l,!0,!0)}),[e,n,t,r]}const[ud,dd,fd,pd]=cd();function ml(e,t){const n=t?e?pd:fd:e?dd:ud;return(r,o,l)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(ue(n,o)&&o in r?n:r,o,l)}const vd={get:ml(!1,!1)},hd={get:ml(!1,!0)},md={get:ml(!0,!1)},Fs=new WeakMap,Hs=new WeakMap,Bs=new WeakMap,gd=new WeakMap;function _d(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function bd(e){return e.__v_skip||!Object.isExtensible(e)?0:_d(Ru(e))}function ur(e){return Cn(e)?e:gl(e,!1,js,vd,Fs)}function zs(e){return gl(e,!1,id,hd,Hs)}function ln(e){return gl(e,!0,sd,md,Bs)}function gl(e,t,n,r,o){if(!Le(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const l=o.get(e);if(l)return l;const a=bd(e);if(a===0)return e;const s=new Proxy(e,a===2?r:n);return o.set(e,s),s}function wn(e){return Cn(e)?wn(e.__v_raw):!!(e&&e.__v_isReactive)}function Cn(e){return!!(e&&e.__v_isReadonly)}function Mr(e){return!!(e&&e.__v_isShallow)}function Ws(e){return wn(e)||Cn(e)}function se(e){const t=e&&e.__v_raw;return t?se(t):e}function Us(e){return Dr(e,"__v_skip",!0),e}const tr=e=>Le(e)?ur(e):e,_l=e=>Le(e)?ln(e):e;function bl(e){Ft&&it&&(e=se(e),Ms(e.dep||(e.dep=fl())))}function yl(e,t){e=se(e);const n=e.dep;n&&Vo(n)}function Se(e){return!!(e&&e.__v_isRef===!0)}function K(e){return Ks(e,!1)}function Oe(e){return Ks(e,!0)}function Ks(e,t){return Se(e)?e:new yd(e,t)}class yd{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:se(t),this._value=n?t:tr(t)}get value(){return bl(this),this._value}set value(t){const n=this.__v_isShallow||Mr(t)||Cn(t);t=n?t:se(t),er(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:tr(t),yl(this))}}function tn(e){return Se(e)?e.value:e}const Ed={get:(e,t,n)=>tn(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Se(o)&&!Se(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function qs(e){return wn(e)?e:new Proxy(e,Ed)}class wd{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>bl(this),()=>yl(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function Td(e){return new wd(e)}class Ld{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Zu(se(this._object),this._key)}}class Od{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Zr(e,t,n){return Se(e)?e:ne(e)?new Od(e):Le(e)&&arguments.length>1?Ad(e,t,n):K(e)}function Ad(e,t,n){const r=e[t];return Se(r)?r:new Ld(e,t,n)}class Pd{constructor(t,n,r,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new pl(t,()=>{this._dirty||(this._dirty=!0,yl(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=se(this);return bl(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function Cd(e,t,n=!1){let r,o;const l=ne(e);return l?(r=e,o=ut):(r=e.get,o=e.set),new Pd(r,o,l||!o,n)}function Ht(e,t,n,r){let o;try{o=r?e(...r):e()}catch(l){dr(l,t,n)}return o}function et(e,t,n,r){if(ne(e)){const l=Ht(e,t,n,r);return l&&xs(l)&&l.catch(a=>{dr(a,t,n)}),l}const o=[];for(let l=0;l>>1;rr($e[r])gt&&$e.splice(t,1)}function Rd(e){J(e)?Tn.push(...e):(!Ot||!Ot.includes(e,e.allowRecurse?Xt+1:Xt))&&Tn.push(e),Zs()}function fa(e,t=nr?gt+1:0){for(;t<$e.length;t++){const n=$e[t];n&&n.pre&&($e.splice(t,1),t--,n())}}function Vr(e){if(Tn.length){const t=[...new Set(Tn)];if(Tn.length=0,Ot){Ot.push(...t);return}for(Ot=t,Ot.sort((n,r)=>rr(n)-rr(r)),Xt=0;Xte.id==null?1/0:e.id,Sd=(e,t)=>{const n=rr(e)-rr(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Ys(e){No=!1,nr=!0,$e.sort(Sd);const t=ut;try{for(gt=0;gt<$e.length;gt++){const n=$e[gt];n&&n.active!==!1&&Ht(n,null,14)}}finally{gt=0,$e.length=0,Vr(),nr=!1,El=null,($e.length||Tn.length)&&Ys()}}function Dd(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||Te;let o=n;const l=t.startsWith("update:"),a=l&&t.slice(7);if(a&&a in r){const i=`${a==="modelValue"?"model":a}Modifiers`,{number:f,trim:p}=r[i]||Te;p&&(o=n.map(v=>pe(v)?v.trim():v)),f&&(o=n.map(Mu))}let s,c=r[s=io(t)]||r[s=io(tt(t))];!c&&l&&(c=r[s=io($n(t))]),c&&et(c,e,6,o);const u=r[s+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[s])return;e.emitted[s]=!0,et(u,e,6,o)}}function Xs(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const l=e.emits;let a={},s=!1;if(!ne(e)){const c=u=>{const i=Xs(u,t,!0);i&&(s=!0,Ce(a,i))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!l&&!s?(Le(e)&&r.set(e,null),null):(J(l)?l.forEach(c=>a[c]=null):Ce(a,l),Le(e)&&r.set(e,a),a)}function Xr(e,t){return!e||!ir(t)?!1:(t=t.slice(2).replace(/Once$/,""),ue(e,t[0].toLowerCase()+t.slice(1))||ue(e,$n(t))||ue(e,t))}let Qe=null,Js=null;function Nr(e){const t=Qe;return Qe=e,Js=e&&e.type.__scopeId||null,t}function $d(e,t=Qe,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&La(-1);const l=Nr(t);let a;try{a=e(...o)}finally{Nr(l),r._d&&La(1)}return a};return r._n=!0,r._c=!0,r._d=!0,r}function uo(e){const{type:t,vnode:n,proxy:r,withProxy:o,props:l,propsOptions:[a],slots:s,attrs:c,emit:u,render:i,renderCache:f,data:p,setupState:v,ctx:_,inheritAttrs:w}=e;let T,g;const y=Nr(e);try{if(n.shapeFlag&4){const R=o||r;T=st(i.call(R,R,f,l,v,p,_)),g=c}else{const R=t;T=st(R.length>1?R(l,{attrs:c,slots:s,emit:u}):R(l,null)),g=t.props?c:Md(c)}}catch(R){Yn.length=0,dr(R,e,1),T=De(_t)}let D=T;if(g&&w!==!1){const R=Object.keys(g),{shapeFlag:U}=D;R.length&&U&7&&(a&&R.some(al)&&(g=Vd(g,a)),D=zt(D,g))}return n.dirs&&(D=zt(D),D.dirs=D.dirs?D.dirs.concat(n.dirs):n.dirs),n.transition&&(D.transition=n.transition),T=D,Nr(y),T}const Md=e=>{let t;for(const n in e)(n==="class"||n==="style"||ir(n))&&((t||(t={}))[n]=e[n]);return t},Vd=(e,t)=>{const n={};for(const r in e)(!al(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Nd(e,t,n){const{props:r,children:o,component:l}=e,{props:a,children:s,patchFlag:c}=t,u=l.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?pa(r,a,u):!!a;if(c&8){const i=t.dynamicProps;for(let f=0;fe.__isSuspense;function Qs(e,t){t&&t.pendingBranch?J(e)?t.effects.push(...e):t.effects.push(e):Rd(e)}function ei(e,t){return wl(e,null,t)}const Lr={};function ae(e,t,n){return wl(e,t,n)}function wl(e,t,{immediate:n,deep:r,flush:o,onTrack:l,onTrigger:a}=Te){var s;const c=Rs()===((s=Re)==null?void 0:s.scope)?Re:null;let u,i=!1,f=!1;if(Se(e)?(u=()=>e.value,i=Mr(e)):wn(e)?(u=()=>e,r=!0):J(e)?(f=!0,i=e.some(R=>wn(R)||Mr(R)),u=()=>e.map(R=>{if(Se(R))return R.value;if(wn(R))return gn(R);if(ne(R))return Ht(R,c,2)})):ne(e)?t?u=()=>Ht(e,c,2):u=()=>{if(!(c&&c.isUnmounted))return p&&p(),et(e,c,3,[v])}:u=ut,t&&r){const R=u;u=()=>gn(R())}let p,v=R=>{p=y.onStop=()=>{Ht(R,c,4)}},_;if(In)if(v=ut,t?n&&et(t,c,3,[u(),f?[]:void 0,v]):u(),o==="sync"){const R=$f();_=R.__watcherHandles||(R.__watcherHandles=[])}else return ut;let w=f?new Array(e.length).fill(Lr):Lr;const T=()=>{if(y.active)if(t){const R=y.run();(r||i||(f?R.some((U,x)=>er(U,w[x])):er(R,w)))&&(p&&p(),et(t,c,3,[R,w===Lr?void 0:f&&w[0]===Lr?[]:w,v]),w=R)}else y.run()};T.allowRecurse=!!t;let g;o==="sync"?g=T:o==="post"?g=()=>Fe(T,c&&c.suspense):(T.pre=!0,c&&(T.id=c.uid),g=()=>Yr(T));const y=new pl(u,g);t?n?T():w=y.run():o==="post"?Fe(y.run.bind(y),c&&c.suspense):y.run();const D=()=>{y.stop(),c&&c.scope&&sl(c.scope.effects,y)};return _&&_.push(D),D}function Hd(e,t,n){const r=this.proxy,o=pe(e)?e.includes(".")?ti(r,e):()=>r[e]:e.bind(r,r);let l;ne(t)?l=t:(l=t.handler,n=t);const a=Re;xn(this);const s=wl(o,l.bind(r),n);return a?xn(a):rn(),s}function ti(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{gn(n,t)});else if(Su(e))for(const n in e)gn(e[n],t);return e}function mt(e,t,n,r){const o=e.dirs,l=t&&t.dirs;for(let a=0;a{e.isMounted=!0}),Ll(()=>{e.isUnmounting=!0}),e}const Ye=[Function,Array],ri={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Ye,onEnter:Ye,onAfterEnter:Ye,onEnterCancelled:Ye,onBeforeLeave:Ye,onLeave:Ye,onAfterLeave:Ye,onLeaveCancelled:Ye,onBeforeAppear:Ye,onAppear:Ye,onAfterAppear:Ye,onAppearCancelled:Ye},Bd={name:"BaseTransition",props:ri,setup(e,{slots:t}){const n=sn(),r=ni();let o;return()=>{const l=t.default&&Tl(t.default(),!0);if(!l||!l.length)return;let a=l[0];if(l.length>1){for(const w of l)if(w.type!==_t){a=w;break}}const s=se(e),{mode:c}=s;if(r.isLeaving)return fo(a);const u=va(a);if(!u)return fo(a);const i=or(u,s,r,n);lr(u,i);const f=n.subTree,p=f&&va(f);let v=!1;const{getTransitionKey:_}=u.type;if(_){const w=_();o===void 0?o=w:w!==o&&(o=w,v=!0)}if(p&&p.type!==_t&&(!Jt(u,p)||v)){const w=or(p,s,r,n);if(lr(p,w),c==="out-in")return r.isLeaving=!0,w.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&n.update()},fo(a);c==="in-out"&&u.type!==_t&&(w.delayLeave=(T,g,y)=>{const D=oi(r,p);D[String(p.key)]=p,T._leaveCb=()=>{g(),T._leaveCb=void 0,delete i.delayedLeave},i.delayedLeave=y})}return a}}},zd=Bd;function oi(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function or(e,t,n,r){const{appear:o,mode:l,persisted:a=!1,onBeforeEnter:s,onEnter:c,onAfterEnter:u,onEnterCancelled:i,onBeforeLeave:f,onLeave:p,onAfterLeave:v,onLeaveCancelled:_,onBeforeAppear:w,onAppear:T,onAfterAppear:g,onAppearCancelled:y}=t,D=String(e.key),R=oi(n,e),U=(O,B)=>{O&&et(O,r,9,B)},x=(O,B)=>{const z=B[1];U(O,B),J(O)?O.every(re=>re.length<=1)&&z():O.length<=1&&z()},M={mode:l,persisted:a,beforeEnter(O){let B=s;if(!n.isMounted)if(o)B=w||s;else return;O._leaveCb&&O._leaveCb(!0);const z=R[D];z&&Jt(e,z)&&z.el._leaveCb&&z.el._leaveCb(),U(B,[O])},enter(O){let B=c,z=u,re=i;if(!n.isMounted)if(o)B=T||c,z=g||u,re=y||i;else return;let W=!1;const Q=O._enterCb=q=>{W||(W=!0,q?U(re,[O]):U(z,[O]),M.delayedLeave&&M.delayedLeave(),O._enterCb=void 0)};B?x(B,[O,Q]):Q()},leave(O,B){const z=String(e.key);if(O._enterCb&&O._enterCb(!0),n.isUnmounting)return B();U(f,[O]);let re=!1;const W=O._leaveCb=Q=>{re||(re=!0,B(),Q?U(_,[O]):U(v,[O]),O._leaveCb=void 0,R[z]===e&&delete R[z])};R[z]=e,p?x(p,[O,W]):W()},clone(O){return or(O,t,n,r)}};return M}function fo(e){if(fr(e))return e=zt(e),e.children=null,e}function va(e){return fr(e)?e.children?e.children[0]:void 0:e}function lr(e,t){e.shapeFlag&6&&e.component?lr(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Tl(e,t=!1,n){let r=[],o=0;for(let l=0;l1)for(let l=0;lCe({name:e.name},t,{setup:e}))():e}const qn=e=>!!e.type.__asyncLoader;function S(e){ne(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:o=200,timeout:l,suspensible:a=!0,onError:s}=e;let c=null,u,i=0;const f=()=>(i++,c=null,p()),p=()=>{let v;return c||(v=c=t().catch(_=>{if(_=_ instanceof Error?_:new Error(String(_)),s)return new Promise((w,T)=>{s(_,()=>w(f()),()=>T(_),i+1)});throw _}).then(_=>v!==c&&c?c:(_&&(_.__esModule||_[Symbol.toStringTag]==="Module")&&(_=_.default),u=_,_)))};return H({name:"AsyncComponentWrapper",__asyncLoader:p,get __asyncResolved(){return u},setup(){const v=Re;if(u)return()=>po(u,v);const _=y=>{c=null,dr(y,v,13,!r)};if(a&&v.suspense||In)return p().then(y=>()=>po(y,v)).catch(y=>(_(y),()=>r?De(r,{error:y}):null));const w=K(!1),T=K(),g=K(!!o);return o&&setTimeout(()=>{g.value=!1},o),l!=null&&setTimeout(()=>{if(!w.value&&!T.value){const y=new Error(`Async component timed out after ${l}ms.`);_(y),T.value=y}},l),p().then(()=>{w.value=!0,v.parent&&fr(v.parent.vnode)&&Yr(v.parent.update)}).catch(y=>{_(y),T.value=y}),()=>{if(w.value&&u)return po(u,v);if(T.value&&r)return De(r,{error:T.value});if(n&&!g.value)return De(n)}}})}function po(e,t){const{ref:n,props:r,children:o,ce:l}=t.vnode,a=De(e,r,o);return a.ref=n,a.ce=l,delete t.vnode.ce,a}const fr=e=>e.type.__isKeepAlive;function Wd(e,t){li(e,"a",t)}function Ud(e,t){li(e,"da",t)}function li(e,t,n=Re){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Jr(t,r,n),n){let o=n.parent;for(;o&&o.parent;)fr(o.parent.vnode)&&Kd(r,t,n,o),o=o.parent}}function Kd(e,t,n,r){const o=Jr(t,e,r,!0);kt(()=>{sl(r[t],o)},n)}function Jr(e,t,n=Re,r=!1){if(n){const o=n[e]||(n[e]=[]),l=t.__weh||(t.__weh=(...a)=>{if(n.isUnmounted)return;Mn(),xn(n);const s=et(t,n,e,a);return rn(),Vn(),s});return r?o.unshift(l):o.push(l),l}}const Ct=e=>(t,n=Re)=>(!In||e==="sp")&&Jr(e,(...r)=>t(...r),n),qd=Ct("bm"),de=Ct("m"),Gd=Ct("bu"),ai=Ct("u"),Ll=Ct("bum"),kt=Ct("um"),Zd=Ct("sp"),Yd=Ct("rtg"),Xd=Ct("rtc");function Jd(e,t=Re){Jr("ec",e,t)}const si="components";function dt(e,t){return ef(si,e,!0,t)||e}const Qd=Symbol.for("v-ndc");function ef(e,t,n=!0,r=!1){const o=Qe||Re;if(o){const l=o.type;if(e===si){const s=Rf(l,!1);if(s&&(s===t||s===tt(t)||s===cr(tt(t))))return l}const a=ha(o[e]||l[e],t)||ha(o.appContext[e],t);return!a&&r?l:a}}function ha(e,t){return e&&(e[t]||e[tt(t)]||e[cr(tt(t))])}const jo=e=>e?bi(e)?kl(e)||e.proxy:jo(e.parent):null,Gn=Ce(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>jo(e.parent),$root:e=>jo(e.root),$emit:e=>e.emit,$options:e=>Ol(e),$forceUpdate:e=>e.f||(e.f=()=>Yr(e.update)),$nextTick:e=>e.n||(e.n=an.bind(e.proxy)),$watch:e=>Hd.bind(e)}),vo=(e,t)=>e!==Te&&!e.__isScriptSetup&&ue(e,t),tf={get({_:e},t){const{ctx:n,setupState:r,data:o,props:l,accessCache:a,type:s,appContext:c}=e;let u;if(t[0]!=="$"){const v=a[t];if(v!==void 0)switch(v){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return l[t]}else{if(vo(r,t))return a[t]=1,r[t];if(o!==Te&&ue(o,t))return a[t]=2,o[t];if((u=e.propsOptions[0])&&ue(u,t))return a[t]=3,l[t];if(n!==Te&&ue(n,t))return a[t]=4,n[t];Fo&&(a[t]=0)}}const i=Gn[t];let f,p;if(i)return t==="$attrs"&&ze(e,"get",t),i(e);if((f=s.__cssModules)&&(f=f[t]))return f;if(n!==Te&&ue(n,t))return a[t]=4,n[t];if(p=c.config.globalProperties,ue(p,t))return p[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:l}=e;return vo(o,t)?(o[t]=n,!0):r!==Te&&ue(r,t)?(r[t]=n,!0):ue(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(l[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:l}},a){let s;return!!n[a]||e!==Te&&ue(e,a)||vo(t,a)||(s=l[0])&&ue(s,a)||ue(r,a)||ue(Gn,a)||ue(o.config.globalProperties,a)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ue(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function ma(e){return J(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Fo=!0;function nf(e){const t=Ol(e),n=e.proxy,r=e.ctx;Fo=!1,t.beforeCreate&&ga(t.beforeCreate,e,"bc");const{data:o,computed:l,methods:a,watch:s,provide:c,inject:u,created:i,beforeMount:f,mounted:p,beforeUpdate:v,updated:_,activated:w,deactivated:T,beforeDestroy:g,beforeUnmount:y,destroyed:D,unmounted:R,render:U,renderTracked:x,renderTriggered:M,errorCaptured:O,serverPrefetch:B,expose:z,inheritAttrs:re,components:W,directives:Q,filters:q}=t;if(u&&rf(u,r,null),a)for(const fe in a){const te=a[fe];ne(te)&&(r[fe]=te.bind(n))}if(o){const fe=o.call(n,n);Le(fe)&&(e.data=ur(fe))}if(Fo=!0,l)for(const fe in l){const te=l[fe],ot=ne(te)?te.bind(n,n):ne(te.get)?te.get.bind(n,n):ut,vt=!ne(te)&&ne(te.set)?te.set.bind(n):ut,je=A({get:ot,set:vt});Object.defineProperty(r,fe,{enumerable:!0,configurable:!0,get:()=>je.value,set:Ae=>je.value=Ae})}if(s)for(const fe in s)ii(s[fe],r,n,fe);if(c){const fe=ne(c)?c.call(n):c;Reflect.ownKeys(fe).forEach(te=>{nn(te,fe[te])})}i&&ga(i,e,"c");function oe(fe,te){J(te)?te.forEach(ot=>fe(ot.bind(n))):te&&fe(te.bind(n))}if(oe(qd,f),oe(de,p),oe(Gd,v),oe(ai,_),oe(Wd,w),oe(Ud,T),oe(Jd,O),oe(Xd,x),oe(Yd,M),oe(Ll,y),oe(kt,R),oe(Zd,B),J(z))if(z.length){const fe=e.exposed||(e.exposed={});z.forEach(te=>{Object.defineProperty(fe,te,{get:()=>n[te],set:ot=>n[te]=ot})})}else e.exposed||(e.exposed={});U&&e.render===ut&&(e.render=U),re!=null&&(e.inheritAttrs=re),W&&(e.components=W),Q&&(e.directives=Q)}function rf(e,t,n=ut){J(e)&&(e=Ho(e));for(const r in e){const o=e[r];let l;Le(o)?"default"in o?l=ye(o.from||r,o.default,!0):l=ye(o.from||r):l=ye(o),Se(l)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>l.value,set:a=>l.value=a}):t[r]=l}}function ga(e,t,n){et(J(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function ii(e,t,n,r){const o=r.includes(".")?ti(n,r):()=>n[r];if(pe(e)){const l=t[e];ne(l)&&ae(o,l)}else if(ne(e))ae(o,e.bind(n));else if(Le(e))if(J(e))e.forEach(l=>ii(l,t,n,r));else{const l=ne(e.handler)?e.handler.bind(n):t[e.handler];ne(l)&&ae(o,l,e)}}function Ol(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:l,config:{optionMergeStrategies:a}}=e.appContext,s=l.get(t);let c;return s?c=s:!o.length&&!n&&!r?c=t:(c={},o.length&&o.forEach(u=>jr(c,u,a,!0)),jr(c,t,a)),Le(t)&&l.set(t,c),c}function jr(e,t,n,r=!1){const{mixins:o,extends:l}=t;l&&jr(e,l,n,!0),o&&o.forEach(a=>jr(e,a,n,!0));for(const a in t)if(!(r&&a==="expose")){const s=of[a]||n&&n[a];e[a]=s?s(e[a],t[a]):t[a]}return e}const of={data:_a,props:ba,emits:ba,methods:Wn,computed:Wn,beforeCreate:Me,created:Me,beforeMount:Me,mounted:Me,beforeUpdate:Me,updated:Me,beforeDestroy:Me,beforeUnmount:Me,destroyed:Me,unmounted:Me,activated:Me,deactivated:Me,errorCaptured:Me,serverPrefetch:Me,components:Wn,directives:Wn,watch:af,provide:_a,inject:lf};function _a(e,t){return t?e?function(){return Ce(ne(e)?e.call(this,this):e,ne(t)?t.call(this,this):t)}:t:e}function lf(e,t){return Wn(Ho(e),Ho(t))}function Ho(e){if(J(e)){const t={};for(let n=0;n1)return n&&ne(t)?t.call(r&&r.proxy):t}}function uf(e,t,n,r=!1){const o={},l={};Dr(l,Qr,1),e.propsDefaults=Object.create(null),ui(e,t,o,l);for(const a in e.propsOptions[0])a in o||(o[a]=void 0);n?e.props=r?o:zs(o):e.type.props?e.props=o:e.props=l,e.attrs=l}function df(e,t,n,r){const{props:o,attrs:l,vnode:{patchFlag:a}}=e,s=se(o),[c]=e.propsOptions;let u=!1;if((r||a>0)&&!(a&16)){if(a&8){const i=e.vnode.dynamicProps;for(let f=0;f{c=!0;const[p,v]=di(f,t,!0);Ce(a,p),v&&s.push(...v)};!n&&t.mixins.length&&t.mixins.forEach(i),e.extends&&i(e.extends),e.mixins&&e.mixins.forEach(i)}if(!l&&!c)return Le(e)&&r.set(e,En),En;if(J(l))for(let i=0;i-1,v[1]=w<0||_-1||ue(v,"default"))&&s.push(f)}}}const u=[a,s];return Le(e)&&r.set(e,u),u}function ya(e){return e[0]!=="$"}function Ea(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function wa(e,t){return Ea(e)===Ea(t)}function Ta(e,t){return J(t)?t.findIndex(n=>wa(n,e)):ne(t)&&wa(t,e)?0:-1}const fi=e=>e[0]==="_"||e==="$stable",Al=e=>J(e)?e.map(st):[st(e)],ff=(e,t,n)=>{if(t._n)return t;const r=$d((...o)=>Al(t(...o)),n);return r._c=!1,r},pi=(e,t,n)=>{const r=e._ctx;for(const o in e){if(fi(o))continue;const l=e[o];if(ne(l))t[o]=ff(o,l,r);else if(l!=null){const a=Al(l);t[o]=()=>a}}},vi=(e,t)=>{const n=Al(t);e.slots.default=()=>n},pf=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=se(t),Dr(t,"_",n)):pi(t,e.slots={})}else e.slots={},t&&vi(e,t);Dr(e.slots,Qr,1)},vf=(e,t,n)=>{const{vnode:r,slots:o}=e;let l=!0,a=Te;if(r.shapeFlag&32){const s=t._;s?n&&s===1?l=!1:(Ce(o,t),!n&&s===1&&delete o._):(l=!t.$stable,pi(t,o)),a=t}else t&&(vi(e,t),a={default:1});if(l)for(const s in o)!fi(s)&&!(s in a)&&delete o[s]};function Hr(e,t,n,r,o=!1){if(J(e)){e.forEach((p,v)=>Hr(p,t&&(J(t)?t[v]:t),n,r,o));return}if(qn(r)&&!o)return;const l=r.shapeFlag&4?kl(r.component)||r.component.proxy:r.el,a=o?null:l,{i:s,r:c}=e,u=t&&t.r,i=s.refs===Te?s.refs={}:s.refs,f=s.setupState;if(u!=null&&u!==c&&(pe(u)?(i[u]=null,ue(f,u)&&(f[u]=null)):Se(u)&&(u.value=null)),ne(c))Ht(c,s,12,[a,i]);else{const p=pe(c),v=Se(c);if(p||v){const _=()=>{if(e.f){const w=p?ue(f,c)?f[c]:i[c]:c.value;o?J(w)&&sl(w,l):J(w)?w.includes(l)||w.push(l):p?(i[c]=[l],ue(f,c)&&(f[c]=i[c])):(c.value=[l],e.k&&(i[e.k]=c.value))}else p?(i[c]=a,ue(f,c)&&(f[c]=a)):v&&(c.value=a,e.k&&(i[e.k]=a))};a?(_.id=-1,Fe(_,n)):_()}}}let St=!1;const Or=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Ar=e=>e.nodeType===8;function hf(e){const{mt:t,p:n,o:{patchProp:r,createText:o,nextSibling:l,parentNode:a,remove:s,insert:c,createComment:u}}=e,i=(g,y)=>{if(!y.hasChildNodes()){n(null,g,y),Vr(),y._vnode=g;return}St=!1,f(y.firstChild,g,null,null,null),Vr(),y._vnode=g,St&&console.error("Hydration completed but contains mismatches.")},f=(g,y,D,R,U,x=!1)=>{const M=Ar(g)&&g.data==="[",O=()=>w(g,y,D,R,U,M),{type:B,ref:z,shapeFlag:re,patchFlag:W}=y;let Q=g.nodeType;y.el=g,W===-2&&(x=!1,y.dynamicChildren=null);let q=null;switch(B){case kn:Q!==3?y.children===""?(c(y.el=o(""),a(g),g),q=g):q=O():(g.data!==y.children&&(St=!0,g.data=y.children),q=l(g));break;case _t:Q!==8||M?q=O():q=l(g);break;case Zn:if(M&&(g=l(g),Q=g.nodeType),Q===1||Q===3){q=g;const we=!y.children.length;for(let oe=0;oe{x=x||!!y.dynamicChildren;const{type:M,props:O,patchFlag:B,shapeFlag:z,dirs:re}=y,W=M==="input"&&re||M==="option";if(W||B!==-1){if(re&&mt(y,null,D,"created"),O)if(W||!x||B&48)for(const q in O)(W&&q.endsWith("value")||ir(q)&&!Kn(q))&&r(g,q,null,O[q],!1,void 0,D);else O.onClick&&r(g,"onClick",null,O.onClick,!1,void 0,D);let Q;if((Q=O&&O.onVnodeBeforeMount)&&Xe(Q,D,y),re&&mt(y,null,D,"beforeMount"),((Q=O&&O.onVnodeMounted)||re)&&Qs(()=>{Q&&Xe(Q,D,y),re&&mt(y,null,D,"mounted")},R),z&16&&!(O&&(O.innerHTML||O.textContent))){let q=v(g.firstChild,y,g,D,R,U,x);for(;q;){St=!0;const we=q;q=q.nextSibling,s(we)}}else z&8&&g.textContent!==y.children&&(St=!0,g.textContent=y.children)}return g.nextSibling},v=(g,y,D,R,U,x,M)=>{M=M||!!y.dynamicChildren;const O=y.children,B=O.length;for(let z=0;z{const{slotScopeIds:M}=y;M&&(U=U?U.concat(M):M);const O=a(g),B=v(l(g),y,O,D,R,U,x);return B&&Ar(B)&&B.data==="]"?l(y.anchor=B):(St=!0,c(y.anchor=u("]"),O,B),B)},w=(g,y,D,R,U,x)=>{if(St=!0,y.el=null,x){const B=T(g);for(;;){const z=l(g);if(z&&z!==B)s(z);else break}}const M=l(g),O=a(g);return s(g),n(null,y,O,M,D,R,Or(O),U),M},T=g=>{let y=0;for(;g;)if(g=l(g),g&&Ar(g)&&(g.data==="["&&y++,g.data==="]")){if(y===0)return l(g);y--}return g};return[i,f]}const Fe=Qs;function mf(e){return gf(e,hf)}function gf(e,t){const n=Do();n.__VUE__=!0;const{insert:r,remove:o,patchProp:l,createElement:a,createText:s,createComment:c,setText:u,setElementText:i,parentNode:f,nextSibling:p,setScopeId:v=ut,insertStaticContent:_}=e,w=(h,m,E,L=null,C=null,k=null,j=!1,$=null,N=!!m.dynamicChildren)=>{if(h===m)return;h&&!Jt(h,m)&&(L=P(h),Ae(h,C,k,!0),h=null),m.patchFlag===-2&&(N=!1,m.dynamicChildren=null);const{type:I,ref:Y,shapeFlag:G}=m;switch(I){case kn:T(h,m,E,L);break;case _t:g(h,m,E,L);break;case Zn:h==null&&y(m,E,L,j);break;case Ke:W(h,m,E,L,C,k,j,$,N);break;default:G&1?U(h,m,E,L,C,k,j,$,N):G&6?Q(h,m,E,L,C,k,j,$,N):(G&64||G&128)&&I.process(h,m,E,L,C,k,j,$,N,V)}Y!=null&&C&&Hr(Y,h&&h.ref,k,m||h,!m)},T=(h,m,E,L)=>{if(h==null)r(m.el=s(m.children),E,L);else{const C=m.el=h.el;m.children!==h.children&&u(C,m.children)}},g=(h,m,E,L)=>{h==null?r(m.el=c(m.children||""),E,L):m.el=h.el},y=(h,m,E,L)=>{[h.el,h.anchor]=_(h.children,m,E,L,h.el,h.anchor)},D=({el:h,anchor:m},E,L)=>{let C;for(;h&&h!==m;)C=p(h),r(h,E,L),h=C;r(m,E,L)},R=({el:h,anchor:m})=>{let E;for(;h&&h!==m;)E=p(h),o(h),h=E;o(m)},U=(h,m,E,L,C,k,j,$,N)=>{j=j||m.type==="svg",h==null?x(m,E,L,C,k,j,$,N):B(h,m,C,k,j,$,N)},x=(h,m,E,L,C,k,j,$)=>{let N,I;const{type:Y,props:G,shapeFlag:X,transition:ee,dirs:le}=h;if(N=h.el=a(h.type,k,G&&G.is,G),X&8?i(N,h.children):X&16&&O(h.children,N,null,L,C,k&&Y!=="foreignObject",j,$),le&&mt(h,null,L,"created"),M(N,h,h.scopeId,j,L),G){for(const he in G)he!=="value"&&!Kn(he)&&l(N,he,null,G[he],k,h.children,L,C,ke);"value"in G&&l(N,"value",null,G.value),(I=G.onVnodeBeforeMount)&&Xe(I,L,h)}le&&mt(h,null,L,"beforeMount");const be=(!C||C&&!C.pendingBranch)&&ee&&!ee.persisted;be&&ee.beforeEnter(N),r(N,m,E),((I=G&&G.onVnodeMounted)||be||le)&&Fe(()=>{I&&Xe(I,L,h),be&&ee.enter(N),le&&mt(h,null,L,"mounted")},C)},M=(h,m,E,L,C)=>{if(E&&v(h,E),L)for(let k=0;k{for(let I=N;I{const $=m.el=h.el;let{patchFlag:N,dynamicChildren:I,dirs:Y}=m;N|=h.patchFlag&16;const G=h.props||Te,X=m.props||Te;let ee;E&&Zt(E,!1),(ee=X.onVnodeBeforeUpdate)&&Xe(ee,E,m,h),Y&&mt(m,h,E,"beforeUpdate"),E&&Zt(E,!0);const le=C&&m.type!=="foreignObject";if(I?z(h.dynamicChildren,I,$,E,L,le,k):j||te(h,m,$,null,E,L,le,k,!1),N>0){if(N&16)re($,m,G,X,E,L,C);else if(N&2&&G.class!==X.class&&l($,"class",null,X.class,C),N&4&&l($,"style",G.style,X.style,C),N&8){const be=m.dynamicProps;for(let he=0;he{ee&&Xe(ee,E,m,h),Y&&mt(m,h,E,"updated")},L)},z=(h,m,E,L,C,k,j)=>{for(let $=0;${if(E!==L){if(E!==Te)for(const $ in E)!Kn($)&&!($ in L)&&l(h,$,E[$],null,j,m.children,C,k,ke);for(const $ in L){if(Kn($))continue;const N=L[$],I=E[$];N!==I&&$!=="value"&&l(h,$,I,N,j,m.children,C,k,ke)}"value"in L&&l(h,"value",E.value,L.value)}},W=(h,m,E,L,C,k,j,$,N)=>{const I=m.el=h?h.el:s(""),Y=m.anchor=h?h.anchor:s("");let{patchFlag:G,dynamicChildren:X,slotScopeIds:ee}=m;ee&&($=$?$.concat(ee):ee),h==null?(r(I,E,L),r(Y,E,L),O(m.children,E,Y,C,k,j,$,N)):G>0&&G&64&&X&&h.dynamicChildren?(z(h.dynamicChildren,X,E,C,k,j,$),(m.key!=null||C&&m===C.subTree)&&hi(h,m,!0)):te(h,m,E,Y,C,k,j,$,N)},Q=(h,m,E,L,C,k,j,$,N)=>{m.slotScopeIds=$,h==null?m.shapeFlag&512?C.ctx.activate(m,E,L,j,N):q(m,E,L,C,k,j,N):we(h,m,N)},q=(h,m,E,L,C,k,j)=>{const $=h.component=Pf(h,L,C);if(fr(h)&&($.ctx.renderer=V),Cf($),$.asyncDep){if(C&&C.registerDep($,oe),!h.el){const N=$.subTree=De(_t);g(null,N,m,E)}return}oe($,h,m,E,C,k,j)},we=(h,m,E)=>{const L=m.component=h.component;if(Nd(h,m,E))if(L.asyncDep&&!L.asyncResolved){fe(L,m,E);return}else L.next=m,Id(L.update),L.update();else m.el=h.el,L.vnode=m},oe=(h,m,E,L,C,k,j)=>{const $=()=>{if(h.isMounted){let{next:Y,bu:G,u:X,parent:ee,vnode:le}=h,be=Y,he;Zt(h,!1),Y?(Y.el=le.el,fe(h,Y,j)):Y=le,G&&co(G),(he=Y.props&&Y.props.onVnodeBeforeUpdate)&&Xe(he,ee,Y,le),Zt(h,!0);const xe=uo(h),lt=h.subTree;h.subTree=xe,w(lt,xe,f(lt.el),P(lt),h,C,k),Y.el=xe.el,be===null&&jd(h,xe.el),X&&Fe(X,C),(he=Y.props&&Y.props.onVnodeUpdated)&&Fe(()=>Xe(he,ee,Y,le),C)}else{let Y;const{el:G,props:X}=m,{bm:ee,m:le,parent:be}=h,he=qn(m);if(Zt(h,!1),ee&&co(ee),!he&&(Y=X&&X.onVnodeBeforeMount)&&Xe(Y,be,m),Zt(h,!0),G&&ie){const xe=()=>{h.subTree=uo(h),ie(G,h.subTree,h,C,null)};he?m.type.__asyncLoader().then(()=>!h.isUnmounted&&xe()):xe()}else{const xe=h.subTree=uo(h);w(null,xe,E,L,h,C,k),m.el=xe.el}if(le&&Fe(le,C),!he&&(Y=X&&X.onVnodeMounted)){const xe=m;Fe(()=>Xe(Y,be,xe),C)}(m.shapeFlag&256||be&&qn(be.vnode)&&be.vnode.shapeFlag&256)&&h.a&&Fe(h.a,C),h.isMounted=!0,m=E=L=null}},N=h.effect=new pl($,()=>Yr(I),h.scope),I=h.update=()=>N.run();I.id=h.uid,Zt(h,!0),I()},fe=(h,m,E)=>{m.component=h;const L=h.vnode.props;h.vnode=m,h.next=null,df(h,m.props,L,E),vf(h,m.children,E),Mn(),fa(),Vn()},te=(h,m,E,L,C,k,j,$,N=!1)=>{const I=h&&h.children,Y=h?h.shapeFlag:0,G=m.children,{patchFlag:X,shapeFlag:ee}=m;if(X>0){if(X&128){vt(I,G,E,L,C,k,j,$,N);return}else if(X&256){ot(I,G,E,L,C,k,j,$,N);return}}ee&8?(Y&16&&ke(I,C,k),G!==I&&i(E,G)):Y&16?ee&16?vt(I,G,E,L,C,k,j,$,N):ke(I,C,k,!0):(Y&8&&i(E,""),ee&16&&O(G,E,L,C,k,j,$,N))},ot=(h,m,E,L,C,k,j,$,N)=>{h=h||En,m=m||En;const I=h.length,Y=m.length,G=Math.min(I,Y);let X;for(X=0;XY?ke(h,C,k,!0,!1,G):O(m,E,L,C,k,j,$,N,G)},vt=(h,m,E,L,C,k,j,$,N)=>{let I=0;const Y=m.length;let G=h.length-1,X=Y-1;for(;I<=G&&I<=X;){const ee=h[I],le=m[I]=N?Vt(m[I]):st(m[I]);if(Jt(ee,le))w(ee,le,E,null,C,k,j,$,N);else break;I++}for(;I<=G&&I<=X;){const ee=h[G],le=m[X]=N?Vt(m[X]):st(m[X]);if(Jt(ee,le))w(ee,le,E,null,C,k,j,$,N);else break;G--,X--}if(I>G){if(I<=X){const ee=X+1,le=eeX)for(;I<=G;)Ae(h[I],C,k,!0),I++;else{const ee=I,le=I,be=new Map;for(I=le;I<=X;I++){const We=m[I]=N?Vt(m[I]):st(m[I]);We.key!=null&&be.set(We.key,I)}let he,xe=0;const lt=X-le+1;let pn=!1,ea=0;const Fn=new Array(lt);for(I=0;I=lt){Ae(We,C,k,!0);continue}let ht;if(We.key!=null)ht=be.get(We.key);else for(he=le;he<=X;he++)if(Fn[he-le]===0&&Jt(We,m[he])){ht=he;break}ht===void 0?Ae(We,C,k,!0):(Fn[ht-le]=I+1,ht>=ea?ea=ht:pn=!0,w(We,m[ht],E,null,C,k,j,$,N),xe++)}const ta=pn?_f(Fn):En;for(he=ta.length-1,I=lt-1;I>=0;I--){const We=le+I,ht=m[We],na=We+1{const{el:k,type:j,transition:$,children:N,shapeFlag:I}=h;if(I&6){je(h.component.subTree,m,E,L);return}if(I&128){h.suspense.move(m,E,L);return}if(I&64){j.move(h,m,E,V);return}if(j===Ke){r(k,m,E);for(let G=0;G$.enter(k),C);else{const{leave:G,delayLeave:X,afterLeave:ee}=$,le=()=>r(k,m,E),be=()=>{G(k,()=>{le(),ee&&ee()})};X?X(k,le,be):be()}else r(k,m,E)},Ae=(h,m,E,L=!1,C=!1)=>{const{type:k,props:j,ref:$,children:N,dynamicChildren:I,shapeFlag:Y,patchFlag:G,dirs:X}=h;if($!=null&&Hr($,null,E,h,!0),Y&256){m.ctx.deactivate(h);return}const ee=Y&1&&X,le=!qn(h);let be;if(le&&(be=j&&j.onVnodeBeforeUnmount)&&Xe(be,m,h),Y&6)It(h.component,E,L);else{if(Y&128){h.suspense.unmount(E,L);return}ee&&mt(h,null,m,"beforeUnmount"),Y&64?h.type.remove(h,m,E,C,V,L):I&&(k!==Ke||G>0&&G&64)?ke(I,m,E,!1,!0):(k===Ke&&G&384||!C&&Y&16)&&ke(N,m,E),L&&yt(h)}(le&&(be=j&&j.onVnodeUnmounted)||ee)&&Fe(()=>{be&&Xe(be,m,h),ee&&mt(h,null,m,"unmounted")},E)},yt=h=>{const{type:m,el:E,anchor:L,transition:C}=h;if(m===Ke){Ze(E,L);return}if(m===Zn){R(h);return}const k=()=>{o(E),C&&!C.persisted&&C.afterLeave&&C.afterLeave()};if(h.shapeFlag&1&&C&&!C.persisted){const{leave:j,delayLeave:$}=C,N=()=>j(E,k);$?$(h.el,k,N):N()}else k()},Ze=(h,m)=>{let E;for(;h!==m;)E=p(h),o(h),h=E;o(m)},It=(h,m,E)=>{const{bum:L,scope:C,update:k,subTree:j,um:$}=h;L&&co(L),C.stop(),k&&(k.active=!1,Ae(j,h,m,E)),$&&Fe($,m),Fe(()=>{h.isUnmounted=!0},m),m&&m.pendingBranch&&!m.isUnmounted&&h.asyncDep&&!h.asyncResolved&&h.suspenseId===m.pendingId&&(m.deps--,m.deps===0&&m.resolve())},ke=(h,m,E,L=!1,C=!1,k=0)=>{for(let j=k;jh.shapeFlag&6?P(h.component.subTree):h.shapeFlag&128?h.suspense.next():p(h.anchor||h.el),F=(h,m,E)=>{h==null?m._vnode&&Ae(m._vnode,null,null,!0):w(m._vnode||null,h,m,null,null,null,E),fa(),Vr(),m._vnode=h},V={p:w,um:Ae,m:je,r:yt,mt:q,mc:O,pc:te,pbc:z,n:P,o:e};let Z,ie;return t&&([Z,ie]=t(V)),{render:F,hydrate:Z,createApp:cf(F,Z)}}function Zt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function hi(e,t,n=!1){const r=e.children,o=t.children;if(J(r)&&J(o))for(let l=0;l>1,e[n[s]]0&&(t[r]=n[l-1]),n[l]=r)}}for(l=n.length,a=n[l-1];l-- >0;)n[l]=a,a=t[a];return n}const bf=e=>e.__isTeleport,Ke=Symbol.for("v-fgt"),kn=Symbol.for("v-txt"),_t=Symbol.for("v-cmt"),Zn=Symbol.for("v-stc"),Yn=[];let ct=null;function K2(e=!1){Yn.push(ct=e?null:[])}function yf(){Yn.pop(),ct=Yn[Yn.length-1]||null}let ar=1;function La(e){ar+=e}function Ef(e){return e.dynamicChildren=ar>0?ct||En:null,yf(),ar>0&&ct&&ct.push(e),e}function q2(e,t,n,r,o,l){return Ef(gi(e,t,n,r,o,l,!0))}function zo(e){return e?e.__v_isVNode===!0:!1}function Jt(e,t){return e.type===t.type&&e.key===t.key}const Qr="__vInternal",mi=({key:e})=>e??null,Sr=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?pe(e)||Se(e)||ne(e)?{i:Qe,r:e,k:t,f:!!n}:e:null);function gi(e,t=null,n=null,r=0,o=null,l=e===Ke?0:1,a=!1,s=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&mi(t),ref:t&&Sr(t),scopeId:Js,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:l,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:Qe};return s?(Pl(c,n),l&128&&e.normalize(c)):n&&(c.shapeFlag|=pe(n)?8:16),ar>0&&!a&&ct&&(c.patchFlag>0||l&6)&&c.patchFlag!==32&&ct.push(c),c}const De=wf;function wf(e,t=null,n=null,r=0,o=null,l=!1){if((!e||e===Qd)&&(e=_t),zo(e)){const s=zt(e,t,!0);return n&&Pl(s,n),ar>0&&!l&&ct&&(s.shapeFlag&6?ct[ct.indexOf(e)]=s:ct.push(s)),s.patchFlag|=-2,s}if(Sf(e)&&(e=e.__vccOpts),t){t=Tf(t);let{class:s,style:c}=t;s&&!pe(s)&&(t.class=dl(s)),Le(c)&&(Ws(c)&&!J(c)&&(c=Ce({},c)),t.style=ul(c))}const a=pe(e)?1:Fd(e)?128:bf(e)?64:Le(e)?4:ne(e)?2:0;return gi(e,t,n,r,o,a,l,!0)}function Tf(e){return e?Ws(e)||Qr in e?Ce({},e):e:null}function zt(e,t,n=!1){const{props:r,ref:o,patchFlag:l,children:a}=e,s=t?Lf(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:s,key:s&&mi(s),ref:t&&t.ref?n&&o?J(o)?o.concat(Sr(t)):[o,Sr(t)]:Sr(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ke?l===-1?16:l|16:l,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&zt(e.ssContent),ssFallback:e.ssFallback&&zt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function _i(e=" ",t=0){return De(kn,null,e,t)}function G2(e,t){const n=De(Zn,null,e);return n.staticCount=t,n}function st(e){return e==null||typeof e=="boolean"?De(_t):J(e)?De(Ke,null,e.slice()):typeof e=="object"?Vt(e):De(kn,null,String(e))}function Vt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:zt(e)}function Pl(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(J(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),Pl(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(Qr in t)?t._ctx=Qe:o===3&&Qe&&(Qe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ne(t)?(t={default:t,_ctx:Qe},n=32):(t=String(t),r&64?(n=16,t=[_i(t)]):n=8);e.children=t,e.shapeFlag|=n}function Lf(...e){const t={};for(let n=0;nRe||Qe;let Cl,vn,Oa="__VUE_INSTANCE_SETTERS__";(vn=Do()[Oa])||(vn=Do()[Oa]=[]),vn.push(e=>Re=e),Cl=e=>{vn.length>1?vn.forEach(t=>t(e)):vn[0](e)};const xn=e=>{Cl(e),e.scope.on()},rn=()=>{Re&&Re.scope.off(),Cl(null)};function bi(e){return e.vnode.shapeFlag&4}let In=!1;function Cf(e,t=!1){In=t;const{props:n,children:r}=e.vnode,o=bi(e);uf(e,n,o,t),pf(e,r);const l=o?kf(e,t):void 0;return In=!1,l}function kf(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Us(new Proxy(e.ctx,tf));const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?If(e):null;xn(e),Mn();const l=Ht(r,e,0,[e.props,o]);if(Vn(),rn(),xs(l)){if(l.then(rn,rn),t)return l.then(a=>{Aa(e,a,t)}).catch(a=>{dr(a,e,0)});e.asyncDep=l}else Aa(e,l,t)}else yi(e,t)}function Aa(e,t,n){ne(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Le(t)&&(e.setupState=qs(t)),yi(e,n)}let Pa;function yi(e,t,n){const r=e.type;if(!e.render){if(!t&&Pa&&!r.render){const o=r.template||Ol(e).template;if(o){const{isCustomElement:l,compilerOptions:a}=e.appContext.config,{delimiters:s,compilerOptions:c}=r,u=Ce(Ce({isCustomElement:l,delimiters:s},a),c);r.render=Pa(o,u)}}e.render=r.render||ut}xn(e),Mn(),nf(e),Vn(),rn()}function xf(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return ze(e,"get","$attrs"),t[n]}}))}function If(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return xf(e)},slots:e.slots,emit:e.emit,expose:t}}function kl(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(qs(Us(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Gn)return Gn[n](e)},has(t,n){return n in t||n in Gn}}))}function Rf(e,t=!0){return ne(e)?e.displayName||e.name:e.name||t&&e.__name}function Sf(e){return ne(e)&&"__vccOpts"in e}const A=(e,t)=>Cd(e,t,In);function d(e,t,n){const r=arguments.length;return r===2?Le(t)&&!J(t)?zo(t)?De(e,null,[t]):De(e,t):De(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&zo(n)&&(n=[n]),De(e,t,n))}const Df=Symbol.for("v-scx"),$f=()=>ye(Df),Mf="3.3.4",Vf="http://www.w3.org/2000/svg",Qt=typeof document<"u"?document:null,Ca=Qt&&Qt.createElement("template"),Nf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?Qt.createElementNS(Vf,e):Qt.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Qt.createTextNode(e),createComment:e=>Qt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Qt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,l){const a=n?n.previousSibling:t.lastChild;if(o&&(o===l||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===l||!(o=o.nextSibling)););else{Ca.innerHTML=r?`${e}`:e;const s=Ca.content;if(r){const c=s.firstChild;for(;c.firstChild;)s.appendChild(c.firstChild);s.removeChild(c)}t.insertBefore(s,n)}return[a?a.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function jf(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function Ff(e,t,n){const r=e.style,o=pe(n);if(n&&!o){if(t&&!pe(t))for(const l in t)n[l]==null&&Wo(r,l,"");for(const l in n)Wo(r,l,n[l])}else{const l=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=l)}}const ka=/\s*!important$/;function Wo(e,t,n){if(J(n))n.forEach(r=>Wo(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Hf(e,t);ka.test(n)?e.setProperty($n(r),n.replace(ka,""),"important"):e[r]=n}}const xa=["Webkit","Moz","ms"],ho={};function Hf(e,t){const n=ho[t];if(n)return n;let r=tt(t);if(r!=="filter"&&r in e)return ho[t]=r;r=cr(r);for(let o=0;omo||(Gf.then(()=>mo=0),mo=Date.now());function Yf(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;et(Xf(r,n.value),t,5,[r])};return n.value=e,n.attached=Zf(),n}function Xf(e,t){if(J(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const Sa=/^on[a-z]/,Jf=(e,t,n,r,o=!1,l,a,s,c)=>{t==="class"?jf(e,r,o):t==="style"?Ff(e,n,r):ir(t)?al(t)||Kf(e,t,n,r,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Qf(e,t,r,o))?zf(e,t,r,l,a,s,c):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Bf(e,t,r,o))};function Qf(e,t,n,r){return r?!!(t==="innerHTML"||t==="textContent"||t in e&&Sa.test(t)&&ne(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||Sa.test(t)&&pe(n)?!1:t in e}const Dt="transition",Hn="animation",Wt=(e,{slots:t})=>d(zd,wi(e),t);Wt.displayName="Transition";const Ei={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},ep=Wt.props=Ce({},ri,Ei),Yt=(e,t=[])=>{J(e)?e.forEach(n=>n(...t)):e&&e(...t)},Da=e=>e?J(e)?e.some(t=>t.length>1):e.length>1:!1;function wi(e){const t={};for(const W in e)W in Ei||(t[W]=e[W]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:l=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:s=`${n}-enter-to`,appearFromClass:c=l,appearActiveClass:u=a,appearToClass:i=s,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,_=tp(o),w=_&&_[0],T=_&&_[1],{onBeforeEnter:g,onEnter:y,onEnterCancelled:D,onLeave:R,onLeaveCancelled:U,onBeforeAppear:x=g,onAppear:M=y,onAppearCancelled:O=D}=t,B=(W,Q,q)=>{Mt(W,Q?i:s),Mt(W,Q?u:a),q&&q()},z=(W,Q)=>{W._isLeaving=!1,Mt(W,f),Mt(W,v),Mt(W,p),Q&&Q()},re=W=>(Q,q)=>{const we=W?M:y,oe=()=>B(Q,W,q);Yt(we,[Q,oe]),$a(()=>{Mt(Q,W?c:l),wt(Q,W?i:s),Da(we)||Ma(Q,r,w,oe)})};return Ce(t,{onBeforeEnter(W){Yt(g,[W]),wt(W,l),wt(W,a)},onBeforeAppear(W){Yt(x,[W]),wt(W,c),wt(W,u)},onEnter:re(!1),onAppear:re(!0),onLeave(W,Q){W._isLeaving=!0;const q=()=>z(W,Q);wt(W,f),Li(),wt(W,p),$a(()=>{W._isLeaving&&(Mt(W,f),wt(W,v),Da(R)||Ma(W,r,T,q))}),Yt(R,[W,q])},onEnterCancelled(W){B(W,!1),Yt(D,[W])},onAppearCancelled(W){B(W,!0),Yt(O,[W])},onLeaveCancelled(W){z(W),Yt(U,[W])}})}function tp(e){if(e==null)return null;if(Le(e))return[go(e.enter),go(e.leave)];{const t=go(e);return[t,t]}}function go(e){return Vu(e)}function wt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Mt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function $a(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let np=0;function Ma(e,t,n,r){const o=e._endId=++np,l=()=>{o===e._endId&&r()};if(n)return setTimeout(l,n);const{type:a,timeout:s,propCount:c}=Ti(e,t);if(!a)return r();const u=a+"end";let i=0;const f=()=>{e.removeEventListener(u,p),l()},p=v=>{v.target===e&&++i>=c&&f()};setTimeout(()=>{i(n[_]||"").split(", "),o=r(`${Dt}Delay`),l=r(`${Dt}Duration`),a=Va(o,l),s=r(`${Hn}Delay`),c=r(`${Hn}Duration`),u=Va(s,c);let i=null,f=0,p=0;t===Dt?a>0&&(i=Dt,f=a,p=l.length):t===Hn?u>0&&(i=Hn,f=u,p=c.length):(f=Math.max(a,u),i=f>0?a>u?Dt:Hn:null,p=i?i===Dt?l.length:c.length:0);const v=i===Dt&&/\b(transform|all)(,|$)/.test(r(`${Dt}Property`).toString());return{type:i,timeout:f,propCount:p,hasTransform:v}}function Va(e,t){for(;e.lengthNa(n)+Na(e[r])))}function Na(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function Li(){return document.body.offsetHeight}const Oi=new WeakMap,Ai=new WeakMap,Pi={name:"TransitionGroup",props:Ce({},ep,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=sn(),r=ni();let o,l;return ai(()=>{if(!o.length)return;const a=e.moveClass||`${e.name||"v"}-move`;if(!ip(o[0].el,n.vnode.el,a))return;o.forEach(lp),o.forEach(ap);const s=o.filter(sp);Li(),s.forEach(c=>{const u=c.el,i=u.style;wt(u,a),i.transform=i.webkitTransform=i.transitionDuration="";const f=u._moveCb=p=>{p&&p.target!==u||(!p||/transform$/.test(p.propertyName))&&(u.removeEventListener("transitionend",f),u._moveCb=null,Mt(u,a))};u.addEventListener("transitionend",f)})}),()=>{const a=se(e),s=wi(a);let c=a.tag||Ke;o=l,l=t.default?Tl(t.default()):[];for(let u=0;udelete e.mode;Pi.props;const op=Pi;function lp(e){const t=e.el;t._moveCb&&t._moveCb(),t._enterCb&&t._enterCb()}function ap(e){Ai.set(e,e.el.getBoundingClientRect())}function sp(e){const t=Oi.get(e),n=Ai.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const l=e.el.style;return l.transform=l.webkitTransform=`translate(${r}px,${o}px)`,l.transitionDuration="0s",e}}function ip(e,t,n){const r=e.cloneNode();e._vtc&&e._vtc.forEach(a=>{a.split(/\s+/).forEach(s=>s&&r.classList.remove(s))}),n.split(/\s+/).forEach(a=>a&&r.classList.add(a)),r.style.display="none";const o=t.nodeType===1?t:t.parentNode;o.appendChild(r);const{hasTransform:l}=Ti(r);return o.removeChild(r),l}const cp=Ce({patchProp:Jf},Nf);let _o,ja=!1;function up(){return _o=ja?_o:mf(cp),ja=!0,_o}const dp=(...e)=>{const t=up().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=fp(r);if(o)return n(o,!0,o instanceof SVGElement)},t};function fp(e){return pe(e)?document.querySelector(e):e}const pp={"v-8daa1a0e":()=>b(()=>import("./index.html-9b9b4158.js"),[]).then(({data:e})=>e),"v-495a303e":()=>b(()=>import("./index.html-d9f41dac.js"),[]).then(({data:e})=>e),"v-7f4aff48":()=>b(()=>import("./index.html-308b9cfb.js"),[]).then(({data:e})=>e),"v-974caada":()=>b(()=>import("./index.html-fe59353c.js"),[]).then(({data:e})=>e),"v-174d6e92":()=>b(()=>import("./api.html-a4c0141d.js"),[]).then(({data:e})=>e),"v-50b2c6d0":()=>b(()=>import("./index.html-55ed2560.js"),[]).then(({data:e})=>e),"v-26c7c346":()=>b(()=>import("./changelog.html-fca83de8.js"),[]).then(({data:e})=>e),"v-7554a597":()=>b(()=>import("./contributing.html-3080332f.js"),[]).then(({data:e})=>e),"v-1605c99e":()=>b(()=>import("./guidelines.html-4ae07334.js"),[]).then(({data:e})=>e),"v-f6ea7b76":()=>b(()=>import("./package-structure.html-443c8c9c.js"),[]).then(({data:e})=>e),"v-2ff4a912":()=>b(()=>import("./versioning.html-fbe8ba14.js"),[]).then(({data:e})=>e),"v-cabbab28":()=>b(()=>import("./index.html-897ccc9a.js"),[]).then(({data:e})=>e),"v-4b7a327c":()=>b(()=>import("./file-formats.html-e7dbacd9.js"),[]).then(({data:e})=>e),"v-0669fc14":()=>b(()=>import("./overview.html-6ab61eb2.js"),[]).then(({data:e})=>e),"v-142be2c4":()=>b(()=>import("./serializers.html-fdbca821.js"),[]).then(({data:e})=>e),"v-4ce5761f":()=>b(()=>import("./task-list.html-137e9390.js"),[]).then(({data:e})=>e),"v-6cca6f5b":()=>b(()=>import("./index.html-803489df.js"),[]).then(({data:e})=>e),"v-35faf283":()=>b(()=>import("./docs.html-205e1811.js"),[]).then(({data:e})=>e),"v-23d1f10b":()=>b(()=>import("./technical-links.html-9084e979.js"),[]).then(({data:e})=>e),"v-6f27bb46":()=>b(()=>import("./index.html-6b27342d.js"),[]).then(({data:e})=>e),"v-14742194":()=>b(()=>import("./ci.html-83409b0c.js"),[]).then(({data:e})=>e),"v-9e17fb70":()=>b(()=>import("./debugging.html-a2143ec3.js"),[]).then(({data:e})=>e),"v-41f63175":()=>b(()=>import("./tests.html-c5c1daf8.js"),[]).then(({data:e})=>e),"v-6df5895a":()=>b(()=>import("./index.html-590bd862.js"),[]).then(({data:e})=>e),"v-0912a191":()=>b(()=>import("./adding-icons.html-f24fcef0.js"),[]).then(({data:e})=>e),"v-3b749041":()=>b(()=>import("./developing-ui-css.html-60144fe3.js"),[]).then(({data:e})=>e),"v-680c4ad5":()=>b(()=>import("./developing-ui-forms.html-44a4abad.js"),[]).then(({data:e})=>e),"v-79cd1776":()=>b(()=>import("./developing-ui-js.html-a314c253.js"),[]).then(({data:e})=>e),"v-286ba437":()=>b(()=>import("./developing-ui.html-ead98d81.js"),[]).then(({data:e})=>e),"v-0aeb53ac":()=>b(()=>import("./html-popups.html-fca1dc9e.js"),[]).then(({data:e})=>e),"v-23b84093":()=>b(()=>import("./index.html-d6c2101f.js"),[]).then(({data:e})=>e),"v-7d2e6031":()=>b(()=>import("./install.html-fee49c8c.js"),[]).then(({data:e})=>e),"v-da6c54ee":()=>b(()=>import("./ui-layout.html-225dd165.js"),[]).then(({data:e})=>e),"v-dc289a5c":()=>b(()=>import("./ui.html-aeff420e.js"),[]).then(({data:e})=>e),"v-3aecceec":()=>b(()=>import("./uninstall.html-b31faa15.js"),[]).then(({data:e})=>e),"v-97a4d760":()=>b(()=>import("./upgrade.html-e805da86.js"),[]).then(({data:e})=>e),"v-79352e7b":()=>b(()=>import("./index.html-b9ee809f.js"),[]).then(({data:e})=>e),"v-b753c16a":()=>b(()=>import("./articles-and-presentations.html-da5d93f1.js"),[]).then(({data:e})=>e),"v-8ffe8b28":()=>b(()=>import("./logos.html-162bb7f0.js"),[]).then(({data:e})=>e),"v-b4d4656a":()=>b(()=>import("./regular-backup.html-8acf0655.js"),[]).then(({data:e})=>e),"v-5c3b6510":()=>b(()=>import("./saplink.html-6b1a2306.js"),[]).then(({data:e})=>e),"v-b86e8c0a":()=>b(()=>import("./where-used.html-450401fa.js"),[]).then(({data:e})=>e),"v-c774b90c":()=>b(()=>import("./xml-mismatch.html-f032586f.js"),[]).then(({data:e})=>e),"v-52841e19":()=>b(()=>import("./index.html-31ff22f4.js"),[]).then(({data:e})=>e),"v-741130c0":()=>b(()=>import("./index.html-6920104c.js"),[]).then(({data:e})=>e),"v-0de740f9":()=>b(()=>import("./abap-language-version.html-c24cf374.js"),[]).then(({data:e})=>e),"v-088182bf":()=>b(()=>import("./apack.html-5c6a9fb4.js"),[]).then(({data:e})=>e),"v-4959a65f":()=>b(()=>import("./authorizations.html-f35033f9.js"),[]).then(({data:e})=>e),"v-72455036":()=>b(()=>import("./database-util.html-3f1e5915.js"),[]).then(({data:e})=>e),"v-4bc4da84":()=>b(()=>import("./exits.html-75a7360f.js"),[]).then(({data:e})=>e),"v-43980e6a":()=>b(()=>import("./flow.html-ccffb026.js"),[]).then(({data:e})=>e),"v-78e86c96":()=>b(()=>import("./folders-filenames.html-2b163229.js"),[]).then(({data:e})=>e),"v-71ce9558":()=>b(()=>import("./hotkeys.html-8b36de00.js"),[]).then(({data:e})=>e),"v-252f2d9f":()=>b(()=>import("./icons.html-154106d3.js"),[]).then(({data:e})=>e),"v-3914cc7e":()=>b(()=>import("./namespaces.html-00d9e871.js"),[]).then(({data:e})=>e),"v-1d61fcf8":()=>b(()=>import("./note-analyzer.html-164b616a.js"),[]).then(({data:e})=>e),"v-47821728":()=>b(()=>import("./packages.html-f02402e5.js"),[]).then(({data:e})=>e),"v-f51e8eea":()=>b(()=>import("./supported.html-1a5d1199.js"),[]).then(({data:e})=>e),"v-ec7a72d2":()=>b(()=>import("./translations.html-59a405ca.js"),[]).then(({data:e})=>e),"v-01e98f2d":()=>b(()=>import("./index.html-189dc5d5.js"),[]).then(({data:e})=>e),"v-d7ac3c38":()=>b(()=>import("./background-mode.html-75123a5b.js"),[]).then(({data:e})=>e),"v-17c01b88":()=>b(()=>import("./dot-abapgit.html-10b2e95c.js"),[]).then(({data:e})=>e),"v-ac98f18a":()=>b(()=>import("./local.html-66891a46.js"),[]).then(({data:e})=>e),"v-0be4b1f4":()=>b(()=>import("./remote.html-24ea83d4.js"),[]).then(({data:e})=>e),"v-6651c287":()=>b(()=>import("./stats.html-7906d7bc.js"),[]).then(({data:e})=>e),"v-7f3ae0ae":()=>b(()=>import("./index.html-a007e1b8.js"),[]).then(({data:e})=>e),"v-43307cf2":()=>b(()=>import("./sapgui.html-96daaaed.js"),[]).then(({data:e})=>e),"v-218e7a1a":()=>b(()=>import("./settings-global.html-12660f12.js"),[]).then(({data:e})=>e),"v-d7087ec6":()=>b(()=>import("./settings-personal.html-9ca63b6f.js"),[]).then(({data:e})=>e),"v-b4e259ea":()=>b(()=>import("./ssl-setup.html-6161ed06.js"),[]).then(({data:e})=>e),"v-362eb318":()=>b(()=>import("./ssl-test.html-f015a542.js"),[]).then(({data:e})=>e),"v-3e76b876":()=>b(()=>import("./index.html-4cd63ea8.js"),[]).then(({data:e})=>e),"v-7bddc9ec":()=>b(()=>import("./export-zip.html-61c11160.js"),[]).then(({data:e})=>e),"v-3ad8b04d":()=>b(()=>import("./import-rfc.html-a1eb0300.js"),[]).then(({data:e})=>e),"v-2ec3c91b":()=>b(()=>import("./import-zip.html-f068cd5e.js"),[]).then(({data:e})=>e),"v-49558863":()=>b(()=>import("./install.html-790d4438.js"),[]).then(({data:e})=>e),"v-6a30cffa":()=>b(()=>import("./index.html-668975ce.js"),[]).then(({data:e})=>e),"v-fd49d704":()=>b(()=>import("./authentication.html-e8bc75fd.js"),[]).then(({data:e})=>e),"v-c87ae4e8":()=>b(()=>import("./contributing.html-a00e311e.js"),[]).then(({data:e})=>e),"v-755a2ac0":()=>b(()=>import("./first-project.html-8e904f05.js"),[]).then(({data:e})=>e),"v-9333e0be":()=>b(()=>import("./install.html-e7b99895.js"),[]).then(({data:e})=>e),"v-aa70c2e2":()=>b(()=>import("./moving-package.html-0a98281b.js"),[]).then(({data:e})=>e),"v-d3eccfe0":()=>b(()=>import("./stage-commit.html-02ecf59b.js"),[]).then(({data:e})=>e),"v-c9cf1466":()=>b(()=>import("./update.html-876754d3.js"),[]).then(({data:e})=>e),"v-5a4f9bf2":()=>b(()=>import("./index.html-d3fe7e49.js"),[]).then(({data:e})=>e),"v-c7dbbcae":()=>b(()=>import("./uninstall.html-2610c469.js"),[]).then(({data:e})=>e),"v-3706649a":()=>b(()=>import("./404.html-e98d903c.js"),[]).then(({data:e})=>e)},vp=JSON.parse('{"base":"/","lang":"en-US","title":"","description":"","head":[["link",{"rel":"icon","href":"/favicon.svg"}]],"locales":{"/":{"lang":"en-US","title":"abapGit Docs","description":"A git client for ABAP developed in ABAP"}}}');var hp=([e,t,n])=>e==="meta"&&t.name?`${e}.${t.name}`:["title","base"].includes(e)?e:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,t,n]),mp=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=hp(r);t.has(o)||(t.add(o),n.push(r))}),n},gp=e=>e[e.length-1]==="/"||e.endsWith(".html")?e:`${e}/`,_p=e=>e.startsWith("ftp://"),Nn=e=>/^(https?:)?\/\//.test(e),bp=/.md((\?|#).*)?$/,Br=(e,t="/")=>!!(Nn(e)||_p(e)||e.startsWith("/")&&!e.startsWith(t)&&!bp.test(e)),Ci=e=>/^mailto:/.test(e),yp=e=>/^tel:/.test(e),eo=e=>Object.prototype.toString.call(e)==="[object Object]",xl=e=>e[e.length-1]==="/"?e.slice(0,-1):e,ki=e=>e[0]==="/"?e.slice(1):e,Ep=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const l=o.split("/").length-r.split("/").length;return l!==0?l:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"};const xi={"v-8daa1a0e":S(()=>b(()=>import("./index.html-6f813e88.js"),["assets/index.html-6f813e88.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-495a303e":S(()=>b(()=>import("./index.html-fb54a56d.js"),["assets/index.html-fb54a56d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7f4aff48":S(()=>b(()=>import("./index.html-908842e5.js"),["assets/index.html-908842e5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-974caada":S(()=>b(()=>import("./index.html-947827a6.js"),["assets/index.html-947827a6.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-174d6e92":S(()=>b(()=>import("./api.html-19da73c6.js"),["assets/api.html-19da73c6.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-50b2c6d0":S(()=>b(()=>import("./index.html-cdc1bfc2.js"),["assets/index.html-cdc1bfc2.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-26c7c346":S(()=>b(()=>import("./changelog.html-2f3a5813.js"),["assets/changelog.html-2f3a5813.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7554a597":S(()=>b(()=>import("./contributing.html-4c553deb.js"),["assets/contributing.html-4c553deb.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1605c99e":S(()=>b(()=>import("./guidelines.html-20382010.js"),["assets/guidelines.html-20382010.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-f6ea7b76":S(()=>b(()=>import("./package-structure.html-acde660a.js"),["assets/package-structure.html-acde660a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2ff4a912":S(()=>b(()=>import("./versioning.html-72f0c2b5.js"),["assets/versioning.html-72f0c2b5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-cabbab28":S(()=>b(()=>import("./index.html-715ec0ce.js"),["assets/index.html-715ec0ce.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4b7a327c":S(()=>b(()=>import("./file-formats.html-24602ad6.js"),["assets/file-formats.html-24602ad6.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0669fc14":S(()=>b(()=>import("./overview.html-0cba9519.js"),["assets/overview.html-0cba9519.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-142be2c4":S(()=>b(()=>import("./serializers.html-4b6893d4.js"),["assets/serializers.html-4b6893d4.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4ce5761f":S(()=>b(()=>import("./task-list.html-3d9be1cb.js"),["assets/task-list.html-3d9be1cb.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6cca6f5b":S(()=>b(()=>import("./index.html-12c466c1.js"),["assets/index.html-12c466c1.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-35faf283":S(()=>b(()=>import("./docs.html-2c4da44a.js"),["assets/docs.html-2c4da44a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-23d1f10b":S(()=>b(()=>import("./technical-links.html-854fae85.js"),["assets/technical-links.html-854fae85.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6f27bb46":S(()=>b(()=>import("./index.html-a7de2b72.js"),["assets/index.html-a7de2b72.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-14742194":S(()=>b(()=>import("./ci.html-e5034ec3.js"),["assets/ci.html-e5034ec3.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-9e17fb70":S(()=>b(()=>import("./debugging.html-ab1ba97e.js"),["assets/debugging.html-ab1ba97e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-41f63175":S(()=>b(()=>import("./tests.html-5f20995c.js"),["assets/tests.html-5f20995c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6df5895a":S(()=>b(()=>import("./index.html-c446198a.js"),["assets/index.html-c446198a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0912a191":S(()=>b(()=>import("./adding-icons.html-1b731554.js"),["assets/adding-icons.html-1b731554.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3b749041":S(()=>b(()=>import("./developing-ui-css.html-af660802.js"),["assets/developing-ui-css.html-af660802.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-680c4ad5":S(()=>b(()=>import("./developing-ui-forms.html-ec55720f.js"),["assets/developing-ui-forms.html-ec55720f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-79cd1776":S(()=>b(()=>import("./developing-ui-js.html-149cbc7b.js"),["assets/developing-ui-js.html-149cbc7b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-286ba437":S(()=>b(()=>import("./developing-ui.html-af82e18c.js"),["assets/developing-ui.html-af82e18c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0aeb53ac":S(()=>b(()=>import("./html-popups.html-5e9763c3.js"),["assets/html-popups.html-5e9763c3.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-23b84093":S(()=>b(()=>import("./index.html-d11d6bfe.js"),["assets/index.html-d11d6bfe.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7d2e6031":S(()=>b(()=>import("./install.html-16633024.js"),["assets/install.html-16633024.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-da6c54ee":S(()=>b(()=>import("./ui-layout.html-899d6567.js"),["assets/ui-layout.html-899d6567.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-dc289a5c":S(()=>b(()=>import("./ui.html-e72ad03b.js"),["assets/ui.html-e72ad03b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3aecceec":S(()=>b(()=>import("./uninstall.html-9287b92e.js"),["assets/uninstall.html-9287b92e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-97a4d760":S(()=>b(()=>import("./upgrade.html-5a87dd79.js"),["assets/upgrade.html-5a87dd79.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-79352e7b":S(()=>b(()=>import("./index.html-0359a6e4.js"),["assets/index.html-0359a6e4.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b753c16a":S(()=>b(()=>import("./articles-and-presentations.html-c2e1b643.js"),["assets/articles-and-presentations.html-c2e1b643.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8ffe8b28":S(()=>b(()=>import("./logos.html-5461a446.js"),["assets/logos.html-5461a446.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b4d4656a":S(()=>b(()=>import("./regular-backup.html-3cca7c49.js"),["assets/regular-backup.html-3cca7c49.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5c3b6510":S(()=>b(()=>import("./saplink.html-1ecf2d1a.js"),["assets/saplink.html-1ecf2d1a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b86e8c0a":S(()=>b(()=>import("./where-used.html-4a8f770e.js"),["assets/where-used.html-4a8f770e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c774b90c":S(()=>b(()=>import("./xml-mismatch.html-639045c1.js"),["assets/xml-mismatch.html-639045c1.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-52841e19":S(()=>b(()=>import("./index.html-601628ab.js"),["assets/index.html-601628ab.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-741130c0":S(()=>b(()=>import("./index.html-43a91367.js"),["assets/index.html-43a91367.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0de740f9":S(()=>b(()=>import("./abap-language-version.html-a3ba08dc.js"),["assets/abap-language-version.html-a3ba08dc.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-088182bf":S(()=>b(()=>import("./apack.html-8b739e8b.js"),["assets/apack.html-8b739e8b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4959a65f":S(()=>b(()=>import("./authorizations.html-dc1e77a4.js"),["assets/authorizations.html-dc1e77a4.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-72455036":S(()=>b(()=>import("./database-util.html-a7051021.js"),["assets/database-util.html-a7051021.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4bc4da84":S(()=>b(()=>import("./exits.html-05235aef.js"),["assets/exits.html-05235aef.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-43980e6a":S(()=>b(()=>import("./flow.html-51f326e7.js"),["assets/flow.html-51f326e7.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-78e86c96":S(()=>b(()=>import("./folders-filenames.html-60308b71.js"),["assets/folders-filenames.html-60308b71.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-71ce9558":S(()=>b(()=>import("./hotkeys.html-17751f3f.js"),["assets/hotkeys.html-17751f3f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-252f2d9f":S(()=>b(()=>import("./icons.html-458bfc3e.js"),["assets/icons.html-458bfc3e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3914cc7e":S(()=>b(()=>import("./namespaces.html-7dc5a562.js"),["assets/namespaces.html-7dc5a562.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1d61fcf8":S(()=>b(()=>import("./note-analyzer.html-42bbb90b.js"),["assets/note-analyzer.html-42bbb90b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-47821728":S(()=>b(()=>import("./packages.html-97389502.js"),["assets/packages.html-97389502.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-f51e8eea":S(()=>b(()=>import("./supported.html-6f826579.js"),["assets/supported.html-6f826579.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-ec7a72d2":S(()=>b(()=>import("./translations.html-fa14b9b8.js"),["assets/translations.html-fa14b9b8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-01e98f2d":S(()=>b(()=>import("./index.html-6ca5426f.js"),["assets/index.html-6ca5426f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d7ac3c38":S(()=>b(()=>import("./background-mode.html-d87d876e.js"),["assets/background-mode.html-d87d876e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-17c01b88":S(()=>b(()=>import("./dot-abapgit.html-91c2b034.js"),["assets/dot-abapgit.html-91c2b034.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-ac98f18a":S(()=>b(()=>import("./local.html-16087404.js"),["assets/local.html-16087404.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0be4b1f4":S(()=>b(()=>import("./remote.html-1859a9d9.js"),["assets/remote.html-1859a9d9.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6651c287":S(()=>b(()=>import("./stats.html-2f01052c.js"),["assets/stats.html-2f01052c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7f3ae0ae":S(()=>b(()=>import("./index.html-1f49b8f4.js"),["assets/index.html-1f49b8f4.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-43307cf2":S(()=>b(()=>import("./sapgui.html-c5567cb8.js"),["assets/sapgui.html-c5567cb8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-218e7a1a":S(()=>b(()=>import("./settings-global.html-dcdd1981.js"),["assets/settings-global.html-dcdd1981.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d7087ec6":S(()=>b(()=>import("./settings-personal.html-68eff1a8.js"),["assets/settings-personal.html-68eff1a8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b4e259ea":S(()=>b(()=>import("./ssl-setup.html-661b62de.js"),["assets/ssl-setup.html-661b62de.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-362eb318":S(()=>b(()=>import("./ssl-test.html-963052bb.js"),["assets/ssl-test.html-963052bb.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3e76b876":S(()=>b(()=>import("./index.html-1beca520.js"),["assets/index.html-1beca520.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7bddc9ec":S(()=>b(()=>import("./export-zip.html-ce2b6e88.js"),["assets/export-zip.html-ce2b6e88.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3ad8b04d":S(()=>b(()=>import("./import-rfc.html-047af858.js"),["assets/import-rfc.html-047af858.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2ec3c91b":S(()=>b(()=>import("./import-zip.html-6faf5750.js"),["assets/import-zip.html-6faf5750.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-49558863":S(()=>b(()=>import("./install.html-e0728372.js"),["assets/install.html-e0728372.js","assets/start-b8c8f9c6.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6a30cffa":S(()=>b(()=>import("./index.html-01c65dc5.js"),["assets/index.html-01c65dc5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-fd49d704":S(()=>b(()=>import("./authentication.html-88066d6d.js"),["assets/authentication.html-88066d6d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c87ae4e8":S(()=>b(()=>import("./contributing.html-25604377.js"),["assets/contributing.html-25604377.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-755a2ac0":S(()=>b(()=>import("./first-project.html-30d88d30.js"),["assets/first-project.html-30d88d30.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-9333e0be":S(()=>b(()=>import("./install.html-962832fa.js"),["assets/install.html-962832fa.js","assets/start-b8c8f9c6.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-aa70c2e2":S(()=>b(()=>import("./moving-package.html-78463ed5.js"),["assets/moving-package.html-78463ed5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d3eccfe0":S(()=>b(()=>import("./stage-commit.html-66ba51f5.js"),["assets/stage-commit.html-66ba51f5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c9cf1466":S(()=>b(()=>import("./update.html-fe369d78.js"),["assets/update.html-fe369d78.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5a4f9bf2":S(()=>b(()=>import("./index.html-71fb0feb.js"),["assets/index.html-71fb0feb.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c7dbbcae":S(()=>b(()=>import("./uninstall.html-b6cd6e34.js"),["assets/uninstall.html-b6cd6e34.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3706649a":S(()=>b(()=>import("./404.html-75521e3a.js"),["assets/404.html-75521e3a.js","assets/plugin-vue_export-helper-c27b6911.js"]))};var wp=Symbol(""),Tp=K(pp),Ii=ln({key:"",path:"",title:"",lang:"",frontmatter:{},headers:[]}),Nt=K(Ii),ge=()=>Nt,Ri=Symbol(""),Ie=()=>{const e=ye(Ri);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},Si=Symbol(""),Lp=()=>{const e=ye(Si);if(!e)throw new Error("usePageHead() is called without provider.");return e},Op=Symbol(""),Di=Symbol(""),$i=()=>{const e=ye(Di);if(!e)throw new Error("usePageLang() is called without provider.");return e},Mi=Symbol(""),Ap=()=>{const e=ye(Mi);if(!e)throw new Error("usePageLayout() is called without provider.");return e},Il=Symbol(""),cn=()=>{const e=ye(Il);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},_n=K(vp),Pp=()=>_n,Vi=Symbol(""),to=()=>{const e=ye(Vi);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},Cp=Symbol(""),kp="Layout",xp="NotFound",Tt=ur({resolveLayouts:e=>e.reduce((t,n)=>({...t,...n.layouts}),{}),resolvePageData:async e=>{const t=Tp.value[e];return await(t==null?void 0:t())??Ii},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const r=pe(t.description)?t.description:n.description,o=[...J(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:r}]];return mp(o)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||"en-US",resolvePageLayout:(e,t)=>{let n;if(e.path){const r=e.frontmatter.layout;pe(r)?n=r:n=kp}else n=xp;return t[n]},resolveRouteLocale:(e,t)=>Ep(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),no=H({name:"ClientOnly",setup(e,t){const n=K(!1);return de(()=>{n.value=!0}),()=>{var r,o;return n.value?(o=(r=t.slots).default)==null?void 0:o.call(r):null}}}),Rl=H({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=ge(),n=A(()=>xi[e.pageKey||t.value.key]);return()=>n.value?d(n.value):d("div","404 Not Found")}}),pt=(e={})=>e,He=e=>Nn(e)?e:`/${ki(e)}`;const Ip={};/*!
       * vue-router v4.2.4
       * (c) 2023 Eduardo San Martin Morote
       * @license MIT
    @@ -20,4 +20,4 @@ ${e}
     __echarts_config__={width,height,option};
     }
     return __echarts_config__;
    -`)(n):Promise.resolve({option:JSON.parse(e)});var vh=H({name:"ECharts",props:{config:{type:String,required:!0},id:{type:String,required:!0},title:{type:String,default:""},type:{type:String,default:"json"}},setup(e){const t=K(!0),n=Oe();let r;return Pe("resize",Fl(()=>r==null?void 0:r.resize(),100)),de(()=>{Promise.all([b(()=>import("./index-2bf332f6.js"),[]),new Promise(o=>setTimeout(o,800))]).then(async([o])=>{r=o.init(n.value);const{option:l,...a}=await ph(on(e.config),e.type,r);r.resize(a),r.setOption(l),t.value=!1})}),kt(()=>{r==null||r.dispose()}),()=>[e.title?d("div",{class:"echarts-title"},decodeURIComponent(e.title)):null,d("div",{class:"echarts-wrapper"},[d("div",{ref:n,class:"echarts-container",id:e.id}),t.value?d(un,{class:"echarts-loading",height:360}):null])]}});var Ul={x:0,y:0,"line-width":2,"line-length":40,"text-margin":8,"font-size":14,"font-color":"#8DA1AC","line-color":"#8DA1AC","element-color":"black",fill:"white","yes-text":"Yes","no-text":"No","arrow-end":"block",scale:1},hh={...Ul,symbols:{start:{class:"start-element","font-color":"#fff",fill:"#595959","line-width":"0px"},end:{class:"end-element","font-color":"#fff",fill:"#595959","line-width":"0px"},operation:{class:"operation-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"},inputoutput:{class:"inputoutput-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"},subroutine:{class:"subroutine-element","font-color":"#fff",fill:"#FF485E","element-color":"#fff","line-color":"red"},condition:{class:"condition-element","font-color":"#fff",fill:"#FF485E","line-width":"0px"},parallel:{class:"parallel-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"}}},mh={...Ul,"line-width":1,symbols:{start:{class:"start-element",fill:"#ccc","line-color":"#5c6ac4","font-color":"#000"},end:{class:"end-element",fill:"#ccc","line-color":"#5c6ac4","font-color":"#000"},operation:{class:"operation-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},inputoutput:{class:"inputoutput-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},subroutine:{class:"subroutine-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},condition:{class:"condition-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},parallel:{class:"parallel-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"}}},gh={...Ul,symbols:{start:{class:"start-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"},end:{class:"end-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"},operation:{class:"operation-element","font-color":"#fff",fill:"#00BC7D","line-width":"0px"},inputoutput:{class:"inputoutput-element","font-color":"#fff",fill:"#EB4D5D","line-width":"0px"},subroutine:{class:"subroutine-element","font-color":"#fff",fill:"#937AC4","element-color":"#fff","line-color":"red"},condition:{class:"condition-element","font-color":"#fff",fill:"#FFB500","line-width":"0px"},parallel:{class:"parallel-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"}}};const Ls={ant:hh,vue:gh,pie:mh};var _h=H({name:"FlowChart",props:{code:{type:String,required:!0},id:{type:String,required:!0},preset:{type:String,default:"vue"}},setup(e){let t=null;const n=Oe(),r=K(!0),o=K(1),l=A(()=>Ls[e.preset]||(console.warn(`[md-enhance:flowchart] Unknown preset: ${e.preset}`),Ls.vue)),a=s=>s<419?.8:s>1280?1:.9;return de(()=>{Promise.all([b(()=>import("./flowchart-c441f34d.js"),[]),new Promise(s=>setTimeout(s,800))]).then(([{parse:s}])=>{t=s(on(e.code)),o.value=a(window.innerWidth),r.value=!1,t.draw(e.id,{...l.value,scale:o.value})}),Pe("resize",Fl(()=>{if(t){const s=a(window.innerWidth);o.value!==s&&(o.value=s,t.draw(e.id,{...l.value,scale:s}))}},100))}),()=>[r.value?d(un,{class:"flowchart-loading",height:192}):null,d("div",{ref:n,class:["flowchart-wrapper",e.preset],id:e.id,style:{display:r.value?"none":"block"}})]}});let bh={};const $c=Symbol(""),yh=()=>ye($c),Eh=e=>{e.provide($c,bh)},hn={useMaxWidth:!1},wh=e=>({dark:e,background:e?"#1e1e1e":"#fff",primaryColor:e?"#389d70":"#4abf8a",primaryBorderColor:e?"#389d70":"#4abf8a",primaryTextColor:"#fff",secondaryColor:"#ffb500",secondaryBorderColor:e?"#fff":"#000",secondaryTextColor:e?"#ddd":"#333",tertiaryColor:e?"#282828":"#efeef4",tertiaryBorderColor:e?"#bbb":"#242424",tertiaryTextColor:e?"#ddd":"#333",noteBkgColor:e?"#f6d365":"#fff5ad",noteTextColor:"#242424",noteBorderColor:e?"#f6d365":"#333",lineColor:e?"#d3d3d3":"#333",textColor:e?"#fff":"#242424",mainBkg:e?"#389d70":"#4abf8a",errorBkgColor:"#eb4d5d",errorTextColor:"#fff",nodeBorder:e?"#389d70":"#4abf8a",nodeTextColor:e?"#fff":"#242424",signalTextColor:e?"#9e9e9e":"#242424",classText:"#fff",labelColor:"#fff",fillType0:e?"#cf1322":"#f1636e",fillType1:"#f39c12",fillType2:"#2ecc71",fillType3:"#fa541c",fillType4:"#25a55b",fillType5:"#13c2c2",fillType6:"#096dd9",fillType7:"#aa6fe9"});var Th=H({name:"Mermaid",props:{id:{type:String,required:!0},code:{type:String,required:!0}},setup(e){const{themeVariables:t,...n}=yh(),r=Oe(),o=A(()=>on(e.code)),l=K(""),a=K(!1),s=async()=>{const[{default:i}]=await Promise.all([b(()=>import("./mermaid.core-a984388e.js").then(f=>f.aP),[]),new Promise(f=>setTimeout(f,800))]);i.initialize({theme:"base",themeVariables:{...wh(a.value),...i1(t)?t(a.value):t},flowchart:hn,sequence:hn,journey:hn,gantt:hn,er:hn,pie:hn,...n,startOnLoad:!1}),l.value=(await i.render(e.id,o.value)).svg},c=()=>{const{body:i}=document,f=document.createElement("div");f.classList.add("mermaid-preview"),f.innerHTML=l.value,i.appendChild(f),f.addEventListener("click",()=>{i.removeChild(f)})},u=()=>{const i=`data:image/svg+xml;charset=utf8,${l.value.replace(/
    /g,"
    ").replace(/%/g,"%25").replace(/"/g,"%22").replace(/'/g,"%27").replace(/&/g,"%26").replace(/#/g,"%23").replace(/{/g,"%7B").replace(/}/g,"%7D").replace(//g,"%3E")}`,f=document.createElement("a");f.setAttribute("href",i),f.setAttribute("download",`${e.id}.svg`),f.click()};return de(()=>{const i=document.documentElement,f=()=>i.classList.contains("dark")||i.getAttribute("data-theme")==="dark";a.value=f(),s(),r0(i,()=>{a.value=f()},{attributeFilter:["class","data-theme"],attributes:!0}),ae(a,()=>s())}),()=>[d("div",{class:"mermaid-actions"},[d("button",{class:"preview-button",onClick:()=>c(),title:"preview",innerHTML:''}),d("button",{class:"download-button",onClick:()=>u(),title:"download",innerHTML:''})]),d("div",{ref:r,class:"mermaid-wrapper"},l.value?d("div",{class:"mermaid-content",innerHTML:l.value}):d(un,{class:"mermaid-loading",height:96}))]}});let Lh={};const Mc=Symbol(""),Oh=()=>ye(Mc),Ah=e=>{e.provide(Mc,Lh)},Ph=()=>b(()=>import("./highlight.esm-75b11b9d.js"),[]),Ch=()=>b(()=>import("./markdown.esm-abe06b83.js"),[]),kh=()=>b(()=>import("./math.esm-70a288c8.js"),[]),xh=()=>b(()=>import("./notes.esm-a106bb2c.js"),[]),Ih=()=>b(()=>import("./reveal.esm-ec5549c1.js"),[]),Rh=()=>b(()=>import("./search.esm-7e6792e2.js"),[]),Sh=()=>b(()=>import("./zoom.esm-b83b91d0.js"),[]);const Dh=()=>[Ih(),Ch(),Ph(),kh(),Rh(),xh(),Sh()];var $h=H({name:"Presentation",props:{id:{type:String,required:!0},code:{type:String,required:!0},theme:{type:String,default:"auto"}},setup(e){const t=Oh(),n=Ie(),r=K(""),o=K(!0),l=Oe();let a=null;const s=async c=>{const u=[new Promise(v=>setTimeout(v,800)),...Dh()],[,i,...f]=await Promise.all(u),p=new i.default(c,{backgroundTransition:"slide",hash:n.value.layout==="Slide",mouseWheel:n.value.layout==="Slide",transition:"slide",slideNumber:!0,...t,...n.value.reveal||{},embedded:n.value.layout!=="Slide",plugins:[...f.map(({default:v})=>v),...t.plugins??[]]});return await p.initialize(),p};return de(async()=>{const c=l.value;c&&(r.value=on(e.code),c.setAttribute("id",e.id),c.setAttribute("data-theme",e.theme),a=await s(c),o.value=!1)}),kt(()=>{a==null||a.destroy()}),()=>d("div",{class:"vp-reveal"},[d("div",{ref:l,class:["reveal","reveal-viewport"]},d("div",{class:"slides",innerHTML:`
    - +
    Skip to main content

    API

    abapGitAbout 4 minapi

    This page describes how to execute various abapGit tasks using your code.

    Note

    These classes and methods have existed for quite some time and are stable.
    However, they do not provide a guaranteed API. Future changes are a possibility.

    Repositories

    Create Online

    Create a new abapGit repository for a given online project and branch and associate it with an SAP package:

    DATA(lo_repo) = zcl_abapgit_repo_srv=>get_instance( )->new_online(
    @@ -207,6 +207,6 @@
       iv_path = lv_file_with_path
       iv_xstr = lv_xstr ).
     

    Progress Indicator

    The default progress indicator shows progress in SAP GUI, however, it is possible to inject a custom progress indicator via ZCL_ABAPGIT_PROGRESS=>SET_INSTANCE which can catch the status in non-SAP GUI scenarios.

    - + diff --git a/development-guide/api/index.html b/development-guide/api/index.html index 5b0a23d5e..cca014d19 100644 --- a/development-guide/api/index.html +++ b/development-guide/api/index.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    API

    abapGitLess than 1 minute

    Catalog

    - + diff --git a/development-guide/index.html b/development-guide/index.html index e29079916..63cbb1bda 100644 --- a/development-guide/index.html +++ b/development-guide/index.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    Development Guide

    abapGitLess than 1 minute

    - + diff --git a/development-guide/read-first/changelog.html b/development-guide/read-first/changelog.html index 8b729ae62..aeacb871c 100644 --- a/development-guide/read-first/changelog.html +++ b/development-guide/read-first/changelog.html @@ -31,7 +31,7 @@ } - +
    Skip to main content

    Changelog

    abapGitLess than 1 minuteread-first

    abapGit allows showing a changelog notes, based on the changelog file in the repository base, and on APACK class containing the current version.

    abapGit itself does not use APACK and gets the current version from zif_abapgit_version=>c_abap_version. The version is then used to determine if the changelog was updated and should be shown to the user.

    Here's what the settings look like for another repository:

    version_setup
    version_setup

    File format

    A file named with pattern CHANGELOG* or changelog*

    The changelog file should have a specific format:

    Header with the title

    abapGit changelog
    @@ -46,6 +46,6 @@
     ------------------
     + Notes.....
     

    Check abapGit changelogopen in new window as an example.

    - + diff --git a/development-guide/read-first/contributing.html b/development-guide/read-first/contributing.html index 963224634..c02526c5e 100644 --- a/development-guide/read-first/contributing.html +++ b/development-guide/read-first/contributing.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    Contributing

    abapGitAbout 1 minread-first

    General contribution guidelines can be found hereopen in new window.

    How to submit a pull request:


    Having already installed the abapGit standalone program,

    1. Install the development version of abapGit, by running ZABAPGIT_STANDALONE and either:

      1. cloning your own forkopen in new window of the abapGit repositoryopen in new window using abapGit's "New Online" option or
      2. downloading the zip file and installing it using the "New Offline" option
    2. When specifying a package for the repository in step 1, assign a different (new, e.g. $ZABAPGIT) package to the one ZABAPGIT_STANDALONE is in

    3. Your system will now contain the abapGit package, along with several sub-packages and development objects such as classes, interfaces, function groups, etc. There will also be the development version of the abapGit program (transaction ZABAPGIT). The standalone program, ZABAPGIT_STANDALONE will remain unaffected, to serve as fallback.

    4. Make your changes to abapGit development objects and test locally.

    5. Using abapGit on your system, commit the changes to your online fork (so if you had chosen the "offline" option in step 1, you will need to have switched to online).

    6. Submit a pull requestopen in new window with the changes.

    Alternatively to the steps above, use the GitHub web interface to change the files directly on a GitHub branch of your forked abapGit repository and then submit a pull request. This might make sense when, e.g., contributing to the documentation files such as the one you are reading right now (where contributions may be initiated through the "Edit this page" link below).

    If you already have an old fork and would like to create a new pull request, you can sync your old fork to the current state following this guide: Sync your fork to original repositoryopen in new window.

    After your pull request is merged to the abapGit default branch, abapmerge will automatically run to build the standalone report version of abapGit. Every time a commit is pushed to the default branch, GitHub Actions is triggered to perform this build. It uses abapmergeopen in new window to merge all the includes into a single file (the standalone version) which can be downloaded from hereopen in new window

    - + diff --git a/development-guide/read-first/guidelines.html b/development-guide/read-first/guidelines.html index 61602efca..90fccb62a 100644 --- a/development-guide/read-first/guidelines.html +++ b/development-guide/read-first/guidelines.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    Development Guidelines

    abapGitAbout 2 minread-first

    Object Types

    abapGit is merged into a stand-alone version. For this reason, the only allowed object types for new repository objects are classes and interfaces. In particular, function groups or modules must not be included.

    Exceptions for existing objects:

    • Transaction ZABAPGIT
    • Program ZABAPGIT and includes
    • Function group ZABAPGIT_PARALLEL for parallel serialization (only available in the developer version)
    • MIME objects ZABAPGIT_* for UI (CSS, JS, and fonts)

    Conventions

    Naming

    Object Prefixing

    Classes and interfaces are prefixed using zcl_abapgit_ or zif_abapgit_ (zcx_abapgit_ for exception classes, lcl_ and ltcl_ for local and test classes).

    Object Descriptions

    The description of objects should begin with abapGit - ... (for example, abapGit - Repository Content List). For serializer classes, the text should contain the TADIR object type and description (for example, abapGit - INTF - Interface (ABAP Objects)).

    Variable Prefixing

    Variables are prefixed using the standard setting in abapOpenChecks Naming Conventionsopen in new window

    Downport

    Syntax

    abapGit is targeted for version 7.02open in new window and higher. Therefore, the code must only contain expressions and statements that work on 7.02.

    abaplintopen in new window will automatically check every pull request for language syntax that is compatible with 7.02.

    Standard Objects

    The code must only reference standard SAP objects (classes, interfaces, DDIC types) that exist in version 7.02 and higher. Referencing objects that do not exist in 7.02 creates syntax errors and therefore requires using dynamic ABAP. DDIC types that do not exist in 7.02 should be replaced by local type definitions.

    File Formats

    General file format guidelines are specified in .editorconfigopen in new window. If you are using abapGit to push files to the repository, these guidelines are followed automatically.

    If you are editing files outside of SAP GUI or ADT, for example on GitHub.comopen in new window or in VS Code, the most common issues are using cr instead of lf at end of line, missing new line at end of file, and missing BOM at beginning of XML files. Please ensure that your IDE is setup to follow the .editorconfig specifications to avoid any issues.

    For more details, see editorconfig.orgopen in new window.

    Info

    VS Code requires an extension for .editorconfig which you can find at marketplaceopen in new window.

    Formatting the Source Code

    Line Width

    The maximum width of ABAP source code should be set at 120 characters per line and is checked during linting.

    Pretty Printer

    Use pretty-printer, keywords upper case + indentation, abapOpenChecksopen in new window can be used for checking this.

    Dynpros

    For the user interface, we are moving towards everything in HTML, i.e. new Dynpro screens or the use of Dynpro screens and popups should not be added to the source code.

    abaplint

    Pull requests must pass all abaplint configured checks before they can be merged. You find the current rules in abaplint.jsonopen in new window.

    Info

    You can view abaplint findings directly in abapGit using an extensionopen in new window.

    eslint

    JavaScript is checked using eslint. You can find the rules hereopen in new window. All JavaScript code has to adhere to ES5 (ECMAScript 2009open in new window) to be compatible with the IE-based HTML browser control used in older releases of SAP GUI.

    Internationalization (I18N)

    abapGit supports only the English language. Neither objects nor text literals are translated. Therefore, all objects shall be set to English as the original language, and text literals in the code shall be maintained in English.

    Since there's only one language, using the ##NO_TEXT pragma is not required and will actually lead to lint errors. The exceptions are global class and interface definitions, where the pragmas are added automatically by SE24/SE80.

    - + diff --git a/development-guide/read-first/index.html b/development-guide/read-first/index.html index c98857c9f..cc16d7581 100644 --- a/development-guide/read-first/index.html +++ b/development-guide/read-first/index.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    Read First

    abapGitLess than 1 minute

    - + diff --git a/development-guide/read-first/package-structure.html b/development-guide/read-first/package-structure.html index c2f824949..479016a91 100644 --- a/development-guide/read-first/package-structure.html +++ b/development-guide/read-first/package-structure.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    Package Structure

    abapGitLess than 1 minuteread-first

    Package Structure

    Various conventions for packages,

    /src/git/

    Raw git client, uses http package

    Does not know about UI, objects or repositories, everything is file based.

    Ideally possible to run and use standalone

    /src/ui/core/

    UI framework

    Does not know about objects or repositories

    Ideally possible to run and use standalone

    /src/http/

    Raw http client

    Does not know about UI, objects or repositories

    Ideally possible to run and use standalone

    /src/json/

    Don't do any manual changes in this folder, its a renamed copy of https://github.com/sbcgua/ajsonopen in new window via https://github.com/abapGit/ajson_mirroropen in new window

    /src/objects/aff/

    Dont do any manual changes in this folder, mirroed from https://github.com/abapGit/aff_mirroropen in new window

    - + diff --git a/development-guide/read-first/versioning.html b/development-guide/read-first/versioning.html index 8af1eb524..77dfae59f 100644 --- a/development-guide/read-first/versioning.html +++ b/development-guide/read-first/versioning.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    Versioning

    abapGitAbout 1 minread-first

    abapGit is continuously developed and updated. The main branch always represents the latest development version and corresponds to the published standalone version.

    abapGit does not have a predefined release cycle. However, we strive to tag a new version once a month (or two).

    Version

    abapGit follows semantic versionopen in new window format. The community has settled on releasing enhancements and changes as minor versions. A more granular approach to releasing every change as a patch is adding too much overhead.

    Example release sequence: 1.118.0 > 1.119.0 > 1.120.0

    Changelog

    All additions, changes, fixes, and removals that are relevant to abapGit users are listed in the changelog.

    Reorgs, refactoring, or changes related to testing or repo actions are omitted from the changelog.

    Since abapGit is enforcing a linear history, you can find all changes in commit listopen in new window of the main branch.

    Process

    The following steps need to be taken to create a new abapGit version:

    1. Create a new branch name like the new version. For example, v1.121.0.
    2. Update zif_abapgit_versionopen in new window and increase the minor version of constant c_abap_version by one. Example: '1.120.0' > '1.121.'.
    3. Update changelog.txtopen in new window and add a section at the top for the new version.
    4. Compile a list of the relevant pull requests (see above) based on a comparison between the most recent tag and main. For example, v1.123.0 vs mainopen in new window.
    5. Label each change (PR) corresponding to the legend (*: fixed, !: changed, +: added, -: removed).
    6. Create a new, draft pull request from the new branch.
    7. Have the changes reviewed by someone else.
    8. On the release day, update the date in the changelog, and merge the pull request.

    The merge will trigger a GitHub action to automatically tag the new release and perform some downstream tasks (like updating the build repository).

    - + diff --git a/development-guide/serializers/file-formats.html b/development-guide/serializers/file-formats.html index 9addb2de7..3441658b6 100644 --- a/development-guide/serializers/file-formats.html +++ b/development-guide/serializers/file-formats.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    File Formats

    abapGitLess than 1 minuteserializers

    All files for an object are located in the same folder, each folder corresponds to a package. Sub-packages are organized under parent packages(directories) according to the logic described in the Repository Settings

    CLAS

    Files corresponding to the editable parts in source-based class builder or ABAP in Eclipse:

    • zcl_example.clas.abap
    • zcl_example.clas.locals_def.abap
    • zcl_example.clas.locals_imp.abap
    • zcl_example.clas.testclasses.abap
    • zcl_example.clas.macros.abap

    Files do not exist if empty, ie. the developer did not choose to implement it

    One XML file zcl_example.clas.xml containing:

    • VSEOCLASS information
    • TPOOL information
    • SOTR information
    • LINES from DOKU
    • Descriptions from SEOCOMPOTX

    See example https://github.com/abapGit-tests/CLAS_fullopen in new window

    - + diff --git a/development-guide/serializers/index.html b/development-guide/serializers/index.html index 4aa756c33..161adc5a0 100644 --- a/development-guide/serializers/index.html +++ b/development-guide/serializers/index.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    Serialization

    abapGitLess than 1 minute

    - + diff --git a/development-guide/serializers/overview.html b/development-guide/serializers/overview.html index 2724c446f..ba476cdc6 100644 --- a/development-guide/serializers/overview.html +++ b/development-guide/serializers/overview.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    Overview

    abapGitLess than 1 minuteserializers

    Overview

    An abapGit Serializer is an ABAP class that supports creating, reading, updating, and deleting (CRUD) objects of a given object type. In abapGit, the reading of an object is implemented in a serialize method. Create and update are combined into a deserialize method. There is a delete method to remove an object from the system.

    All object serializers must implement interface ZIF_ABAPGIT_OBJECT and be named ZCL_ABAPGIT_OBJECT_{type}, where {type} is the corresponding SAP object type (TADIR-OBJECT). As a description for the class, use {type} - {description of type} (for example, TABL - Table). It's recommended to use ZCL_ABAPGIT_OBJECTS_SUPER as a superclass since it provides several convenient methods.

    In general, only SAP Standard APIs for retrieving and updating object information shall be used. If that is not possible, try using ZCL_ABAPGIT_OBJECTS_GENERIC which handles any logical transport object.

    As code is stored in git, no usernames, timestamps, states (e.g. active/inactive), or other system-specific information should be part of the serialized object files. Only the active, most recent, and consistent version of an object shall be serialized.

    Auto-generated artifacts should be skipped if possible, for example, a CDS view might generate a VIEW artifact, and the VIEW should not be serialized, as it is not something the developer creates.

    If an inactive version of an object exists, the class shall indicate so in the is_active method. abapGit displays such objects with a yellow bolt icon in the repo view. However, the inactive version must be ignored by the serializer.

    As a result, a repo shall only contain the definition of active objects. Therefore, the deserializer can assume that the repo has a consistent object definition and shall create an active version of the object (or update and activate it).

    - + diff --git a/development-guide/serializers/serializers.html b/development-guide/serializers/serializers.html index 9ae3b73a2..4983ea35e 100644 --- a/development-guide/serializers/serializers.html +++ b/development-guide/serializers/serializers.html @@ -31,7 +31,7 @@ } - +
    Skip to main content

    Serializer Class

    abapGitAbout 5 minserializers

    Constructor

    The constructor is implemented in the superclass and takes two parameters as input:

    ParameterDescription
    IS_ITEMContains object type, object name, SAP package, and state (active/inactive)
    IV_LANGUAGEContains the language key for the main language of the repository

    These parameters are stored in attributes MS_ITEM and MV_LANGUAGE respectively.

    Requirements that are necessary to support an object type should be checked in the constructor using the following logic. This is typical if object types are not supported in lower releases.

      METHOD constructor.
    @@ -51,6 +51,6 @@
     
       ENDMETHOD.
     

    This will ensure that none of the other class methods are called, even if objects of the given type exist in a repo.

    Example: SRFCopen in new window.

    Interface

    Serializers must implement all methods of interface ZIF_ABAPGIT_OBJECTopen in new window:

    MethodDescription
    SERIALIZEContains all process steps to read the relevant object type-specific information and serialize it (as one or more files)
    DESERIALIZEContains all process steps to create or update an object based on one or more files
    DELETEContains all process steps to delete an object based on one or more files
    EXISTSReturns whether a given object already exists in any state (i.e. return abap_true for inactive objects)
    IS_LOCKEDReturns whether a given object is currently locked
    IS_ACTIVEReturns whether a given object exists in an active state
    CHANGED_BYReturns the name of the user who last changed a given object (if undetermined, return c_user_unknown)
    JUMPNavigates to the corresponding object maintenance screen
    GET_METADATAReturns object-specific metadata (see below)
    GET_COMPARATORTriggered before deserialization to perform checks (for example, to warn the user that database tables are changed)
    GET_DESERIALIZE_STEPSDefines the deserialzation step or steps used to build the processing sequence (see below)
    GET_DESERIALIZE_ORDERReturns the list of objects that shall be deserialized before an object (optional, see below)
    MAP_FILENAME_TO_OBJECTDerive the object from a given filename (optional)
    MAP_OBJECT_TO_FILENAMEDerive the filename from a given object (optional)

    Example: DOMAopen in new window.

    Metadata

    It is mandatory to provide the following metadata:

    AttributeDescription
    CLASSTechnical name used to identify the serializer within serialized XML files (format LCL_OBJECT_{type})
    VERSIONVersion number of the serializer (format v1.0.0)

    It's recommended to fill CLASS and VERSION metadata using SUPER->GET_METADATA( ) and then change settings as required.

    Deserialization Step

    It is mandatory to provide at least one deserialization step (see below).

    Deserialization Order

    This method is used to return a list of objects that shall be deserialized before the given object.

    Super Class

    Serializers can take advantage of the following methods in ZCL_ABAPGIT_OBJECTS_SUPERopen in new window:

    MethodDescription
    GET_METADATAReturn default metadata for class and version
    CORR_INSERTInsert the object into a transport (for transportable objects)
    TADIR_INSERTInsert the object into TADIR
    TADIR_DELETEDelete the object from TADIR
    EXISTS_A_LOCK_ENTRY_FORCheck if an enqueue lock exists
    SET_DEFAULT_PACKAGESet SAP package for RS_CORR_INSERT when it can't be supplied via APIs
    SET_DEFAULT_TRANSPORTSet transport request for RS_CORR_INSERT when it can't be supplied via APIs
    IS_ACTIVEMethod to check if an ABAP Workbench object or its parts are active
    DELETE_DDICMethod to remove DDIC objects

    In addition, there are some methods to handle documents associated with an object (transaction SE61, table DOKIL).

    MethodDescription
    SERIALIZE_LONGTEXTSSerialize document including I18N handling
    DESERIALIZE_LONGTEXTSDeserialize document including I18N handling
    DELETE_LONGTEXTSDelete document
    SERIALIZE_LXE_TEXTSSerialize translation texts (new approach, see below)
    DESERIALIZE_LXE_TEXTSDeserialize translation texts (new approach, see below)

    Generic Class

    If it's not possible to provide a native implementation for an object serializer, using generic class ZCL_ABAPGIT_OBJECTS_GENERICopen in new window is possible for logical transport objects (see table OBJH, object type L).

    Example: IWMOopen in new window.

    Serialize Object

    The serialize method shall produce one or several files containing the data that represents a given object. There are a few methods available to define files and attach data using ZIF_ABAPGIT_OUTPUT_XMLopen in new window (input parameter IO_XML).

    MethodDescription
    ADDAppend a value, structure, or internal table to the output (using ID transformation to XML suppressing initial fields)
    ADD_XMLAppend an instance of an XML document to the output (IF_XML_ELEMENT)
    SET_RAWSet the output to an instance of an XML document (IF_XML_ELEMENT)
    I18N_PARAMSGet the settings for internationalization (see below)

    Deserialize Object

    The deserialize method shall read the file or files representing a given object and create the object in the system. If the object already exists, it shall be updated according to the definition in the file or files. There are a few methods available to process files using ZIF_ABAPGIT_INPUT_XMLopen in new window (input parameter IO_XML).

    MethodDescription
    READReturn a value, structure, or internal table from the input (using ID transformation from XML accepting data loss)
    GET_RAWReturn the input as an instance of an XML document (IF_XML_ELEMENT)
    GET_METADATAReturn the metadata used at the time of serializing the object
    I18N_PARAMSGet the settings for internationalization (see below)

    In addition, the deserialize method must add or update the TADIR entry for the given object and insert the object into a transport request (for transportable packages). If the used SAP APIs are not performing these tasks, TADIR_INSERT( iv_package ) and CORR_INSERT( iv_package ) shall be called by the deserialize method.

    Activate Object

    After deserializing, an object (or dependent objects) might have to be activated. Add such objects to the activation queue using [ZCL_ABAPGIT_OBJECTS_ACTIVATION]:

    MethodDescription
    ADDAppend a given object type and name to the queue (for example, INDX {table} for database indexes when deserializing tables)
    ADD_ITEMAppend a given object to the queue (for example, use ms_item for activating the object itself)

    The activation queue is built separately for each phase (see 'Deserialize Process' below).

    Internationalization (I18N)

    In general, the serializer class shall process texts of an object in all available languages i.e. the original language as well as any translations. It shall respect the "Serialize Main Language Only" setting of a repository and limit the texts to the language provided to the constructor (MV_LANGUAGE).

    The recommended approach is to check io_xml->i18n_params( )-main_language_only = abap_false and then serialize the additional translations in the XML (typically using the I18N prefix). During deserialize, the translation languages can then be retrieved and processed accordingly.

    Example: TABLopen in new window.

    Note: A new approach for serializing translations based on LXE is under development. See #4470open in new window for further details and discussion.

    Testing

    When adding new serializers, add at least one test repository to the organization abapGit-testsopen in new window with the name of the object type in capitals (for example, TABLopen in new window. This test will be used by abapGit Continuous Integrationopen in new window.

    Example (using SUSH):

    1. Go to https://github.com/abapGit-tests/SUSHopen in new window and create a fork
    2. In your system (where you have the new SUSH class), start abapGit and create a new online repo for the URL of your fork (pick any local package like $SUSH).
    3. Add one SUSH object to this package (like ZAG_UNIT_TEST)
    4. Go back to abapGit and you should see the new object in the object list of the repo
    5. Stage everything and commit
    6. Go to your forked repo and create a pull request (at the top there's a section showing the delta to the original and a compare button which you can click to create the PR)

    Processing Order and Dependencies

    Serialize Process

    abapGit determines which objects need to be serialized based on the SAP package assigned to a repository (including sub-packages unless "Ignore sub-packages" is selected in the repository settings). The list of objects is then sorted by package, object type, and object name.

    If a sufficient number of work processes is available, abapGit will activate objects in parallel (unless "Disable Parallel Processing" is selected in the repository settings).

    For details, see ZCL_ABAPGIT_SERIALIZEopen in new window.

    Deserialize Process

    Objects are deserialized in three phases. After each phase, all objects included in the phase will be activated.

    StepDescriptionActivation
    EARLYUsed for objects (like classes and interfaces) that are dependencies for DDIC objectsNone
    DDICUsed for DDIC objects which require processing and activation before other object typesDDIC Mass Activation
    ABAPUsed for non-DDIC objects (code or mostly anything else) which might depend on DDIC objectsWorkbench Mass Activation
    LATEUsed for objects that depend on other objects processed in the previous two phasesDDIC & Workbench Mass Activation

    Within each phase, the sequence of objects is determined by abapGit based on known object type dependencies. For details, see method PRIORITIZE_DESER in ZCL_ABAPGIT_FILE_DESERIALIZEopen in new window.

    Uninstall Process

    During the uninstallation of a repository, abapGit will determine the objects in the same fashion as the serialize process. The sequence of objects is determined by abapGit based on known object type dependencies. For details, see method RESOLVE in ZCL_ABAPGIT_DEPENDENCIESopen in new window.

    Note: There are suggestions to refactor the logic to determine the processing orderopen in new window.

    - + diff --git a/development-guide/serializers/task-list.html b/development-guide/serializers/task-list.html index 5c527fde3..283bfedab 100644 --- a/development-guide/serializers/task-list.html +++ b/development-guide/serializers/task-list.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    New Serializers

    abapGitAbout 2 minserializers

    Task List for New Serializers

    The following list includes the mandatory and recommended tasks for adding a new serializer to abapGit:

    1. Check Support for New Object Typesopen in new window

      If the object type is listed already (and not implemented), check the corresponding issue. Typically, you will find valuable discussions to continue or previous work to use as a starting point.

      If the object type is not included in the list, create an issueopen in new window with the title "<OBJECT_TYPE>: Support for <OBJECT_TYPE_DESCRIPTION>" (for example, "TABL: Support for Tables"). Briefly describe why the object is needed and outline the implementation approach.

    2. Wait for the OK from abapGit maintainers

      Before starting the implementation, it's best to wait for feedback from the community. Once you get the go-ahead, the issue will be assigned to you.

    Info

    abapGit maintainers will add your issue to a central listopen in new window and, if there's no further discussion required, close it.

    1. Implement the serializer class

      Follow the instructions below. Often, it makes sense to use an existing serializer class as a template. This can save a lot of work especially if the new object type is similar to others.

    Note

    Your code must comply with the development guidelines for abapGit. Most notably your code must be compatible with 7.02 ABAP syntax and available standard SAP objects, use prefixing of variables, be pretty-printed, and pass all abaplint checks.

    You might get lots of abaplint errors. If you are uncertain how to resolve these, maintainers are happy to help.

    1. Create a test repository

      Define a minimal test case for the new object type and commit it to a test repo in abapGit Test Repositoriesopen in new window. If you don't have access, use the issue you created initially to ask for it. See "Testing" below for an example.

    2. Test your implementation

      Perform a complete test cycle with your test repository:

      • Create New Online Repo for a local package (for example $TABL)
      • Execute a Pull (should install without any diffs)
      • Uninstall the repository (should not leave any objects of TADIR entries behind)
      • Repeat the process for a transportable package (for example ZTABL)
    3. Create a pull request for your implementation

      Fork the abapGit repository and add a branch for your serializer class. Commit your implementation (the zcl_abapgit_object_<type> class) to the branch, and create a pull request to the abapGit repository. Reference your issue in the pull request and add a link to the test repository.

      Note: Object types using the ABAP File Format must be added to the AFF Registryopen in new window as well.

    4. Update documentation

      Add the new object type to the list of supported objects. If the object type is using the ABAP File Format (JSON), add a link to the corresponding JSON schema in the AFF repositoryopen in new window.

    5. Wait for feedback from and merge by abapGit maintainers

      One of the maintainers will typically do a code review, run the test themselves, and either provide feedback or merge the pull request.

    6. Completing tasks

      After a successful merge, abapGit developer and standalone version will support the new object type. Congratulations. Feel free to tell the world about it!

    - + diff --git a/development-guide/technical-details/docs.html b/development-guide/technical-details/docs.html index 8d7da8858..69d6245f8 100644 --- a/development-guide/technical-details/docs.html +++ b/development-guide/technical-details/docs.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    Documentation

    abapGitLess than 1 minutedetails

    abapGit uses GitHub Pagesopen in new window for documentation.

    The website itself is created via VuePress (v2)open in new window together with the MIT licensed theme Hope Themeopen in new window.

    All used icons are freely available at Font Awesomeopen in new window.

    Running the site locally

    1. npm install

    2. npm run docs:dev

    3. Open the URL http://localhost:8080 in a browser

    - + diff --git a/development-guide/technical-details/index.html b/development-guide/technical-details/index.html index 506b15a0b..3784530bd 100644 --- a/development-guide/technical-details/index.html +++ b/development-guide/technical-details/index.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    Technical Details

    abapGitLess than 1 minute

    - + diff --git a/development-guide/technical-details/technical-links.html b/development-guide/technical-details/technical-links.html index 858d79af3..50bde2c8e 100644 --- a/development-guide/technical-details/technical-links.html +++ b/development-guide/technical-details/technical-links.html @@ -31,7 +31,7 @@ } - +
    Skip to main content

    Links

    abapGitLess than 1 minutedetails

    - + diff --git a/development-guide/testing/ci.html b/development-guide/testing/ci.html index 76e9035d3..8ee74e11e 100644 --- a/development-guide/testing/ci.html +++ b/development-guide/testing/ci.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    CI Tests

    abapGitAbout 1 mintesting

    abapGit CI Tests

    Results from latest CI run: https://ci.abapgit.orgopen in new window

    Repo abapGit CIopen in new window provides basic continuous integration capabilities for abapGit. The repository aims to test the serialization and deserialization of object types, as these cannot be unit-tested properly.

    The CI process fetches abapGit test repos from abapGit Testsopen in new window. Then for each repository, the following steps are executed:

    • create a package (if needed)
    • clone
    • pull
    • syntax check
    • object check
    • create transport request
    • purge (uninstall)
    • delete transport request
    • check for leftovers

    Additionally, a set of generic tests is performed checking the latest abapGit build.

    If there is any error in these steps abapGit CI will indicate that.

    Run report ZABAPGIT_CI_UPDATE_ABAPGIT to update the abapGit repo.

    Run report ZABAPGIT_CI_UPDATE_ABAPGIT_CI to update the abapGit CI repo.

    There are currently three possibilities to run abapGit CI:

    1. Adhoc CI with report ZABAPGIT_CI

    Selection screen:

    abapGit CI selection screen
    abapGit CI selection screen

    Result list:

    abapGit CI results
    abapGit CI results

    2. REST API

    POST /sap/zabapgit_ci/run

    response.json

    3. Schedule job sequence with report ZABAPGIT_CI_JOB_SCHEDULER

    A job sequence is created with

    1. Update abapGit repo
    2. Update abapGit CI repo
    3. Run abapGit CI
    abapGit CI job scheduler
    abapGit CI job scheduler

    Check transportable packages

    Optionally you can also let abapGit CI create the repositories in transportable packages. You need to activate the checkbox in the selection screen and specify the transport layer. Then the pull and purge actions will each get recorded into a transport request per repository. These get released and their content is checked to ensure it matches the objects in the repository.

    To set up a suitable transport landscape on the AS ABAP Developer Edition you need to create a new virtual system in STMS (for example EXP, Virtual export system). This serves as a dummy export target for transport requests. Next, you need to create a new transport layer (for example ZEXP) and connect the current system and the virtual system with it. Then save and activate the configuration.

    STMS transports landscape
    STMS transports landscape

    Prerequisites

    There are a few prerequisites for running the CI test suite:

    • abapGit developer version must be installed
    • SAP Basis 7.50 or higher
    • Tests are hosted at https://github.com/abapGit-testsopen in new window
    • Test objects shall be included in SAP Basis 7.50 (Exception: the main object type is only available in higher releases)
    • Test objects from SAP ERP or industry solutions shall be avoided (Exception: the main object type is only available in ERP)
    - + diff --git a/development-guide/testing/debugging.html b/development-guide/testing/debugging.html index 7dd452115..55ca45922 100644 --- a/development-guide/testing/debugging.html +++ b/development-guide/testing/debugging.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    Debugging

    abapGitAbout 1 mintesting

    ABAP

    Using the standalone version for debugging is not recommended since the very large source will have to be loaded and parsed by the debugger. It's much more efficient to debug using the developer version.

    If you suspect an issue in the object serializer classes, then be sure to disable parallel processing in the abapGit settings. Otherwise, the debugger will not stop at your break points.

    In case you can't resolve or pinpoint the issue, try to reproduce it using a case from the abapGit-testopen in new window organization. If you don't find a test case, open an issue and we will create a new repo for it.

    JavaScript

    Some pages in abapGit contain JavaScript. If the script fails, you typically see the following banner:

    Script Issue
    Script Issue

    Also, the lower right corner of the HTML output will NOT show "JS OK". Troubleshooting depends on the type of SAP GUI you are using.

    Note

    Check SAP GUI Setup for known issues related to SAP GUI.

    SAP GUI for Windows

    If you are using SAP GUI 7.6 or below, or SAP GUI 7.7 and higher with Internet Explorer browser control, then follow these instructions on how to use the IE Debugger in abapGit:

    Obscure productivity tips: Debug Javascript running within SAPGUI browseropen in new window

    If you are using SAP GUI 7.7 or higher with Edge (Chrome) browser control, use the developer tools that come with WebView2:

    General: Debug WebView2 Appsopen in new window
    SAP Note 3099670open in new window - SAP GUI for Windows Chromium-based Edge Control: Adding remote debugging feature
    How to Debug WebView2 in SAP GUIopen in new window

    SAP GUI for HTML (Web)

    Troubleshooting depends on the type of browser you are using.

    SAP GUI for Java

    JavaScript is not supported with this SAP GUI.

    Web Edition

    Running abapGit completely in a browser is still a proof-of-concept. Open an issue hereopen in new window.

    - + diff --git a/development-guide/testing/index.html b/development-guide/testing/index.html index c031502cd..f06c719b4 100644 --- a/development-guide/testing/index.html +++ b/development-guide/testing/index.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    Testing

    abapGitLess than 1 minute

    - + diff --git a/development-guide/testing/tests.html b/development-guide/testing/tests.html index 420c63f7f..520c085e4 100644 --- a/development-guide/testing/tests.html +++ b/development-guide/testing/tests.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    Unit Tests

    abapGitLess than 1 minutetesting

    abapGit uses dependency lookup as an approach for writing unit tests, see examples in ZCL_ABAPGIT_TADIR, ZCL_ABAPGIT_FACTORY, and ZCL_ABAPGIT_INJECTORopen in new window.

    Unit tests that create and delete objects in the system are categorized as dangerous, these tests can be enabled via "Advanced > Settings".

    Use organization abapGit-testsopen in new window for storing serialization test cases.

    - + diff --git a/development-guide/user-interface/adding-icons.html b/development-guide/user-interface/adding-icons.html index 24e4a0a13..cd968e305 100644 --- a/development-guide/user-interface/adding-icons.html +++ b/development-guide/user-interface/adding-icons.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    Icons

    abapGitLess than 1 minuteui

    abapGit uses SIL and MIT-licensed fonts, they are included in the distribution as a MIME object. This includes MIME objects:

    • ZABAPGIT_ICON_FONT - font in WOFF format containing the custom icon set. WOFF is used due to compatibility, SAP GUI for Windows reusing Internet Explorer control (IE 11)
    • ZABAPGIT_ICON_FONT_CSS - CSS icon map

    To add an icon to the icon set follow the next procedure:

    1. Add the icon to repo abapGit Icon Fontopen in new window as documented hereopen in new window
    2. Get the new abapGit font and icon files from the icon-font GitHub action
    3. Go to transaction SMW0 and display the abapGit MIME objects (Binary > Package $abapgit)
    4. Upload the new font file to ZABAPGIT_ICON_FONT
    5. Upload the new CSS file to ZABAPGIT_ICON_FONT_CSS
    6. Start abapGit and commit the changes the abapGit/abapGitopen in new window repo (preferably in a separate commit)

    Please mind the licensing when adding icons that are not from Font Awesome.

    Info

    Alternatively you can use w3mipolleropen in new window for the upload step. See also UI - CSS and assets.

    - + diff --git a/development-guide/user-interface/developing-ui-css.html b/development-guide/user-interface/developing-ui-css.html index 83bea4609..f09603886 100644 --- a/development-guide/user-interface/developing-ui-css.html +++ b/development-guide/user-interface/developing-ui-css.html @@ -31,7 +31,7 @@ } - +
    Skip to main content

    CSS and Assets

    abapGitAbout 4 minui

    This documentation covers asset management, CSS processing, and recommended asset development flow. See also the UI - HTML Pages.

    TL;DR

    • If you add an asset - code it in ZCL_ABAPGIT_UI_FACTORY=>INIT_ASSET_MANAGER
    • There are 3 main CSS sheets to mind: ag-icons.css with icon definitions, common.css with layouts (don't use for colors!), and theme-default.css for colors
    • Custom themes ("Dark" and "Belize") are combined with "Default" so that missing attributes are inherited from the default one
    • abapGit uses internal CSS preprocessing to support CSS variables (which are otherwise not supported by IE - undercover browser of SAP GUI)
    • A convenient way for changing and uploading CSS and other assets is W3MIPOLLERopen in new window

    Asset Manager

    ZCL_ABAPGIT_GUI_ASSET_MANAGER class is responsible for managing static assets. Very briefly: relevant assets must be registered in the asset manager instance during GUI initiation so that they can be used in the browser UI. The registration happens in ZCL_ABAPGIT_UI_FACTORY=>INIT_ASSET_MANAGER. Here is an abstract from the method for example:

    DEFINE _inline.
    @@ -73,6 +73,6 @@
         <!-- COMMENT THIS ^^^^^^^^^^^^^^^^^^ -->
       </head>
     

    To edit CSS files you have to download them to the frontend, edit, debug in IE or Chrome Devtools, and upload them back. Doing so via SMW0 may be inconvenient for multiple assets (main CSS + themes + js). One of the solutions is to use W3MIPOLLERopen in new window. The idea of the tool is to define a connection between a MIME asset and a frontend file and then monitor file changes - as soon as you save the file, the poller detects it and automatically uploads it to the MIME storage.

    sel.screen
    sel.screen

    In the selection screen, you define one or several pairs MIME-to-File. You can also save them as variants. Choose the right option at the bottom:

    • Just start polling - just start the detection of changes
    • Download before polling - take existing MIME object and overwrite the files - useful for initial setup or after remote AG changes
    • Upload before polling - overwrites MIME object with existing files

    Just a handy recommendation: if you save a variant, save it with "just start polling", not to overwrite something occasionally.

    Run the program. After the initial action (if chosen) it will start monitoring file changes - leave it running. Eventually, after a file was modified, it will report the upload on the screen.

    result
    result

    The latest version of the w3mipoller has also an option to track all W3MI files in the package (and its sub-packages) at once. This can be convenient in case of simultaneous multiple file editing. Briefly:

    • choose the $ABAPGIT package
    • choose the root directory to save files to
    • optionally enter regex for file names (e.g. ".*css$" if you intend to edit css file only)
    • optionally select "Sort by ..." flag to split files by sub-directories by extension (since abapgit html pages refer to css/.. and js/.. URIs is may be helpful)
    • see more in project readmeopen in new window
    whole project
    whole project
    - + diff --git a/development-guide/user-interface/developing-ui-forms.html b/development-guide/user-interface/developing-ui-forms.html index 093f1cf89..6880f79bf 100644 --- a/development-guide/user-interface/developing-ui-forms.html +++ b/development-guide/user-interface/developing-ui-forms.html @@ -31,7 +31,7 @@ } - +
    Skip to main content

    HTML Forms

    abapGitAbout 2 minui

    This doc covers the HTML form component in abapGit UI. See also the UI - HTML pages.

    General

    There is a helper class to render HTML forms - zcl_abapgit_html_form. To see an example - open the online repo creation dialog (code: class zcl_abapgit_gui_page_addonline). Typical usage:

    • create the form (preferably in constructor - it is descriptive)
    • add fields one by one
    • for complex fields (radio) - add options right after the field
    • on render - pass zcl_abapgit_string_map instance of values and, optionally, a map of validation results (see below)
    • fields can be required (iv_required = abap_true)
    • fields can have tooltips (iv_hint = 'help for the field')
    • text fields may have placeholders (iv_placeholder = '...')
    • text fields may be uppercased (iv_upper_case = abap_bool - for normalization - see below)
    • text fields may have side-actions - button next to them - passing current form state to abap for additional logic and re-render
    • a form may have one or more commands at the bottom. Main ones (iv_is_main = abap_true) - will be highlighted
    
    @@ -109,6 +109,6 @@
         io_values         = mo_form_data
         io_validation_log = mo_validation_log ) ). " <<< ERRORS HERE
     
    - + diff --git a/development-guide/user-interface/developing-ui-js.html b/development-guide/user-interface/developing-ui-js.html index 4f3c559a5..eece6ed31 100644 --- a/development-guide/user-interface/developing-ui-js.html +++ b/development-guide/user-interface/developing-ui-js.html @@ -31,7 +31,7 @@ } - +
    Skip to main content

    JavaScript

    abapGitAbout 1 minui

    This documentation covers java script specifics in abapGit UI. See also the UI - HTML Pages.

    General

    abapGit UI contains JavaScript code. Some of the dynamic features rely on it e.g. keyboard navigation. The JS code is located in ui/zabapgit_js_common.w3mi.data.js - the recommended way to modify it is described in the "Recommended asset development flow" section of UI - CSS and Assets.

    As SAP GUI uses Internet Explorer component to render HTML the JS code must be optimized for IE11 (and use the features available in it). Although some polyfills are available (and more can be added) at the beginning of the code (like String.includes).

    The pull request CI check includes a run of eslint, so any new code should conform to the rules defined for the abapGit repository.

    Components

    The JS library contains several components which can be reused in different places.

    Command Palette

    To add a command palette add the following code in the script method of the page.

    ro_html->add( 'var gCommandPalette = new CommandPalette(enumerateFn, {' ).
    @@ -44,6 +44,6 @@
         title:     "Go home"         // title of the command
     }
     
    • toggleKey is a key to toggle the palette. "^" at the beginning requires Ctrl ("^g" = Ctrl+g )
    • hotkeyDescription is the description that is a) added to the shortkey help popup b) used as a placeholder in the command palette

    See an example of enumerators - enumerateToolbarActions and enumerateTocAllRepos.

    To-Do

    • debugOutput
    • submitSapeventForm
    • setInitialFocus
    • setInitialFocusWithQuerySelector
    • submitFormById
    • findStyleSheetByName
    • getIndocStyleSheet
    • toggleDisplay
    • Hotkeys.addHotkeyToHelpSheet
    • ...
    - + diff --git a/development-guide/user-interface/developing-ui.html b/development-guide/user-interface/developing-ui.html index 7e8b9f63e..f9d327546 100644 --- a/development-guide/user-interface/developing-ui.html +++ b/development-guide/user-interface/developing-ui.html @@ -31,7 +31,7 @@ } - +
    Skip to main content

    HTML Pages

    abapGitAbout 5 minui

    This documentation covers page creation, HTML rendering, and event handling.

    TL;DR

    • To create a new page in abapGit you subclass ZCL_ABAPGIT_GUI_PAGE and redefine RENDER_CONTENT method (also consider separating components that implement ZIF_ABAPGIT_GUI_RENDERABLE directly, this will probably become the primary approach in future)
    • Use ZCL_ABAPGIT_HTML to collect HTML content - method add accepts strings, string_tables, and instances of ZCL_ABAPGIT_HTML
    • Use ZCL_ABAPGIT_HTML=>ICON to render icons
    • Use ZCL_ABAPGIT_HTML=>A to render anchors, don't render them manually <a>...</a>
    • Please, please, care about usability, content readability, and style in general 🙏 😉
    • Check ZCL_ABAPGIT_GUI_CHUNK_LIB for some existing HTML chunks like render_error
    • To register postponed HTML parts, scripts, and hotkeys - access corresponding methods via gui_services method of zcl_abapgit_gui_component

    GUI Components

    abapGit UI is based on HTML and CL_GUI_HTML_VIEWER. The main parts are:

    • ZCL_ABAPGIT_GUI - the class which initializes CL_GUI_HTML_VIEWER and manages page stack
    • ZCL_ABAPGIT_GUI_ASSET_MANAGER - manages static assets like images, CSS, JS code, and fonts
    • ZCL_ABAPGIT_HTML - helper for HTML accumulation and rendering
    • ZCL_ABAPGIT_GUI_ROUTER - abapGit specific global event handling, main to route between the pages or run globally defined actions like repo installation
    • ZCL_ABAPGIT_GUI_PAGE - base class for pages. It renders typical HTML headers and abapGit-related java scripts. ~So in most cases you probably just want to subclass it and render just the content~
    • ZCL_ABAPGIT_GUI_COMPONENT - base class for GUI components. Gives access to gui_services to register postponed HTML parts, scripts, and hotkeys. Usually, it is a good idea to subclass from it, if you want to use these features.
    • ZIF_ABAPGIT_GUI_RENDERABLE - interface which a renderable component must expose to be able to interact with ZCL_ABAPGIT_GUI
    • ZIF_ABAPGIT_GUI_EVENT_HANDLER - interface which a component must expose to be able to register itself as an event handler in ZCL_ABAPGIT_GUI
    • ZIF_ABAPGIT_GUI_HOTKEYS - interface which a component must expose to be able to register hotkey actions

    Rendering Content

    An example of RENDER_CONTENT (or any other helper method with HTML output)

    METHOD render_content.
    @@ -72,6 +72,6 @@
     
       ENDMETHOD.
     
    - + diff --git a/development-guide/user-interface/html-popups.html b/development-guide/user-interface/html-popups.html index 066ff4782..051dd1138 100644 --- a/development-guide/user-interface/html-popups.html +++ b/development-guide/user-interface/html-popups.html @@ -31,7 +31,7 @@ } - +
    Skip to main content

    HTML Popups

    abapGitAbout 3 minui

    Disclaimer: this functionality is new and may change potentially.

    Architecture comments

    Kinds of popups:

    • "in-page" - a hovering form, blocking the regular content
    • "separate page" - a regular page, yet that does not allow any page transitions others that go back

    Ideally, a visualization component should not know that it is a popup (being agnostic). It is its wrapper that should know and manage the aspects. For example: zcl_abapgit_gui_picklist - a component that renders a list to choose an item from. This very same component can be rendered as a part of the page, as an in-page popup, or as a separate page popup.

    Separate-page popup

    Calling a separate-page popup would be initiated in the event handler and thus would look like this:

      rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.
    @@ -57,6 +57,6 @@
           ri_html->add( zcl_abapgit_gui_in_page_modal=>create( mo_popup_picklist ) ).
         ENDIF.
     

    Initiating the popup and retrieving the result

    Problem: SAP does not allow modal HTML forms, thus initialization and retrieving the result happens asynchronously and independently. It is more the developer's responsibility to keep this code readable.

    The current "state-of-art" approach suggests (though can potentially be improved): process initiation and result reading in the same method, the "mode" should be dictated by parameters (e.g. iv_is_return = abap_true)

    e.g. let's consider the zcl_abapgit_gui_page_sett_remo->choose_branch:

    • initiation would end up with mo_popup_picklist = ... (create the component), thus marking the presence of the popup for the further code
    • the returning part iv_is_return = abap_true is checking if the popup was canceled by user mo_popup_picklist->was_cancelled( ) and retrieves the chosen entry mo_popup_picklist->get_result_item( ... )

    Now, it is important to uniformly initiate the return flow. In zcl_abapgit_gui_page_sett_remo this is done by handle_picklist_state which is called at the very beginning of the render. The method checks if the popup claims that it was fulfilled (confirmed or canceled) and, if yes, calls the appropriate choose_* method based on mo_popup_picklist->id( ).

    Finally, one more way to escape the popup is by pressing the F3 or ESC - which are handled by GUI, not by the popup component. As a result of this:

    1. popup does not know that it was canceled
    2. even further, the back will be applied to the caller page and not to the in-page popup!

    The solution to that is the graceful back procedure. Before going back the GUI send an event go_back to the top-most component (which happens to be the popup). Thus the component has a chance to:

    • properly process the request to exit
    • send back the re_render or no_more_act states
      • the re_render will result in the re-rendering of the parent (caller) page, yet with the popup in canceled/fulfilled state
      • the no_more_act gives a possibility to cancel the go_back action (e.g. to prevent exiting the popup when data was not saved)
    - + diff --git a/development-guide/user-interface/index.html b/development-guide/user-interface/index.html index 7310699f7..0dea2efd3 100644 --- a/development-guide/user-interface/index.html +++ b/development-guide/user-interface/index.html @@ -31,10 +31,10 @@ } - +
    Skip to main content

    User Interface

    abapGitLess than 1 minute

    - + diff --git a/index.html b/index.html index f035eb8fe..ef1bea81f 100644 --- a/index.html +++ b/index.html @@ -31,10 +31,10 @@ } - +
    Skip to main content
    hero imagehero image

    A git client for ABAP developed in ABAP

    🚀 Getting started

    Welcome to abapGit

    abapGit is a git client for ABAP developed in ABAP. It requires ABAP version 702 SP 8 or higher.

    Latest build: zabapgit_standalone.prog.abap

    For questions/comments/bugs/feature requests/wishes please create an issueopen in new window.

    Security

    abapGit is a tool to import and export code between ABAP systems. If a developer has a developer key to the system,
    the developer can perform these actions already. abapGit enables the developer to do mass export/changes/imports but
    not more than already possible to do manually.

    Running automated security checks on the abapGit code will by design give a lot of errors, as abapGit will import, overwrite and change
    ABAP artifacts in the system in ways that might not be intended. Always review all code in remote repositories before importing to the target system,
    this is possible because abapGit is plain text unlike traditional transport files.

    That being said, abapGit is used by multiple organizations, all abapGit
    changes are reviewed via pull requests. And all 100+ repository watchersopen in new window are
    automatically notified for every change to the code base, so potentially all changes are looked at by more people than
    traditional enterprise products.

    Support

    It is a community effort to support the project, recommend watchingopen in new window the project to get a feeling about issue resolution. Everyone can suggest changes to abapGit via pull requestsopen in new window.

    abapGit 1.99.0
    abapGit 1.99.0

    Community vs. SAP Distribution of abapGit

    This website is documenting the community version of abapGit (available on GitHubopen in new window). The SAP version of abapGit available as part of SAP Business Technology Platform is documented on help.sap.comopen in new window. When using the SAP version, please note that there are different capabilities and supported object types (as described by SAP). If the SAP version on BTP does not work correctly, open a ticket with SAP support.

    - + diff --git a/search-pro.worker.js b/search-pro.worker.js index e7d5cb145..2f419d8be 100644 --- a/search-pro.worker.js +++ b/search-pro.worker.js @@ -1,2 +1,2 @@ -const nt="ENTRIES",V="KEYS",T="VALUES",F="";class D{set;_type;_path;constructor(t,s){const n=t._tree,o=Array.from(n.keys());this.set=t,this._type=s,this._path=o.length>0?[{node:n,keys:o}]:[]}next(){const t=this.dive();return this.backtrack(),t}dive(){if(this._path.length===0)return{done:!0,value:void 0};const{node:t,keys:s}=E(this._path);if(E(s)===F)return{done:!1,value:this.result()};const n=t.get(E(s));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()}backtrack(){if(this._path.length===0)return;const t=E(this._path).keys;t.pop(),!(t.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map(({keys:t})=>E(t)).filter(t=>t!==F).join("")}value(){return E(this._path).node.get(F)}result(){switch(this._type){case T:return this.value();case V:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const E=e=>e[e.length-1],ot=(e,t,s)=>{const n=new Map;if(t===void 0)return n;const o=t.length+1,u=o+s,i=new Uint8Array(u*o).fill(s+1);for(let r=0;r{const h=u*i;t:for(const c of e.keys())if(c===F){const d=o[h-1];d<=s&&n.set(r,[e.get(c),d])}else{let d=u;for(let l=0;ls)continue t}W(e.get(c),t,s,n,o,d,i,r+c)}};class C{_tree;_prefix;_size=void 0;constructor(t=new Map,s=""){this._tree=t,this._prefix=s}atPrefix(t){if(!t.startsWith(this._prefix))throw new Error("Mismatched prefix");const[s,n]=x(this._tree,t.slice(this._prefix.length));if(s===void 0){const[o,u]=O(n);for(const i of o.keys())if(i!==F&&i.startsWith(u)){const r=new Map;return r.set(i.slice(u.length),o.get(i)),new C(r,t)}}return new C(s,t)}clear(){this._size=void 0,this._tree.clear()}delete(t){return this._size=void 0,ut(this._tree,t)}entries(){return new D(this,nt)}forEach(t){for(const[s,n]of this)t(s,n,this)}fuzzyGet(t,s){return ot(this._tree,t,s)}get(t){const s=I(this._tree,t);return s!==void 0?s.get(F):void 0}has(t){const s=I(this._tree,t);return s!==void 0&&s.has(F)}keys(){return new D(this,V)}set(t,s){if(typeof t!="string")throw new Error("key must be a string");return this._size=void 0,M(this._tree,t).set(F,s),this}get size(){if(this._size)return this._size;this._size=0;const t=this.entries();for(;!t.next().done;)this._size+=1;return this._size}update(t,s){if(typeof t!="string")throw new Error("key must be a string");this._size=void 0;const n=M(this._tree,t);return n.set(F,s(n.get(F))),this}fetch(t,s){if(typeof t!="string")throw new Error("key must be a string");this._size=void 0;const n=M(this._tree,t);let o=n.get(F);return o===void 0&&n.set(F,o=s()),o}values(){return new D(this,T)}[Symbol.iterator](){return this.entries()}static from(t){const s=new C;for(const[n,o]of t)s.set(n,o);return s}static fromObject(t){return C.from(Object.entries(t))}}const x=(e,t,s=[])=>{if(t.length===0||e==null)return[e,s];for(const n of e.keys())if(n!==F&&t.startsWith(n))return s.push([e,n]),x(e.get(n),t.slice(n.length),s);return s.push([e,t]),x(void 0,"",s)},I=(e,t)=>{if(t.length===0||e==null)return e;for(const s of e.keys())if(s!==F&&t.startsWith(s))return I(e.get(s),t.slice(s.length))},M=(e,t)=>{const s=t.length;t:for(let n=0;e&&n{const[s,n]=x(e,t);if(s!==void 0){if(s.delete(F),s.size===0)R(n);else if(s.size===1){const[o,u]=s.entries().next().value;$(n,o,u)}}},R=e=>{if(e.length===0)return;const[t,s]=O(e);if(t.delete(s),t.size===0)R(e.slice(0,-1));else if(t.size===1){const[n,o]=t.entries().next().value;n!==F&&$(e.slice(0,-1),n,o)}},$=(e,t,s)=>{if(e.length===0)return;const[n,o]=O(e);n.set(o+t,s),n.delete(o)},O=e=>e[e.length-1],it=(e,t)=>{const s=e._idToShortId.get(t);if(s!=null)return e._storedFields.get(s)},rt=/[\n\r -#%-*,-/:;?@[-\]_{}\u00A0\u00A1\u00A7\u00AB\u00B6\u00B7\u00BB\u00BF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u1680\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2000-\u200A\u2010-\u2029\u202F-\u2043\u2045-\u2051\u2053-\u205F\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u3000-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]+/u,S="or",q="and",ct="and_not",lt=(e,t)=>{e.includes(t)||e.push(t)},P=(e,t)=>{for(const s of t)e.includes(s)||e.push(s)},G=({score:e},{score:t})=>t-e,ht=()=>new Map,k=e=>{const t=new Map;for(const s of Object.keys(e))t.set(parseInt(s,10),e[s]);return t},N=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0,dt={[S]:(e,t)=>{for(const s of t.keys()){const n=e.get(s);if(n==null)e.set(s,t.get(s));else{const{score:o,terms:u,match:i}=t.get(s);n.score=n.score+o,n.match=Object.assign(n.match,i),P(n.terms,u)}}return e},[q]:(e,t)=>{const s=new Map;for(const n of t.keys()){const o=e.get(n);if(o==null)continue;const{score:u,terms:i,match:r}=t.get(n);P(o.terms,i),s.set(n,{score:o.score+u,terms:o.terms,match:Object.assign(o.match,r)})}return s},[ct]:(e,t)=>{for(const s of t.keys())e.delete(s);return e}},at=(e,t,s,n,o,u)=>{const{k:i,b:r,d:h}=u;return Math.log(1+(s-t+.5)/(t+.5))*(h+e*(i+1)/(e+i*(1-r+r*n/o)))},ft=e=>(t,s,n)=>{const o=typeof e.fuzzy=="function"?e.fuzzy(t,s,n):e.fuzzy||!1,u=typeof e.prefix=="function"?e.prefix(t,s,n):e.prefix===!0;return{term:t,fuzzy:o,prefix:u}},H=(e,t,s,n)=>{for(const o of Object.keys(e._fieldIds))if(e._fieldIds[o]===s){e._options.logger("warn",`SlimSearch: document with ID ${e._documentIds.get(t)} has changed before removal: term "${n}" was not present in field "${o}". Removing a document after it has changed can corrupt the index!`,"version_conflict");return}},gt=(e,t,s,n)=>{if(!e._index.has(n)){H(e,s,t,n);return}const o=e._index.fetch(n,ht),u=o.get(t);u==null||u.get(s)==null?H(e,s,t,n):u.get(s)<=1?u.size<=1?o.delete(t):u.delete(s):u.set(s,u.get(s)-1),e._index.get(n).size===0&&e._index.delete(n)},mt={k:1.2,b:.7,d:.5},pt={idField:"id",extractField:(e,t)=>e[t],tokenize:e=>e.split(rt),processTerm:e=>e.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(e,t)=>{typeof(console==null?void 0:console[e])=="function"&&console[e](t)},autoVacuum:!0},J={combineWith:S,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:mt},Ft={combineWith:q,prefix:(e,t,s)=>t===s.length-1},_t={batchSize:1e3,batchWait:10},U={minDirtFactor:.1,minDirtCount:20},yt={..._t,...U},Y=(e,t=S)=>{if(e.length===0)return new Map;const s=t.toLowerCase();return e.reduce(dt[s])||new Map},B=(e,t,s,n,o,u,i,r,h=new Map)=>{if(o==null)return h;for(const c of Object.keys(u)){const d=u[c],l=e._fieldIds[c],p=o.get(l);if(p==null)continue;let f=p.size;const g=e._avgFieldLength[l];for(const a of p.keys()){if(!e._documentIds.has(a)){gt(e,l,a,s),f-=1;continue}const m=i?i(e._documentIds.get(a),s,e._storedFields.get(a)):1;if(!m)continue;const y=p.get(a),_=e._fieldLength.get(a)[l],b=at(y,f,e._documentCount,_,g,r),z=n*d*m*b,A=h.get(a);if(A){A.score+=z,lt(A.terms,t);const w=N(A.match,s);w?w.push(c):A.match[s]=[c]}else h.set(a,{score:z,terms:[t],match:{[s]:[c]}})}}return h},At=(e,t,s)=>{const n={...e._options.searchOptions,...s},o=(n.fields||e._options.fields).reduce((a,m)=>({...a,[m]:N(n.boost,m)||1}),{}),{boostDocument:u,weights:i,maxFuzzy:r,bm25:h}=n,{fuzzy:c,prefix:d}={...J.weights,...i},l=e._index.get(t.term),p=B(e,t.term,t.term,1,l,o,u,h);let f,g;if(t.prefix&&(f=e._index.atPrefix(t.term)),t.fuzzy){const a=t.fuzzy===!0?.2:t.fuzzy,m=a<1?Math.min(r,Math.round(t.term.length*a)):a;m&&(g=e._index.fuzzyGet(t.term,m))}if(f)for(const[a,m]of f){const y=a.length-t.term.length;if(!y)continue;g==null||g.delete(a);const _=d*a.length/(a.length+.3*y);B(e,t.term,a,_,m,o,u,h,p)}if(g)for(const a of g.keys()){const[m,y]=g.get(a);if(!y)continue;const _=c*a.length/(a.length+y);B(e,t.term,a,_,m,o,u,h,p)}return p},X=(e,t,s={})=>{if(typeof t!="string"){const d={...s,...t,queries:void 0},l=t.queries.map(p=>X(e,p,d));return Y(l,d.combineWith)}const{tokenize:n,processTerm:o,searchOptions:u}=e._options,i={tokenize:n,processTerm:o,...u,...s},{tokenize:r,processTerm:h}=i,c=r(t).flatMap(d=>h(d)).filter(d=>!!d).map(ft(i)).map(d=>At(e,d,i));return Y(c,i.combineWith)},K=(e,t,s={})=>{const n=X(e,t,s),o=[];for(const[u,{score:i,terms:r,match:h}]of n){const c=r.length,d={id:e._documentIds.get(u),score:i*c,terms:Object.keys(h),match:h};Object.assign(d,e._storedFields.get(u)),(s.filter==null||s.filter(d))&&o.push(d)}return o.sort(G),o},Ct=(e,t,s={})=>{s={...e._options.autoSuggestOptions,...s};const n=new Map;for(const{score:u,terms:i}of K(e,t,s)){const r=i.join(" "),h=n.get(r);h!=null?(h.score+=u,h.count+=1):n.set(r,{score:u,terms:i,count:1})}const o=[];for(const[u,{score:i,terms:r,count:h}]of n)o.push({suggestion:u,terms:r,score:i/h});return o.sort(G),o};class Et{_options;_index;_documentCount;_documentIds;_idToShortId;_fieldIds;_fieldLength;_avgFieldLength;_nextId;_storedFields;_dirtCount;_currentVacuum;_enqueuedVacuum;_enqueuedVacuumConditions;constructor(t){if((t==null?void 0:t.fields)==null)throw new Error('SlimSearch: option "fields" must be provided');const s=t.autoVacuum==null||t.autoVacuum===!0?yt:t.autoVacuum;this._options={...pt,...t,autoVacuum:s,searchOptions:{...J,...t.searchOptions||{}},autoSuggestOptions:{...Ft,...t.autoSuggestOptions||{}}},this._index=new C,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=U,this.addFields(this._options.fields)}get isVacuuming(){return this._currentVacuum!=null}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}get documentCount(){return this._documentCount}get termCount(){return this._index.size}toJSON(){const t=[];for(const[s,n]of this._index){const o={};for(const[u,i]of n)o[u]=Object.fromEntries(i);t.push([s,o])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:t,serializationVersion:2}}addFields(t){for(let s=0;s{if(c!==1&&c!==2)throw new Error("SlimSearch: cannot deserialize an index created with an incompatible version");const l=new Et(d);l._documentCount=t,l._nextId=s,l._documentIds=k(n),l._idToShortId=new Map,l._fieldIds=o,l._fieldLength=k(u),l._avgFieldLength=i,l._storedFields=k(r),l._dirtCount=h||0,l._index=new C;for(const[p,f]of l._documentIds)l._idToShortId.set(f,p);for(const[p,f]of e){const g=new Map;for(const a of Object.keys(f)){let m=f[a];c===1&&(m=m.ds),g.set(parseInt(a,10),k(m))}l._index.set(p,g)}return l},Q=Object.entries,wt=Object.fromEntries,j=(e,t)=>{const s=e.toLowerCase(),n=t.toLowerCase(),o=[];let u=0,i=0;const r=(c,d=!1)=>{let l="";i===0?l=c.length>20?`… ${c.slice(-20)}`:c:d?l=c.length+i>100?`${c.slice(0,100-i)}… `:c:l=c.length>20?`${c.slice(0,20)} … ${c.slice(-20)}`:c,l&&o.push(l),i+=l.length,d||(o.push(["mark",t]),i+=t.length,i>=100&&o.push(" …"))};let h=s.indexOf(n,u);if(h===-1)return null;for(;h>=0;){const c=h+n.length;if(r(e.slice(u,h)),u=c,i>100)break;h=s.indexOf(n,u)}return i<100&&r(e.slice(u),!0),o},Z=/[\u4e00-\u9fa5]/g,tt=(e={})=>({fuzzy:.2,prefix:!0,processTerm:t=>{const s=t.match(Z)||[],n=t.replace(Z,"").toLowerCase();return n?[n,...s]:[...s]},...e}),xt=(e,t)=>t.contents.reduce((s,[,n])=>s+n,0)-e.contents.reduce((s,[,n])=>s+n,0),kt=(e,t)=>Math.max(...t.contents.map(([,s])=>s))-Math.max(...e.contents.map(([,s])=>s)),et=(e,t,s={})=>{const n={};return K(t,e,tt({boost:{h:2,t:1,c:4},...s})).forEach(o=>{const{id:u,terms:i,score:r}=o,h=u.includes("@"),c=u.includes("#"),[d,l]=u.split(/[#@]/),{contents:p}=n[d]??={title:"",contents:[]};if(h)p.push([{type:"customField",key:d,index:l,display:i.map(f=>o.c.map(g=>j(g,f))).flat().filter(f=>f!==null)},r]);else{const f=i.map(g=>j(o.h,g)).filter(g=>g!==null);if(f.length&&p.push([{type:c?"heading":"title",key:d,...c&&{anchor:l},display:f},r]),"t"in o)for(const g of o.t){const a=i.map(m=>j(g,m)).filter(m=>m!==null);a.length&&p.push([{type:"text",key:d,...c&&{anchor:l},display:a},r])}}}),Q(n).sort(([,o],[,u])=>"max"==="total"?xt(o,u):kt(o,u)).map(([o,{title:u,contents:i}])=>{if(!u){const r=it(t,o);r&&(u=r.h)}return{title:u,contents:i.map(([r])=>r)}})},st=(e,t,s={})=>Ct(t,e,tt(s)).map(({suggestion:n})=>n),v=wt(Q(JSON.parse("{\"/\":{\"documentCount\":528,\"nextId\":528,\"documentIds\":{\"0\":\"v-8daa1a0e\",\"1\":\"v-8daa1a0e#welcome-to-abapgit\",\"2\":\"v-8daa1a0e#security\",\"3\":\"v-8daa1a0e#support\",\"4\":\"v-8daa1a0e#community-vs-sap-distribution-of-abapgit\",\"5\":\"v-495a303e\",\"6\":\"v-495a303e#catalog\",\"7\":\"v-495a303e#read-first\",\"8\":\"v-495a303e#serializers\",\"9\":\"v-495a303e#testing\",\"10\":\"v-495a303e#user-interface\",\"11\":\"v-495a303e#api\",\"12\":\"v-495a303e#technical-details\",\"13\":\"v-7f4aff48\",\"14\":\"v-7f4aff48#catalog\",\"15\":\"v-7f4aff48#getting-started\",\"16\":\"v-7f4aff48#setup\",\"17\":\"v-7f4aff48#projects\",\"18\":\"v-7f4aff48#online\",\"19\":\"v-7f4aff48#offline\",\"20\":\"v-7f4aff48#remove\",\"21\":\"v-7f4aff48#repo-settings\",\"22\":\"v-7f4aff48#reference\",\"23\":\"v-7f4aff48#other\",\"24\":\"v-50b2c6d0\",\"25\":\"v-50b2c6d0#catalog\",\"26\":\"v-26c7c346\",\"27\":\"v-26c7c346#file-format\",\"28\":\"v-26c7c346@0\",\"29\":\"v-7554a597\",\"30\":\"v-7554a597@0\",\"31\":\"v-1605c99e\",\"32\":\"v-1605c99e#object-types\",\"33\":\"v-1605c99e#conventions\",\"34\":\"v-1605c99e#naming\",\"35\":\"v-1605c99e#object-prefixing\",\"36\":\"v-1605c99e#object-descriptions\",\"37\":\"v-1605c99e#variable-prefixing\",\"38\":\"v-1605c99e#downport\",\"39\":\"v-1605c99e#syntax\",\"40\":\"v-1605c99e#standard-objects\",\"41\":\"v-1605c99e#file-formats\",\"42\":\"v-1605c99e#formatting-the-source-code\",\"43\":\"v-1605c99e#line-width\",\"44\":\"v-1605c99e#pretty-printer\",\"45\":\"v-1605c99e#dynpros\",\"46\":\"v-1605c99e#abaplint\",\"47\":\"v-1605c99e#eslint\",\"48\":\"v-1605c99e#internationalization-i18n\",\"49\":\"v-1605c99e@0\",\"50\":\"v-f6ea7b76\",\"51\":\"v-f6ea7b76#package-structure\",\"52\":\"v-f6ea7b76#src-git\",\"53\":\"v-f6ea7b76#src-ui-core\",\"54\":\"v-f6ea7b76#src-http\",\"55\":\"v-f6ea7b76#src-json\",\"56\":\"v-f6ea7b76#src-objects-aff\",\"57\":\"v-f6ea7b76@0\",\"58\":\"v-2ff4a912\",\"59\":\"v-2ff4a912#version\",\"60\":\"v-2ff4a912#changelog\",\"61\":\"v-2ff4a912#process\",\"62\":\"v-2ff4a912@0\",\"63\":\"v-974caada\",\"64\":\"v-974caada#catalog\",\"65\":\"v-174d6e92\",\"66\":\"v-174d6e92#repositories\",\"67\":\"v-174d6e92#create-online\",\"68\":\"v-174d6e92#create-offline\",\"69\":\"v-174d6e92#list\",\"70\":\"v-174d6e92#read\",\"71\":\"v-174d6e92#find\",\"72\":\"v-174d6e92#delete\",\"73\":\"v-174d6e92#purge\",\"74\":\"v-174d6e92#status\",\"75\":\"v-174d6e92#online-repository\",\"76\":\"v-174d6e92#list-branches\",\"77\":\"v-174d6e92#switch-branch\",\"78\":\"v-174d6e92#create-branch\",\"79\":\"v-174d6e92#delete-branch\",\"80\":\"v-174d6e92#push-changes\",\"81\":\"v-174d6e92#pull-changes\",\"82\":\"v-174d6e92#offline-repository\",\"83\":\"v-174d6e92#import-zip\",\"84\":\"v-174d6e92#export-zip\",\"85\":\"v-174d6e92#progress-indicator\",\"86\":\"v-174d6e92@0\",\"87\":\"v-cabbab28\",\"88\":\"v-cabbab28#catalog\",\"89\":\"v-4b7a327c\",\"90\":\"v-4b7a327c#clas\",\"91\":\"v-4b7a327c@0\",\"92\":\"v-0669fc14\",\"93\":\"v-0669fc14#overview\",\"94\":\"v-0669fc14@0\",\"95\":\"v-142be2c4\",\"96\":\"v-142be2c4#constructor\",\"97\":\"v-142be2c4#interface\",\"98\":\"v-142be2c4#metadata\",\"99\":\"v-142be2c4#deserialization-step\",\"100\":\"v-142be2c4#deserialization-order\",\"101\":\"v-142be2c4#super-class\",\"102\":\"v-142be2c4#generic-class\",\"103\":\"v-142be2c4#serialize-object\",\"104\":\"v-142be2c4#deserialize-object\",\"105\":\"v-142be2c4#activate-object\",\"106\":\"v-142be2c4#internationalization-i18n\",\"107\":\"v-142be2c4#testing\",\"108\":\"v-142be2c4#processing-order-and-dependencies\",\"109\":\"v-142be2c4#serialize-process\",\"110\":\"v-142be2c4#deserialize-process\",\"111\":\"v-142be2c4#uninstall-process\",\"112\":\"v-142be2c4@0\",\"113\":\"v-4ce5761f\",\"114\":\"v-4ce5761f#task-list-for-new-serializers\",\"115\":\"v-4ce5761f@0\",\"116\":\"v-6cca6f5b\",\"117\":\"v-6cca6f5b#catalog\",\"118\":\"v-35faf283\",\"119\":\"v-35faf283#running-the-site-locally\",\"120\":\"v-35faf283@0\",\"121\":\"v-23d1f10b\",\"122\":\"v-23d1f10b#collection-of-links-to-various-git-related-documentation\",\"123\":\"v-23d1f10b@0\",\"124\":\"v-6f27bb46\",\"125\":\"v-6f27bb46#catalog\",\"126\":\"v-14742194\",\"127\":\"v-14742194#_1-adhoc-ci-with-report-zabapgit-ci\",\"128\":\"v-14742194#_2-rest-api\",\"129\":\"v-14742194#_3-schedule-job-sequence-with-report-zabapgit-ci-job-scheduler\",\"130\":\"v-14742194#check-transportable-packages\",\"131\":\"v-14742194#prerequisites\",\"132\":\"v-14742194@0\",\"133\":\"v-9e17fb70\",\"134\":\"v-9e17fb70#abap\",\"135\":\"v-9e17fb70#javascript\",\"136\":\"v-9e17fb70#sap-gui-for-windows\",\"137\":\"v-9e17fb70#sap-gui-for-html-web\",\"138\":\"v-9e17fb70#sap-gui-for-java\",\"139\":\"v-9e17fb70#web-edition\",\"140\":\"v-9e17fb70@0\",\"141\":\"v-41f63175\",\"142\":\"v-41f63175@0\",\"143\":\"v-6df5895a\",\"144\":\"v-6df5895a#catalog\",\"145\":\"v-0912a191\",\"146\":\"v-0912a191@0\",\"147\":\"v-3b749041\",\"148\":\"v-3b749041#tl-dr\",\"149\":\"v-3b749041#asset-manager\",\"150\":\"v-3b749041#compiling-standalone-version-of-abapgit-abapmerge\",\"151\":\"v-3b749041#css-structure-and-themes\",\"152\":\"v-3b749041#css-variables-support\",\"153\":\"v-3b749041#recommended-asset-development-flow\",\"154\":\"v-3b749041@0\",\"155\":\"v-680c4ad5\",\"156\":\"v-680c4ad5#general\",\"157\":\"v-680c4ad5#values-normalization\",\"158\":\"v-680c4ad5#values-and-validation\",\"159\":\"v-680c4ad5@0\",\"160\":\"v-79cd1776\",\"161\":\"v-79cd1776#general\",\"162\":\"v-79cd1776#components\",\"163\":\"v-79cd1776#command-palette\",\"164\":\"v-79cd1776#to-do\",\"165\":\"v-79cd1776@0\",\"166\":\"v-286ba437\",\"167\":\"v-286ba437#tl-dr\",\"168\":\"v-286ba437#gui-components\",\"169\":\"v-286ba437#rendering-content\",\"170\":\"v-286ba437#html-helper\",\"171\":\"v-286ba437#renderables\",\"172\":\"v-286ba437#postponed-html-parts\",\"173\":\"v-286ba437#router-and-event-handlers\",\"174\":\"v-286ba437#hotkey\",\"175\":\"v-286ba437@0\",\"176\":\"v-0aeb53ac\",\"177\":\"v-0aeb53ac#architecture-comments\",\"178\":\"v-0aeb53ac#separate-page-popup\",\"179\":\"v-0aeb53ac#calling-a-popup-in-page\",\"180\":\"v-0aeb53ac#initiating-the-popup-and-retrieving-the-result\",\"181\":\"v-0aeb53ac@0\",\"182\":\"v-23b84093\",\"183\":\"v-23b84093#catalog\",\"184\":\"v-7d2e6031\",\"185\":\"v-7d2e6031#summary\",\"186\":\"v-7d2e6031#prerequisites\",\"187\":\"v-7d2e6031#install-standalone-version\",\"188\":\"v-7d2e6031#install-developer-version\",\"189\":\"v-7d2e6031#online-recommended\",\"190\":\"v-7d2e6031#offline\",\"191\":\"v-7d2e6031@0\",\"192\":\"v-da6c54ee\",\"193\":\"v-da6c54ee#page-top\",\"194\":\"v-da6c54ee#page-header\",\"195\":\"v-da6c54ee#icon-and-description\",\"196\":\"v-da6c54ee#repository\",\"197\":\"v-da6c54ee#changelog\",\"198\":\"v-da6c54ee#favorite\",\"199\":\"v-da6c54ee#write-protection\",\"200\":\"v-da6c54ee#background-mode\",\"201\":\"v-da6c54ee#branch-tag-commit\",\"202\":\"v-da6c54ee#package\",\"203\":\"v-da6c54ee#page-content\",\"204\":\"v-da6c54ee#page-footer\",\"205\":\"v-da6c54ee#sponsor-us\",\"206\":\"v-da6c54ee#version\",\"207\":\"v-da6c54ee#javascript\",\"208\":\"v-da6c54ee@0\",\"209\":\"v-dc289a5c\",\"210\":\"v-dc289a5c#command-palettes\",\"211\":\"v-dc289a5c#command-selector\",\"212\":\"v-dc289a5c#repository-selector\",\"213\":\"v-dc289a5c#keyboard-navigation\",\"214\":\"v-dc289a5c#general\",\"215\":\"v-dc289a5c#hotkeys\",\"216\":\"v-dc289a5c#link-hints\",\"217\":\"v-dc289a5c@0\",\"218\":\"v-3aecceec\",\"219\":\"v-3aecceec@0\",\"220\":\"v-97a4d760\",\"221\":\"v-97a4d760#standalone-version\",\"222\":\"v-97a4d760#developer-version\",\"223\":\"v-97a4d760#online-project\",\"224\":\"v-97a4d760#offline-project\",\"225\":\"v-97a4d760#user-exits\",\"226\":\"v-97a4d760#troubleshooting\",\"227\":\"v-97a4d760@0\",\"228\":\"v-79352e7b\",\"229\":\"v-79352e7b#catalog\",\"230\":\"v-b753c16a\",\"231\":\"v-b753c16a#_2014\",\"232\":\"v-b753c16a#_2015\",\"233\":\"v-b753c16a#_2016\",\"234\":\"v-b753c16a#_2017\",\"235\":\"v-b753c16a#_2018\",\"236\":\"v-b753c16a#_2019\",\"237\":\"v-b753c16a#_2020\",\"238\":\"v-b753c16a#_2021\",\"239\":\"v-b753c16a#_2022\",\"240\":\"v-b753c16a#_2023\",\"241\":\"v-b753c16a@0\",\"242\":\"v-8ffe8b28\",\"243\":\"v-8ffe8b28@0\",\"244\":\"v-b4d4656a\",\"245\":\"v-b4d4656a#steps\",\"246\":\"v-b4d4656a@0\",\"247\":\"v-5c3b6510\",\"248\":\"v-5c3b6510@0\",\"249\":\"v-b86e8c0a\",\"250\":\"v-b86e8c0a#customer\",\"251\":\"v-b86e8c0a#sap\",\"252\":\"v-b86e8c0a#consulting-and-partner\",\"253\":\"v-b86e8c0a#projects\",\"254\":\"v-b86e8c0a#updates\",\"255\":\"v-b86e8c0a@0\",\"256\":\"v-c774b90c\",\"257\":\"v-c774b90c#for-end-users\",\"258\":\"v-c774b90c#for-maintainers\",\"259\":\"v-c774b90c@0\",\"260\":\"v-52841e19\",\"261\":\"v-52841e19#catalog\",\"262\":\"v-52841e19#online\",\"263\":\"v-52841e19#offline\",\"264\":\"v-52841e19#remove\",\"265\":\"v-741130c0\",\"266\":\"v-741130c0#catalog\",\"267\":\"v-0de740f9\",\"268\":\"v-0de740f9#abap-language-version\",\"269\":\"v-0de740f9#settings\",\"270\":\"v-0de740f9#any-abap-language-version\",\"271\":\"v-0de740f9#export\",\"272\":\"v-0de740f9#import\",\"273\":\"v-0de740f9#ignore-abap-language-version\",\"274\":\"v-0de740f9#export-1\",\"275\":\"v-0de740f9#import-1\",\"276\":\"v-0de740f9#standard-abap-abap-for-key-users-abap-for-cloud-development\",\"277\":\"v-0de740f9#export-2\",\"278\":\"v-0de740f9#import-2\",\"279\":\"v-0de740f9#summary\",\"280\":\"v-0de740f9#examples\",\"281\":\"v-0de740f9#supported-object-types\",\"282\":\"v-0de740f9#further-information\",\"283\":\"v-0de740f9@0\",\"284\":\"v-088182bf\",\"285\":\"v-088182bf#apack-in-namespaces\",\"286\":\"v-088182bf#transporting-apack-implementation-classes\",\"287\":\"v-088182bf#examples\",\"288\":\"v-088182bf@0\",\"289\":\"v-4959a65f\",\"290\":\"v-4959a65f#example\",\"291\":\"v-4959a65f@0\",\"292\":\"v-72455036\",\"293\":\"v-72455036#global-settings\",\"294\":\"v-72455036#user-settings\",\"295\":\"v-72455036#repository-meta-data\",\"296\":\"v-72455036#repository-checksums\",\"297\":\"v-72455036#background\",\"298\":\"v-72455036#backup-restore\",\"299\":\"v-72455036#emergency-mode\",\"300\":\"v-72455036#package-settings\",\"301\":\"v-72455036@0\",\"302\":\"v-4bc4da84\",\"303\":\"v-4bc4da84#overview\",\"304\":\"v-4bc4da84#exits\",\"305\":\"v-4bc4da84#adjust-display-commit-url\",\"306\":\"v-4bc4da84#adjust-display-filename\",\"307\":\"v-4bc4da84#allow-sap-objects\",\"308\":\"v-4bc4da84#change-local-host\",\"309\":\"v-4bc4da84#change-max-parallel-processes\",\"310\":\"v-4bc4da84#change-proxy-authentication\",\"311\":\"v-4bc4da84#change-proxy-port\",\"312\":\"v-4bc4da84#change-proxy-url\",\"313\":\"v-4bc4da84#change-rfc-server-group\",\"314\":\"v-4bc4da84#change-supported-data-objects\",\"315\":\"v-4bc4da84#change-supported-object-types\",\"316\":\"v-4bc4da84#change-tadir\",\"317\":\"v-4bc4da84#create-http-client\",\"318\":\"v-4bc4da84#custom-serialize-abap-clif\",\"319\":\"v-4bc4da84#deserialize-postprocess\",\"320\":\"v-4bc4da84#determine-transport-request\",\"321\":\"v-4bc4da84#enhance-repo-toolbar\",\"322\":\"v-4bc4da84#get-ci-tests\",\"323\":\"v-4bc4da84#get-ssl-id\",\"324\":\"v-4bc4da84#http-client\",\"325\":\"v-4bc4da84#on-event\",\"326\":\"v-4bc4da84#pre-calculate-repo-status\",\"327\":\"v-4bc4da84#serialize-postprocessing\",\"328\":\"v-4bc4da84#validate-before-push\",\"329\":\"v-4bc4da84#wall-message-list\",\"330\":\"v-4bc4da84#wall-message-repo\",\"331\":\"v-4bc4da84@0\",\"332\":\"v-43980e6a\",\"333\":\"v-43980e6a#enabling\",\"334\":\"v-43980e6a@0\",\"335\":\"v-78e86c96\",\"336\":\"v-78e86c96#folders\",\"337\":\"v-78e86c96#limitations\",\"338\":\"v-78e86c96#troubleshooting\",\"339\":\"v-78e86c96#technical-details\",\"340\":\"v-78e86c96#files\",\"341\":\"v-78e86c96#special-cases\",\"342\":\"v-78e86c96#limitations-1\",\"343\":\"v-78e86c96#troubleshooting-1\",\"344\":\"v-78e86c96#technical-details-1\",\"345\":\"v-78e86c96#related-checks\",\"346\":\"v-78e86c96#technical-details-2\",\"347\":\"v-78e86c96@0\",\"348\":\"v-71ce9558\",\"349\":\"v-71ce9558#general\",\"350\":\"v-71ce9558#repository-list\",\"351\":\"v-71ce9558#repository-view\",\"352\":\"v-71ce9558#remote-settings\",\"353\":\"v-71ce9558#stage\",\"354\":\"v-71ce9558#patch\",\"355\":\"v-71ce9558#diff\",\"356\":\"v-71ce9558#code-inspector\",\"357\":\"v-71ce9558@0\",\"358\":\"v-252f2d9f\",\"359\":\"v-252f2d9f@0\",\"360\":\"v-3914cc7e\",\"361\":\"v-3914cc7e@0\",\"362\":\"v-1d61fcf8\",\"363\":\"v-1d61fcf8#note-analyzer-for-abapgit\",\"364\":\"v-1d61fcf8#usage\",\"365\":\"v-1d61fcf8#maintenance\",\"366\":\"v-1d61fcf8@0\",\"367\":\"v-47821728\",\"368\":\"v-47821728#packages\",\"369\":\"v-47821728#automatic-creation-of-package\",\"370\":\"v-47821728#manually-creation-of-package\",\"371\":\"v-47821728#transports\",\"372\":\"v-47821728@0\",\"373\":\"v-f51e8eea\",\"374\":\"v-f51e8eea@0\",\"375\":\"v-ec7a72d2\",\"376\":\"v-ec7a72d2#lxe-framework-highly-experimental-use-with-care\",\"377\":\"v-ec7a72d2#concept\",\"378\":\"v-ec7a72d2#problem-with-the-old-approach\",\"379\":\"v-ec7a72d2#new-approach\",\"380\":\"v-ec7a72d2#current-limitations\",\"381\":\"v-ec7a72d2#usage\",\"382\":\"v-ec7a72d2#deployment-to-another-system\",\"383\":\"v-ec7a72d2@0\",\"384\":\"v-01e98f2d\",\"385\":\"v-01e98f2d#catalog\",\"386\":\"v-d7ac3c38\",\"387\":\"v-d7ac3c38#background-mode\",\"388\":\"v-d7ac3c38#list-of-repositories-with-background-mode\",\"389\":\"v-d7ac3c38#defining-a-job\",\"390\":\"v-d7ac3c38#custom-background-modes\",\"391\":\"v-d7ac3c38@0\",\"392\":\"v-17c01b88\",\"393\":\"v-17c01b88#repository-settings\",\"394\":\"v-17c01b88#name-and-version\",\"395\":\"v-17c01b88#texts\",\"396\":\"v-17c01b88#main-language\",\"397\":\"v-17c01b88#translation-languages\",\"398\":\"v-17c01b88#files\",\"399\":\"v-17c01b88#starting-folder\",\"400\":\"v-17c01b88#folder-logic\",\"401\":\"v-17c01b88#prefix\",\"402\":\"v-17c01b88#full\",\"403\":\"v-17c01b88#mixed\",\"404\":\"v-17c01b88#ignore-files\",\"405\":\"v-17c01b88#abap\",\"406\":\"v-17c01b88#requirements\",\"407\":\"v-17c01b88#abap-language-version\",\"408\":\"v-17c01b88@0\",\"409\":\"v-ac98f18a\",\"410\":\"v-ac98f18a#local-settings\",\"411\":\"v-ac98f18a#display-name\",\"412\":\"v-ac98f18a#labels\",\"413\":\"v-ac98f18a#write-protected\",\"414\":\"v-ac98f18a#ignore-sub-packages\",\"415\":\"v-ac98f18a#only-local-objects\",\"416\":\"v-ac98f18a#serialize-main-language-only\",\"417\":\"v-ac98f18a#code-inspector\",\"418\":\"v-ac98f18a#code-inspector-check-variant\",\"419\":\"v-ac98f18a#block-commit-if-code-inspection-has-errors\",\"420\":\"v-ac98f18a@0\",\"421\":\"v-0be4b1f4\",\"422\":\"v-0be4b1f4#remote-settings\",\"423\":\"v-0be4b1f4#online-repositories\",\"424\":\"v-0be4b1f4#offline-repositories\",\"425\":\"v-0be4b1f4@0\",\"426\":\"v-6651c287\",\"427\":\"v-6651c287#statistics\",\"428\":\"v-6651c287@0\",\"429\":\"v-7f3ae0ae\",\"430\":\"v-7f3ae0ae#catalog\",\"431\":\"v-43307cf2\",\"432\":\"v-43307cf2#general\",\"433\":\"v-43307cf2#sap-gui-for-windows\",\"434\":\"v-43307cf2#sap-gui-for-java\",\"435\":\"v-43307cf2#sap-gui-for-html\",\"436\":\"v-43307cf2#browser\",\"437\":\"v-43307cf2@0\",\"438\":\"v-218e7a1a\",\"439\":\"v-218e7a1a#proxy-settings\",\"440\":\"v-218e7a1a#commit-message-settings\",\"441\":\"v-218e7a1a#development-internal-settings\",\"442\":\"v-218e7a1a#enable-critical-unit-tests\",\"443\":\"v-218e7a1a#enable-experimental-features\",\"444\":\"v-218e7a1a@0\",\"445\":\"v-d7087ec6\",\"446\":\"v-d7087ec6#startup\",\"447\":\"v-d7087ec6#user-interface\",\"448\":\"v-d7087ec6#interaction\",\"449\":\"v-d7087ec6#system-resources\",\"450\":\"v-d7087ec6#standalone-version\",\"451\":\"v-d7087ec6#developer-version\",\"452\":\"v-d7087ec6@0\",\"453\":\"v-b4e259ea\",\"454\":\"v-b4e259ea#overview\",\"455\":\"v-b4e259ea#sap-crypto-library\",\"456\":\"v-b4e259ea#sap-system-profile\",\"457\":\"v-b4e259ea#sap-trust-manager\",\"458\":\"v-b4e259ea#download-the-certificate-files\",\"459\":\"v-b4e259ea#option-a-chrome\",\"460\":\"v-b4e259ea#option-b-firefox\",\"461\":\"v-b4e259ea#option-c-safari\",\"462\":\"v-b4e259ea#option-d-manual\",\"463\":\"v-b4e259ea#install-the-certificate-files\",\"464\":\"v-b4e259ea#abapgit-settings\",\"465\":\"v-b4e259ea#testing-the-connection\",\"466\":\"v-b4e259ea#troubleshooting\",\"467\":\"v-b4e259ea#notes\",\"468\":\"v-b4e259ea#actions-requiring-authentication\",\"469\":\"v-b4e259ea#user-exits\",\"470\":\"v-b4e259ea#accessing-github\",\"471\":\"v-b4e259ea@0\",\"472\":\"v-362eb318\",\"473\":\"v-362eb318#selection-screen\",\"474\":\"v-362eb318#expected-result\",\"475\":\"v-362eb318#errors-and-troubleshooting\",\"476\":\"v-362eb318@0\",\"477\":\"v-3e76b876\",\"478\":\"v-3e76b876#catalog\",\"479\":\"v-7bddc9ec\",\"480\":\"v-7bddc9ec@0\",\"481\":\"v-3ad8b04d\",\"482\":\"v-3ad8b04d#pre-requisites\",\"483\":\"v-3ad8b04d@0\",\"484\":\"v-2ec3c91b\",\"485\":\"v-2ec3c91b#download-zip-file\",\"486\":\"v-2ec3c91b#import-zip-file\",\"487\":\"v-2ec3c91b#hints\",\"488\":\"v-2ec3c91b@0\",\"489\":\"v-49558863\",\"490\":\"v-49558863@0\",\"491\":\"v-6a30cffa\",\"492\":\"v-6a30cffa#catalog\",\"493\":\"v-fd49d704\",\"494\":\"v-fd49d704#token-or-two-factor-authentication\",\"495\":\"v-fd49d704#using-a-password-manager\",\"496\":\"v-fd49d704#using-a-custom-authentication-mechanism\",\"497\":\"v-fd49d704#security-considerations\",\"498\":\"v-fd49d704#troubleshooting\",\"499\":\"v-fd49d704@0\",\"500\":\"v-c87ae4e8\",\"501\":\"v-c87ae4e8@0\",\"502\":\"v-755a2ac0\",\"503\":\"v-755a2ac0#repository-setup\",\"504\":\"v-755a2ac0#adding-objects\",\"505\":\"v-755a2ac0#modifying-objects\",\"506\":\"v-755a2ac0#modifying-repository\",\"507\":\"v-755a2ac0#handling-licenses\",\"508\":\"v-755a2ac0@0\",\"509\":\"v-9333e0be\",\"510\":\"v-9333e0be@0\",\"511\":\"v-aa70c2e2\",\"512\":\"v-aa70c2e2#new-repository\",\"513\":\"v-aa70c2e2#stage-and-commit\",\"514\":\"v-aa70c2e2@0\",\"515\":\"v-d3eccfe0\",\"516\":\"v-d3eccfe0#stage\",\"517\":\"v-d3eccfe0#commit\",\"518\":\"v-d3eccfe0@0\",\"519\":\"v-c9cf1466\",\"520\":\"v-c9cf1466@0\",\"521\":\"v-5a4f9bf2\",\"522\":\"v-5a4f9bf2#catalog\",\"523\":\"v-c7dbbcae\",\"524\":\"v-c7dbbcae#remove-repository\",\"525\":\"v-c7dbbcae#remove-objects\",\"526\":\"v-c7dbbcae#uninstall\",\"527\":\"v-c7dbbcae@0\"},\"fieldIds\":{\"h\":0,\"t\":1,\"c\":2},\"fieldLength\":{\"0\":[1],\"1\":[3,35],\"2\":[1,100],\"3\":[1,27],\"4\":[6,50],\"5\":[2,3],\"6\":[1],\"7\":[2,7],\"8\":[1,7],\"9\":[1,4],\"10\":[2,9],\"11\":[1,1],\"12\":[2,2],\"13\":[2],\"14\":[1],\"15\":[2,6],\"16\":[1,8],\"17\":[1],\"18\":[1,17],\"19\":[1,6],\"20\":[1,1],\"21\":[2,8],\"22\":[1,25],\"23\":[1,14],\"24\":[2],\"25\":[1,7],\"26\":[1,51],\"27\":[2,55],\"28\":[null,null,2],\"29\":[1,176],\"30\":[null,null,2],\"31\":[2],\"32\":[2,54],\"33\":[1],\"34\":[1],\"35\":[2,19],\"36\":[2,28],\"37\":[2,11],\"38\":[1],\"39\":[1,32],\"40\":[2,39],\"41\":[2,74],\"42\":[4],\"43\":[2,21],\"44\":[2,16],\"45\":[1,29],\"46\":[1,29],\"47\":[1,35],\"48\":[3,55],\"49\":[null,null,2],\"50\":[2],\"51\":[2,5],\"52\":[3,25],\"53\":[4,16],\"54\":[3,18],\"55\":[3,22],\"56\":[4,16],\"57\":[null,null,2],\"58\":[1,36],\"59\":[1,40],\"60\":[1,41],\"61\":[1,101],\"62\":[null,null,2],\"63\":[1],\"64\":[1,1],\"65\":[1,37],\"66\":[1],\"67\":[2,43],\"68\":[2,42],\"69\":[1,44],\"70\":[1,37],\"71\":[1,24],\"72\":[1,19],\"73\":[1,37],\"74\":[1,20],\"75\":[2,87],\"76\":[2,21],\"77\":[2,14],\"78\":[2,33],\"79\":[2,26],\"80\":[2,90],\"81\":[2,129],\"82\":[2,17],\"83\":[2,31],\"84\":[2,27],\"85\":[2,29],\"86\":[null,null,1],\"87\":[1],\"88\":[1,7],\"89\":[2,27],\"90\":[1,56],\"91\":[null,null,1],\"92\":[1],\"93\":[1,155],\"94\":[null,null,1],\"95\":[2],\"96\":[1,99],\"97\":[1,121],\"98\":[1,44],\"99\":[2,13],\"100\":[2,19],\"101\":[2,107],\"102\":[2,33],\"103\":[2,66],\"104\":[2,103],\"105\":[2,56],\"106\":[3,87],\"107\":[1,89],\"108\":[4],\"109\":[2,54],\"110\":[2,75],\"111\":[2,45],\"112\":[null,null,1],\"113\":[2],\"114\":[5,240],\"115\":[null,null,1],\"116\":[2],\"117\":[1,2],\"118\":[1,32],\"119\":[4,14],\"120\":[null,null,1],\"121\":[1],\"122\":[8,53],\"123\":[null,null,1],\"124\":[1],\"125\":[1,4],\"126\":[2,89],\"127\":[6,8],\"128\":[3,7],\"129\":[10,12],\"130\":[3,80],\"131\":[1,49],\"132\":[null,null,1],\"133\":[1],\"134\":[1,74],\"135\":[1,46],\"136\":[4,58],\"137\":[6,11],\"138\":[4,9],\"139\":[2,16],\"140\":[null,null,1],\"141\":[2,45],\"142\":[null,null,1],\"143\":[2],\"144\":[1,9],\"145\":[1,102],\"146\":[null,null,1],\"147\":[3,18],\"148\":[2,78],\"149\":[2,164],\"150\":[7,107],\"151\":[4,80],\"152\":[3,104],\"153\":[4,173],\"154\":[null,null,1],\"155\":[2,14],\"156\":[1,161],\"157\":[2,66],\"158\":[3,110],\"159\":[null,null,1],\"160\":[1,15],\"161\":[1,85],\"162\":[1,14],\"163\":[2,77],\"164\":[2,11],\"165\":[null,null,1],\"166\":[2,17],\"167\":[2,92],\"168\":[2,111],\"169\":[2,46],\"170\":[2,176],\"171\":[1,101],\"172\":[3,96],\"173\":[4,235],\"174\":[1,71],\"175\":[null,null,1],\"176\":[2,10],\"177\":[2,62],\"178\":[3,90],\"179\":[5,133],\"180\":[6,175],\"181\":[null,null,1],\"182\":[2],\"183\":[1,6],\"184\":[1],\"185\":[1,61],\"186\":[1,36],\"187\":[3,71],\"188\":[3,26],\"189\":[3,75],\"190\":[1,53],\"191\":[null,null,2],\"192\":[2,20],\"193\":[2,29],\"194\":[2,19],\"195\":[3,4],\"196\":[1,20],\"197\":[1,28],\"198\":[1,16],\"199\":[2,18],\"200\":[2,16],\"201\":[3,29],\"202\":[1,17],\"203\":[2,45],\"204\":[2,11],\"205\":[2,25],\"206\":[1,35],\"207\":[1,39],\"208\":[null,null,2],\"209\":[2,9],\"210\":[2,22],\"211\":[2,47],\"212\":[2,46],\"213\":[2],\"214\":[1,21],\"215\":[1,43],\"216\":[2,26],\"217\":[null,null,2],\"218\":[1,37],\"219\":[null,null,2],\"220\":[1],\"221\":[2,23],\"222\":[2,19],\"223\":[2,37],\"224\":[2,31],\"225\":[2,43],\"226\":[1,65],\"227\":[null,null,2],\"228\":[1],\"229\":[1,14],\"230\":[3],\"231\":[1,8],\"232\":[1,13],\"233\":[1,21],\"234\":[1,75],\"235\":[1,83],\"236\":[1,57],\"237\":[1,51],\"238\":[1,35],\"239\":[1,65],\"240\":[1,39],\"241\":[null,null,1],\"242\":[1,21],\"243\":[null,null,1],\"244\":[2,18],\"245\":[1,122],\"246\":[null,null,1],\"247\":[3,20],\"248\":[null,null,1],\"249\":[4],\"250\":[1,31],\"251\":[1,5],\"252\":[3,54],\"253\":[1,9],\"254\":[1,17],\"255\":[null,null,1],\"256\":[2],\"257\":[3,44],\"258\":[2,51],\"259\":[null,null,1],\"260\":[1],\"261\":[1],\"262\":[1,17],\"263\":[1,6],\"264\":[1,1],\"265\":[1],\"266\":[1,25],\"267\":[3],\"268\":[3,56],\"269\":[1,34],\"270\":[4,38],\"271\":[1,15],\"272\":[1,44],\"273\":[4,39],\"274\":[1,15],\"275\":[1,32],\"276\":[7,37],\"277\":[1,15],\"278\":[1,60],\"279\":[1,48],\"280\":[1,109],\"281\":[3,41],\"282\":[2,13],\"283\":[null,null,1],\"284\":[1,164],\"285\":[3,39],\"286\":[4,64],\"287\":[1,34],\"288\":[null,null,1],\"289\":[1,55],\"290\":[1,56],\"291\":[null,null,1],\"292\":[2,59],\"293\":[2,75],\"294\":[2,118],\"295\":[3,183],\"296\":[2,66],\"297\":[1,56],\"298\":[2,41],\"299\":[2,62],\"300\":[2,67],\"301\":[null,null,1],\"302\":[2,15],\"303\":[1,77],\"304\":[1],\"305\":[4,33],\"306\":[3,30],\"307\":[3,7],\"308\":[3,26],\"309\":[4,18],\"310\":[3,14],\"311\":[3,8],\"312\":[3,7],\"313\":[4,36],\"314\":[4,20],\"315\":[4,6],\"316\":[2,19],\"317\":[3,11],\"318\":[4,83],\"319\":[2,37],\"320\":[3,21],\"321\":[3,25],\"322\":[3,25],\"323\":[3,12],\"324\":[2,18],\"325\":[2,49],\"326\":[4,58],\"327\":[2,22],\"328\":[3,18],\"329\":[3,15],\"330\":[3,20],\"331\":[null,null,1],\"332\":[2,62],\"333\":[1,34],\"334\":[null,null,1],\"335\":[2],\"336\":[1,47],\"337\":[1,66],\"338\":[1,74],\"339\":[2,18],\"340\":[1,93],\"341\":[2,71],\"342\":[1,92],\"343\":[1,24],\"344\":[2,18],\"345\":[2,158],\"346\":[2,11],\"347\":[null,null,1],\"348\":[2,13],\"349\":[1,10],\"350\":[2,30],\"351\":[2,28],\"352\":[2,19],\"353\":[1,11],\"354\":[1,10],\"355\":[1,14],\"356\":[2,7],\"357\":[null,null,1],\"358\":[2,114],\"359\":[null,null,1],\"360\":[1,94],\"361\":[null,null,1],\"362\":[2],\"363\":[4,24],\"364\":[1,27],\"365\":[1,14],\"366\":[null,null,1],\"367\":[2],\"368\":[1,53],\"369\":[4,38],\"370\":[4,19],\"371\":[1,78],\"372\":[null,null,1],\"373\":[3,468],\"374\":[null,null,1],\"375\":[3,37],\"376\":[8],\"377\":[1,22],\"378\":[5,44],\"379\":[2,25],\"380\":[2,12],\"381\":[1,51],\"382\":[4,41],\"383\":[null,null,1],\"384\":[2],\"385\":[1,8],\"386\":[2],\"387\":[2,78],\"388\":[6,28],\"389\":[3,39],\"390\":[3,27],\"391\":[null,null,2],\"392\":[4,79],\"393\":[2,15],\"394\":[3,43],\"395\":[1],\"396\":[2,54],\"397\":[2,71],\"398\":[1],\"399\":[2,14],\"400\":[2,10],\"401\":[1,51],\"402\":[1,49],\"403\":[1,54],\"404\":[2,85],\"405\":[1],\"406\":[1,40],\"407\":[3,48],\"408\":[null,null,2],\"409\":[1],\"410\":[2,14],\"411\":[2,16],\"412\":[1,34],\"413\":[2,61],\"414\":[3,37],\"415\":[3,31],\"416\":[4,32],\"417\":[2,42],\"418\":[4,67],\"419\":[7,80],\"420\":[null,null,2],\"421\":[1],\"422\":[2,43],\"423\":[2,40],\"424\":[2,16],\"425\":[null,null,2],\"426\":[1],\"427\":[1,12],\"428\":[null,null,2],\"429\":[1],\"430\":[1,8],\"431\":[2],\"432\":[1,26],\"433\":[4,145],\"434\":[4,39],\"435\":[4,39],\"436\":[1,33],\"437\":[null,null,1],\"438\":[2,31],\"439\":[2,68],\"440\":[3,84],\"441\":[3,14],\"442\":[4,24],\"443\":[3,24],\"444\":[null,null,1],\"445\":[2,32],\"446\":[1,19],\"447\":[2,134],\"448\":[1,86],\"449\":[2],\"450\":[2,17],\"451\":[2,51],\"452\":[null,null,1],\"453\":[2],\"454\":[1,93],\"455\":[3,71],\"456\":[3,130],\"457\":[3,58],\"458\":[4],\"459\":[3,54],\"460\":[3,34],\"461\":[3,37],\"462\":[3,18],\"463\":[4,39],\"464\":[2,34],\"465\":[3,14],\"466\":[1,127],\"467\":[1],\"468\":[3,50],\"469\":[2,50],\"470\":[2,21],\"471\":[null,null,1],\"472\":[2,29],\"473\":[2,31],\"474\":[2,3],\"475\":[3,33],\"476\":[null,null,1],\"477\":[1],\"478\":[1,6],\"479\":[2,48],\"480\":[null,null,2],\"481\":[2,25],\"482\":[2,59],\"483\":[null,null,2],\"484\":[2],\"485\":[3,42],\"486\":[3,48],\"487\":[1,38],\"488\":[null,null,2],\"489\":[3,69],\"490\":[null,null,2],\"491\":[1],\"492\":[1,18],\"493\":[1,118],\"494\":[5,71],\"495\":[4,49],\"496\":[5,26],\"497\":[2,65],\"498\":[1,94],\"499\":[null,null,2],\"500\":[4,45],\"501\":[null,null,2],\"502\":[2],\"503\":[2,20],\"504\":[2,18],\"505\":[2,20],\"506\":[2,26],\"507\":[2,48],\"508\":[null,null,2],\"509\":[3,71],\"510\":[null,null,2],\"511\":[4,34],\"512\":[2,25],\"513\":[3,42],\"514\":[null,null,2],\"515\":[4,53],\"516\":[1,68],\"517\":[1,90],\"518\":[null,null,2],\"519\":[5,30],\"520\":[null,null,2],\"521\":[1],\"522\":[1,1],\"523\":[1,29],\"524\":[2,30],\"525\":[2,49],\"526\":[1,50],\"527\":[null,null,1]},\"averageFieldLength\":[2.0703982061754167,44.40796116320402,0.46042667397612985],\"storedFields\":{\"0\":{\"h\":\"Home\"},\"1\":{\"h\":\"Welcome to abapGit\",\"t\":[\"abapGit is a git client for ABAP developed in ABAP. It requires ABAP version 702 SP 8 or higher.\",\"Latest build: zabapgit_standalone.prog.abap\",\"For questions/comments/bugs/feature requests/wishes please create an issue.\"]},\"2\":{\"h\":\"Security\",\"t\":[\"abapGit is a tool to import and export code between ABAP systems. If a developer has a developer key to the system, the developer can perform these actions already. abapGit enables the developer to do mass export/changes/imports but not more than already possible to do manually.\",\"Running automated security checks on the abapGit code will by design give a lot of errors, as abapGit will import, overwrite and change ABAP artifacts in the system in ways that might not be intended. Always review all code in remote repositories before importing to the target system, this is possible because abapGit is plain text unlike traditional transport files.\",\"That being said, abapGit is used by multiple organizations, all abapGit changes are reviewed via pull requests. And all 100+ repository watchers are automatically notified for every change to the code base, so potentially all changes are looked at by more people than traditional enterprise products.\"]},\"3\":{\"h\":\"Support\",\"t\":[\"It is a community effort to support the project, recommend watching the project to get a feeling about issue resolution. Everyone can suggest changes to abapGit via pull requests.\",\"abapGit 1.99.0\"]},\"4\":{\"h\":\"Community vs. SAP Distribution of abapGit\",\"t\":[\"This website is documenting the community version of abapGit (available on GitHub). The SAP version of abapGit available as part of SAP Business Technology Platform is documented on help.sap.com. When using the SAP version, please note that there are different capabilities and supported object types (as described by SAP). If the SAP version on BTP does not work correctly, open a ticket with SAP support.\"]},\"5\":{\"h\":\"Development Guide\",\"t\":[\"Development related information\"]},\"6\":{\"h\":\"Catalog\"},\"7\":{\"h\":\"Read First\",\"t\":[\"Contributing\",\"Development Guidelines\",\"Changelog\",\"Versioning\",\"Package Structure\"]},\"8\":{\"h\":\"Serializers\",\"t\":[\"Overview\",\"Serializer Class\",\"New Serializers\",\"File Formats\"]},\"9\":{\"h\":\"Testing\",\"t\":[\"Debugging\",\"Unit Tests\",\"CI Tests\"]},\"10\":{\"h\":\"User Interface\",\"t\":[\"HTML Pages\",\"HTML Forms\",\"HTML Popups\",\"CSS and Assets\",\"JavaScript\",\"Icons\"]},\"11\":{\"h\":\"API\",\"t\":[\"API\"]},\"12\":{\"h\":\"Technical Details\",\"t\":[\"Documentation\",\"Links\"]},\"13\":{\"h\":\"User Guide\"},\"14\":{\"h\":\"Catalog\"},\"15\":{\"h\":\"Getting Started\",\"t\":[\"Installation\",\"Upgrading\",\"Uninstalling\",\"UI Layout\",\"UI Features\"]},\"16\":{\"h\":\"Setup\",\"t\":[\"SAP GUI\",\"SSL Setup\",\"SSL Test\",\"Global Settings\",\"Personal Settings\"]},\"17\":{\"h\":\"Projects\"},\"18\":{\"h\":\"Online\",\"t\":[\"Installation\",\"Keeping Code Up-to-date\",\"First Project\",\"Moving Package into Git\",\"Pushing Changes to Git\",\"Contributing to a Project\",\"Authentication\"]},\"19\":{\"h\":\"Offline\",\"t\":[\"Installation\",\"Import ZIP\",\"Export ZIP\",\"Compare RFC\"]},\"20\":{\"h\":\"Remove\",\"t\":[\"Uninstall\"]},\"21\":{\"h\":\"Repo Settings\",\"t\":[\"Repository (.abapgit.xml)\",\"Local\",\"Remote\",\"Background Mode\",\"Statistics\"]},\"22\":{\"h\":\"Reference\",\"t\":[\"Translations and I18n\",\"Supported Object Types\",\"Icon Legend\",\"Hotkeys Legend\",\"User Exits\",\"Authorizations\",\"Namespaces\",\"Packages & Transports\",\"Folders & Files\",\"ABAP Language Version\",\"Note Analyzer\",\"APACK\",\"Database Utility\"]},\"23\":{\"h\":\"Other\",\"t\":[\"Regular Backup\",\"Migrating from SAPlink\",\"Articles and Presentations\",\"Who Uses abapGit?\",\"Logos\",\"XML Mismatch\"]},\"24\":{\"h\":\"Read First\"},\"25\":{\"h\":\"Catalog\",\"t\":[\"Contributing\",\"Development Guidelines\",\"Changelog\",\"Versioning\",\"Package Structure\"]},\"26\":{\"h\":\"Changelog\",\"t\":[\"abapGit allows showing a changelog notes, based on the changelog file in the repository base, and on APACK class containing the current version.\",\"abapGit itself does not use APACK and gets the current version from zif_abapgit_version=>c_abap_version. The version is then used to determine if the changelog was updated and should be shown to the user.\",\"Here's what the settings look like for another repository:\",\"version_setup\"]},\"27\":{\"h\":\"File format\",\"t\":[\"A file named with pattern CHANGELOG* or changelog*\",\"The changelog file should have a specific format:\",\"Header with the title\",\"abapGit changelog ================= \",\"A legend\",\"Legend ------ * : fixed ! : changed + : added - : removed \",\"Notes section using header format:\",\"Date in format YYYY-MM-DD followed by Semantic version\",\"Separator: ------------------\",\"Version notes using a prefix as described in the legend\",\"2020-06-29 v1.97.0 ------------------ + Notes..... \",\"Check abapGit changelog as an example.\"]},\"28\":{\"c\":[\"read-first\"]},\"29\":{\"h\":\"Contributing\",\"t\":[\"General contribution guidelines can be found here.\",\"How to submit a pull request:\",\"Having already installed the abapGit standalone program,\",\"Install the development version of abapGit, by running ZABAPGIT_STANDALONE and either:\",\"cloning your own fork of the abapGit repository using abapGit's \\\"New Online\\\" option or\",\"downloading the zip file and installing it using the \\\"New Offline\\\" option\",\"When specifying a package for the repository in step 1, assign a different (new, e.g. $ZABAPGIT) package to the one ZABAPGIT_STANDALONE is in\",\"Your system will now contain the abapGit package, along with several sub-packages and development objects such as classes, interfaces, function groups, etc. There will also be the development version of the abapGit program (transaction ZABAPGIT). The standalone program, ZABAPGIT_STANDALONE will remain unaffected, to serve as fallback.\",\"Make your changes to abapGit development objects and test locally.\",\"Using abapGit on your system, commit the changes to your online fork (so if you had chosen the \\\"offline\\\" option in step 1, you will need to have switched to online).\",\"Submit a pull request with the changes.\",\"Alternatively to the steps above, use the GitHub web interface to change the files directly on a GitHub branch of your forked abapGit repository and then submit a pull request. This might make sense when, e.g., contributing to the documentation files such as the one you are reading right now (where contributions may be initiated through the \\\"Edit this page\\\" link below).\",\"If you already have an old fork and would like to create a new pull request, you can sync your old fork to the current state following this guide: Sync your fork to original repository.\",\"After your pull request is merged to the abapGit default branch, abapmerge will automatically run to build the standalone report version of abapGit. Every time a commit is pushed to the default branch, GitHub Actions is triggered to perform this build. It uses abapmerge to merge all the includes into a single file (the standalone version) which can be downloaded from here\"]},\"30\":{\"c\":[\"read-first\"]},\"31\":{\"h\":\"Development Guidelines\"},\"32\":{\"h\":\"Object Types\",\"t\":[\"abapGit is merged into a stand-alone version. For this reason, the only allowed object types for new repository objects are classes and interfaces. In particular, function groups or modules must not be included.\",\"Exceptions for existing objects:\",\"Transaction ZABAPGIT\",\"Program ZABAPGIT and includes\",\"Function group ZABAPGIT_PARALLEL for parallel serialization (only available in the developer version)\",\"MIME objects ZABAPGIT_* for UI (CSS, JS, and fonts)\"]},\"33\":{\"h\":\"Conventions\"},\"34\":{\"h\":\"Naming\"},\"35\":{\"h\":\"Object Prefixing\",\"t\":[\"Classes and interfaces are prefixed using zcl_abapgit_ or zif_abapgit_ (zcx_abapgit_ for exception classes, lcl_ and ltcl_ for local and test classes).\"]},\"36\":{\"h\":\"Object Descriptions\",\"t\":[\"The description of objects should begin with abapGit - ... (for example, abapGit - Repository Content List). For serializer classes, the text should contain the TADIR object type and description (for example, abapGit - INTF - Interface (ABAP Objects)).\"]},\"37\":{\"h\":\"Variable Prefixing\",\"t\":[\"Variables are prefixed using the standard setting in abapOpenChecks Naming Conventions\"]},\"38\":{\"h\":\"Downport\"},\"39\":{\"h\":\"Syntax\",\"t\":[\"abapGit is targeted for version 7.02 and higher. Therefore, the code must only contain expressions and statements that work on 7.02.\",\"abaplint will automatically check every pull request for language syntax that is compatible with 7.02.\"]},\"40\":{\"h\":\"Standard Objects\",\"t\":[\"The code must only reference standard SAP objects (classes, interfaces, DDIC types) that exist in version 7.02 and higher. Referencing objects that do not exist in 7.02 creates syntax errors and therefore requires using dynamic ABAP. DDIC types that do not exist in 7.02 should be replaced by local type definitions.\"]},\"41\":{\"h\":\"File Formats\",\"t\":[\"General file format guidelines are specified in .editorconfig. If you are using abapGit to push files to the repository, these guidelines are followed automatically.\",\"If you are editing files outside of SAP GUI or ADT, for example on GitHub.com or in VS Code, the most common issues are using cr instead of lf at end of line, missing new line at end of file, and missing BOM at beginning of XML files. Please ensure that your IDE is setup to follow the .editorconfig specifications to avoid any issues.\",\"For more details, see editorconfig.org.\",\"Info\",\"VS Code requires an extension for .editorconfig which you can find at marketplace.\"]},\"42\":{\"h\":\"Formatting the Source Code\"},\"43\":{\"h\":\"Line Width\",\"t\":[\"The maximum width of ABAP source code should be set at 120 characters per line and is checked during linting.\"]},\"44\":{\"h\":\"Pretty Printer\",\"t\":[\"Use pretty-printer, keywords upper case + indentation, abapOpenChecks can be used for checking this.\"]},\"45\":{\"h\":\"Dynpros\",\"t\":[\"For the user interface, we are moving towards everything in HTML, i.e. new Dynpro screens or the use of Dynpro screens and popups should not be added to the source code.\"]},\"46\":{\"h\":\"abaplint\",\"t\":[\"Pull requests must pass all abaplint configured checks before they can be merged. You find the current rules in abaplint.json.\",\"Info\",\"You can view abaplint findings directly in abapGit using an extension.\"]},\"47\":{\"h\":\"eslint\",\"t\":[\"JavaScript is checked using eslint. You can find the rules here. All JavaScript code has to adhere to ES5 (ECMAScript 2009) to be compatible with the IE-based HTML browser control used in older releases of SAP GUI.\"]},\"48\":{\"h\":\"Internationalization (I18N)\",\"t\":[\"abapGit supports only the English language. Neither objects nor text literals are translated. Therefore, all objects shall be set to English as the original language, and text literals in the code shall be maintained in English.\",\"Since there's only one language, using the ##NO_TEXT pragma is not required and will actually lead to lint errors. The exceptions are global class and interface definitions, where the pragmas are added automatically by SE24/SE80.\"]},\"49\":{\"c\":[\"read-first\"]},\"50\":{\"h\":\"Package Structure\"},\"51\":{\"h\":\"Package Structure\",\"t\":[\"Various conventions for packages,\"]},\"52\":{\"h\":\"/src/git/\",\"t\":[\"Raw git client, uses http package\",\"Does not know about UI, objects or repositories, everything is file based.\",\"Ideally possible to run and use standalone\"]},\"53\":{\"h\":\"/src/ui/core/\",\"t\":[\"UI framework\",\"Does not know about objects or repositories\",\"Ideally possible to run and use standalone\"]},\"54\":{\"h\":\"/src/http/\",\"t\":[\"Raw http client\",\"Does not know about UI, objects or repositories\",\"Ideally possible to run and use standalone\"]},\"55\":{\"h\":\"/src/json/\",\"t\":[\"Don't do any manual changes in this folder, its a renamed copy of https://github.com/sbcgua/ajson via https://github.com/abapGit/ajson_mirror\"]},\"56\":{\"h\":\"/src/objects/aff/\",\"t\":[\"Dont do any manual changes in this folder, mirroed from https://github.com/abapGit/aff_mirror\"]},\"57\":{\"c\":[\"read-first\"]},\"58\":{\"h\":\"Versioning\",\"t\":[\"abapGit is continuously developed and updated. The main branch always represents the latest development version and corresponds to the published standalone version.\",\"abapGit does not have a predefined release cycle. However, we strive to tag a new version once a month (or two).\"]},\"59\":{\"h\":\"Version\",\"t\":[\"abapGit follows semantic version format. The community has settled on releasing enhancements and changes as minor versions. A more granular approach to releasing every change as a patch is adding too much overhead.\",\"Example release sequence: 1.118.0 > 1.119.0 > 1.120.0\"]},\"60\":{\"h\":\"Changelog\",\"t\":[\"All additions, changes, fixes, and removals that are relevant to abapGit users are listed in the changelog.\",\"Reorgs, refactoring, or changes related to testing or repo actions are omitted from the changelog.\",\"Since abapGit is enforcing a linear history, you can find all changes in commit list of the main branch.\"]},\"61\":{\"h\":\"Process\",\"t\":[\"The following steps need to be taken to create a new abapGit version:\",\"Create a new branch name like the new version. For example, v1.121.0.\",\"Update zif_abapgit_version and increase the minor version of constant c_abap_version by one. Example: '1.120.0' > '1.121.'.\",\"Update changelog.txt and add a section at the top for the new version.\",\"Compile a list of the relevant pull requests (see above) based on a comparison between the most recent tag and main. For example, v1.123.0 vs main.\",\"Label each change (PR) corresponding to the legend (*: fixed, !: changed, +: added, -: removed).\",\"Create a new, draft pull request from the new branch.\",\"Have the changes reviewed by someone else.\",\"On the release day, update the date in the changelog, and merge the pull request.\",\"The merge will trigger a GitHub action to automatically tag the new release and perform some downstream tasks (like updating the build repository).\"]},\"62\":{\"c\":[\"read-first\"]},\"63\":{\"h\":\"API\"},\"64\":{\"h\":\"Catalog\",\"t\":[\"API\"]},\"65\":{\"h\":\"API\",\"t\":[\"This page describes how to execute various abapGit tasks using your code.\",\"Note\",\"These classes and methods have existed for quite some time and are stable. However, they do not provide a guaranteed API. Future changes are a possibility.\"]},\"66\":{\"h\":\"Repositories\"},\"67\":{\"h\":\"Create Online\",\"t\":[\"Create a new abapGit repository for a given online project and branch and associate it with an SAP package:\",\"DATA(lo_repo) = zcl_abapgit_repo_srv=>get_instance( )->new_online( iv_url = lv_url iv_branch_name = lv_branch_name \\\" optional iv_package = lv_package ). \",\"Optional parameters correspond to the input fields of \\\"New Online\\\" in abapGit.\"]},\"68\":{\"h\":\"Create Offline\",\"t\":[\"Create a new abapGit repository for an offline project and associate it with an SAP package:\",\"DATA(lo_repo) = zcl_abapgit_repo_srv=>get_instance( )->new_offline( iv_url = lv_name_of_repo \\\"not a URL iv_package = lv_package ). \",\"Optional parameters correspond to the input fields of \\\"New Offline\\\" in abapGit.\"]},\"69\":{\"h\":\"List\",\"t\":[\"Get a list of repository instances:\",\"\\\" All repositories DATA(lt_repos) = zcl_abapgit_repo_srv=>get_instance( )->list( ). \\\" Only offline repositories lt_repos = zcl_abapgit_repo_srv=>get_instance( )->list( iv_offline = abap_true ). \\\" Only online repositories lt_repos = zcl_abapgit_repo_srv=>get_instance( )->list( iv_offline = abap_false ). \\\" Only your favorite repositories (you can also use iv_offline as above) lt_repos = zcl_abapgit_repo_srv=>get_instance( )->list_favorites( ). \",\"Get a structured list of all repositories with properties and local settings:\",\"DATA(lt_list) = zcl_abapgit_persist_factory=>get_repo( )->list( ). \"]},\"70\":{\"h\":\"Read\",\"t\":[\"Get an instance of a repository:\",\"DATA(lo_repo) = zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). \",\"Cast to online or offline repository:\",\"DATA lo_repo_online TYPE REF TO zcl_abapgit_repo_online. lo_repo_online ?= lo_repo. DATA lo_repo_offline TYPE REF TO zcl_abapgit_repo_offline. lo_repo_offline ?= lo_repo. \",\"Get a structure containing all properties and local settings of a repository:\",\"DATA(ls_repo) = NEW zcl_abapgit_persist_factory=>get_repo( )->read( iv_key ). \"]},\"71\":{\"h\":\"Find\",\"t\":[\"Find the repository for a given SAP package:\",\"zcl_abapgit_repo_srv=>get_instance( )->get_repo_from_package( EXPORTING iv_package = '$ABAPGIT' IMPORTING eo_repo = DATA(lo_repo) ). \"]},\"72\":{\"h\":\"Delete\",\"t\":[\"Remove an abapGit repository (the objects in SAP packages remain untouched):\",\"zcl_abapgit_repo_srv=>get_instance( )->delete( lo_repo ). \"]},\"73\":{\"h\":\"Purge\",\"t\":[\"Delete all objects that are part of an abapGit repository (i.e. full uninstall):\",\"ls_checks = lo_repo->delete_checks( ). IF ls_checks-transport-required = abap_true. ls_checks-transport-transport = 'SIDK900000'. \\\"transport request ENDIF. zcl_abapgit_repo_srv=>get_instance( )->purge( io_repo = lo_repo is_check = ls_check ). \"]},\"74\":{\"h\":\"Status\",\"t\":[\"Get the status of all files included in a repository:\",\"DATA(lt_result) = zcl_abapgit_repo_status=>calculate( lo_repo ). \"]},\"75\":{\"h\":\"Online Repository\",\"t\":[\"The following tasks are supported for online repositories only (lo_repo type ref to zcl_abapgit_repo_online).\",\"Note: Certain tasks will require authentication (user/password or token). In such cases, you will have to provide the login details upfront (see #1331 for details), authentication can also be set via user exit or configured in SM59,\",\"zcl_abapgit_login_manager=>set( iv_uri = lo_repo->get_url( ) iv_username = lv_username iv_password = lv_password ). \",\"Or you can include the abapGit password dialog into your custom programs with this code\",\"TABLES: sscrfields. INCLUDE zabapgit_password_dialog. INITIALIZATION. lcl_password_dialog=>on_screen_init( ). AT SELECTION-SCREEN OUTPUT. IF sy-dynnr = lcl_password_dialog=>c_dynnr. lcl_password_dialog=>on_screen_output( ). ENDIF. AT SELECTION-SCREEN. IF sy-dynnr = lcl_password_dialog=>c_dynnr. lcl_password_dialog=>on_screen_event( sscrfields-ucomm ). ENDIF. \"]},\"76\":{\"h\":\"List Branches\",\"t\":[\"Get a list of all branches (including main branch):\",\"lo_branches = zcl_abapgit_git_transport=>branches( lo_repo->get_url( ) ). lt_list = lo_branches->get_branches_only( ). \"]},\"77\":{\"h\":\"Switch Branch\",\"t\":[\"Switch the abapGit repository to a different branch:\",\"lo_repo->set_branch_name( lv_name ). \"]},\"78\":{\"h\":\"Create Branch\",\"t\":[\"Create a new branch in an online repository, note that IV_FROM can also be set, if not the branch will be created from the currently checked-out commit of the repo,\",\"lo_repo->create_branch( lv_name ). \"]},\"79\":{\"h\":\"Delete Branch\",\"t\":[\"Delete a branch of an online repository:\",\"lo_branches = zcl_abapgit_git_transport=>branches( lo_repo->get_url( ) ). ls_branch = lo_branches->find_by_name( lv_name ). zcl_abapgit_git_porcelain=>delete_branch( iv_url = lo_repo->get_url( ) is_branch = ls_branch ). \"]},\"80\":{\"h\":\"Push Changes\",\"t\":[\"Push changes to an online repository:\",\"CREATE OBJECT li_log TYPE zcl_abapgit_log. CREATE OBJECT li_background TYPE zcl_abapgit_background_push_au. \\\" or push_fi li_background->run( io_repo = lo_repo ii_log = li_log it_settings = lt_settings ). \",\"Alternative 1: implement your logic using interface zif_abapgit_background (seeBackground Package for details).\",\"Alternative 2: Use the following code to add files to staging and push them to the repository.\",\"METHOD stage_and_push. DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, ls_comment TYPE zif_abapgit_definitions=>ty_comment, lo_stage TYPE REF TO zcl_abapgit_stage. lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). CREATE OBJECT lo_stage. DATA(ls_files) = zcl_abapgit_factory=>get_stage_logic( )->get( lo_repo ). LOOP AT ls_files-local ASSIGNING FIELD-SYMBOL(). lo_stage->add( iv_path = -file-path iv_filename = -file-filename iv_data = -file-data ). ENDLOOP. DATA(lo_user) = zcl_abapgit_user_record=>get_instance( sy-uname ). ls_comment-committer-name = lo_user->get_name( ). ls_comment-committer-email = lo_user->get_email( ). ls_comment-comment = 'My Commit'. lo_repo->push( is_comment = ls_comment io_stage = lo_stage ). ENDMETHOD. \"]},\"81\":{\"h\":\"Pull Changes\",\"t\":[\"Pull changes from an online repository:\",\"CREATE OBJECT li_log TYPE zcl_abapgit_log. CREATE OBJECT li_background TYPE zcl_abapgit_background_pull. li_background->run( io_repo = lo_repo ii_log = li_log it_settings = lt_settings ). \",\"Alternative 1: implement your logic using interface zif_abapgit_background (seeBackground Package for details).\",\"Alternative 2: Use the following code to trigger the pull.\",\"METHOD pull. DATA: lo_repo TYPE REF TO zcl_abapgit_repo_online, li_log TYPE REF TO zif_abapgit_log, ls_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks. CREATE OBJECT li_log TYPE zcl_abapgit_log. lo_repo ?= zcl_abapgit_repo_srv=>get_instance( )->get( iv_key ). ls_checks = lo_repo->deserialize_checks( ). * the code must decide what to do with warnings, see example below ls_checks = decisions( ls_checks ). lo_repo->deserialize( is_checks = ls_checks ii_log = li_log ). ENDMETHOD. METHOD decisions. * this part can be handled by presenting the warings to the user in UI, or set via logic in code * this is an example, adjust to fit your business requirements rs_checks = is_checks. LOOP AT rs_checks-overwrite ASSIGNING FIELD-SYMBOL(). * Object has been modified locally * decision field must be filled with Y or N. Y overwrites the object -decision = 'Y'. ENDLOOP. LOOP AT rs_checks-warning_package ASSIGNING FIELD-SYMBOL(). * Y or N if object from unexpected package should be overwritten -decision = 'Y'. ENDLOOP. IF rs_checks-requirements-met = 'N'. * code must decide if deserialization should continue or not rs_checks-requirements-decision = 'Y'. ENDIF. IF rs_checks-transport-required = abap_true. rs_checks-transport-transport = 'SIDK900000'. \\\"transport request ENDIF. ENDMETHOD. \"]},\"82\":{\"h\":\"Offline Repository\",\"t\":[\"The following tasks are supported for offline repositories only (lo_repo type ref to zcl_abapgit_repo_offline).\"]},\"83\":{\"h\":\"Import ZIP\",\"t\":[\"Upload a ZIP file from frontend to an offline repository:\",\"lv_xstr = zcl_abapgit_ui_factory=>get_frontend_services( )->file_upload( lv_file_with_path ). lo_repo->set_files_remote( zcl_abapgit_zip=>load( lv_xstr ) ). zcl_abapgit_services_repo=>refresh( lv_key ). \"]},\"84\":{\"h\":\"Export ZIP\",\"t\":[\"Download a ZIP file of an offline repository to frontend:\",\"lv_xstr = zcl_abapgit_zip=>export( lo_repo ). zcl_abapgit_ui_factory=>get_frontend_services( )->file_download( iv_path = lv_file_with_path iv_xstr = lv_xstr ). \"]},\"85\":{\"h\":\"Progress Indicator\",\"t\":[\"The default progress indicator shows progress in SAP GUI, however, it is possible to inject a custom progress indicator via ZCL_ABAPGIT_PROGRESS=>SET_INSTANCE which can catch the status in non-SAP GUI scenarios.\"]},\"86\":{\"c\":[\"api\"]},\"87\":{\"h\":\"Serialization\"},\"88\":{\"h\":\"Catalog\",\"t\":[\"Overview\",\"Serializer Class\",\"New Serializers\",\"File Formats\"]},\"89\":{\"h\":\"File Formats\",\"t\":[\"All files for an object are located in the same folder, each folder corresponds to a package. Sub-packages are organized under parent packages(directories) according to the logic described in the Repository Settings\"]},\"90\":{\"h\":\"CLAS\",\"t\":[\"Files corresponding to the editable parts in source-based class builder or ABAP in Eclipse:\",\"zcl_example.clas.abap\",\"zcl_example.clas.locals_def.abap\",\"zcl_example.clas.locals_imp.abap\",\"zcl_example.clas.testclasses.abap\",\"zcl_example.clas.macros.abap\",\"Files do not exist if empty, ie. the developer did not choose to implement it\",\"One XML file zcl_example.clas.xml containing:\",\"VSEOCLASS information\",\"TPOOL information\",\"SOTR information\",\"LINES from DOKU\",\"Descriptions from SEOCOMPOTX\",\"See example https://github.com/abapGit-tests/CLAS_full\"]},\"91\":{\"c\":[\"serializers\"]},\"92\":{\"h\":\"Overview\"},\"93\":{\"h\":\"Overview\",\"t\":[\"An abapGit Serializer is an ABAP class that supports creating, reading, updating, and deleting (CRUD) objects of a given object type. In abapGit, the reading of an object is implemented in a serialize method. Create and update are combined into a deserialize method. There is a delete method to remove an object from the system.\",\"All object serializers must implement interface ZIF_ABAPGIT_OBJECT and be named ZCL_ABAPGIT_OBJECT_{type}, where {type} is the corresponding SAP object type (TADIR-OBJECT). As a description for the class, use {type} - {description of type} (for example, TABL - Table). It's recommended to use ZCL_ABAPGIT_OBJECTS_SUPER as a superclass since it provides several convenient methods.\",\"In general, only SAP Standard APIs for retrieving and updating object information shall be used. If that is not possible, try using ZCL_ABAPGIT_OBJECTS_GENERIC which handles any logical transport object.\",\"As code is stored in git, no usernames, timestamps, states (e.g. active/inactive), or other system-specific information should be part of the serialized object files. Only the active, most recent, and consistent version of an object shall be serialized.\",\"Auto-generated artifacts should be skipped if possible, for example, a CDS view might generate a VIEW artifact, and the VIEW should not be serialized, as it is not something the developer creates.\",\"If an inactive version of an object exists, the class shall indicate so in the is_active method. abapGit displays such objects with a yellow bolt icon in the repo view. However, the inactive version must be ignored by the serializer.\",\"As a result, a repo shall only contain the definition of active objects. Therefore, the deserializer can assume that the repo has a consistent object definition and shall create an active version of the object (or update and activate it).\"]},\"94\":{\"c\":[\"serializers\"]},\"95\":{\"h\":\"Serializer Class\"},\"96\":{\"h\":\"Constructor\",\"t\":[\"The constructor is implemented in the superclass and takes two parameters as input:\",\"Parameter\",\"Description\",\"IS_ITEM\",\"Contains object type, object name, SAP package, and state (active/inactive)\",\"IV_LANGUAGE\",\"Contains the language key for the main language of the repository\",\"These parameters are stored in attributes MS_ITEM and MV_LANGUAGE respectively.\",\"Requirements that are necessary to support an object type should be checked in the constructor using the following logic. This is typical if object types are not supported in lower releases.\",\" METHOD constructor. DATA ... super->constructor( is_item = is_item iv_language = iv_language ). TRY. \\\" Check requirements... CATCH cx_root. \\\" Raise an exception if not supported zcx_abapgit_exception=>raise( 'Object type DDLS not supported' ). ENDTRY. ENDMETHOD. \",\"This will ensure that none of the other class methods are called, even if objects of the given type exist in a repo.\",\"Example: SRFC.\"]},\"97\":{\"h\":\"Interface\",\"t\":[\"Serializers must implement all methods of interface ZIF_ABAPGIT_OBJECT:\",\"Method\",\"Description\",\"SERIALIZE\",\"Contains all process steps to read the relevant object type-specific information and serialize it (as one or more files)\",\"DESERIALIZE\",\"Contains all process steps to create or update an object based on one or more files\",\"DELETE\",\"Contains all process steps to delete an object based on one or more files\",\"EXISTS\",\"Returns whether a given object already exists in any state (i.e. return abap_true for inactive objects)\",\"IS_LOCKED\",\"Returns whether a given object is currently locked\",\"IS_ACTIVE\",\"Returns whether a given object exists in an active state\",\"CHANGED_BY\",\"Returns the name of the user who last changed a given object (if undetermined, return c_user_unknown)\",\"JUMP\",\"Navigates to the corresponding object maintenance screen\",\"GET_METADATA\",\"Returns object-specific metadata (see below)\",\"GET_COMPARATOR\",\"Triggered before deserialization to perform checks (for example, to warn the user that database tables are changed)\",\"GET_DESERIALIZE_STEPS\",\"Defines the deserialzation step or steps used to build the processing sequence (see below)\",\"GET_DESERIALIZE_ORDER\",\"Returns the list of objects that shall be deserialized before an object (optional, see below)\",\"MAP_FILENAME_TO_OBJECT\",\"Derive the object from a given filename (optional)\",\"MAP_OBJECT_TO_FILENAME\",\"Derive the filename from a given object (optional)\",\"Example: DOMA.\"]},\"98\":{\"h\":\"Metadata\",\"t\":[\"It is mandatory to provide the following metadata:\",\"Attribute\",\"Description\",\"CLASS\",\"Technical name used to identify the serializer within serialized XML files (format LCL_OBJECT_{type})\",\"VERSION\",\"Version number of the serializer (format v1.0.0)\",\"It's recommended to fill CLASS and VERSION metadata using SUPER->GET_METADATA( ) and then change settings as required.\"]},\"99\":{\"h\":\"Deserialization Step\",\"t\":[\"It is mandatory to provide at least one deserialization step (see below).\"]},\"100\":{\"h\":\"Deserialization Order\",\"t\":[\"This method is used to return a list of objects that shall be deserialized before the given object.\"]},\"101\":{\"h\":\"Super Class\",\"t\":[\"Serializers can take advantage of the following methods in ZCL_ABAPGIT_OBJECTS_SUPER:\",\"Method\",\"Description\",\"GET_METADATA\",\"Return default metadata for class and version\",\"CORR_INSERT\",\"Insert the object into a transport (for transportable objects)\",\"TADIR_INSERT\",\"Insert the object into TADIR\",\"TADIR_DELETE\",\"Delete the object from TADIR\",\"EXISTS_A_LOCK_ENTRY_FOR\",\"Check if an enqueue lock exists\",\"SET_DEFAULT_PACKAGE\",\"Set SAP package for RS_CORR_INSERT when it can't be supplied via APIs\",\"SET_DEFAULT_TRANSPORT\",\"Set transport request for RS_CORR_INSERT when it can't be supplied via APIs\",\"IS_ACTIVE\",\"Method to check if an ABAP Workbench object or its parts are active\",\"DELETE_DDIC\",\"Method to remove DDIC objects\",\"In addition, there are some methods to handle documents associated with an object (transaction SE61, table DOKIL).\",\"Method\",\"Description\",\"SERIALIZE_LONGTEXTS\",\"Serialize document including I18N handling\",\"DESERIALIZE_LONGTEXTS\",\"Deserialize document including I18N handling\",\"DELETE_LONGTEXTS\",\"Delete document\",\"SERIALIZE_LXE_TEXTS\",\"Serialize translation texts (new approach, see below)\",\"DESERIALIZE_LXE_TEXTS\",\"Deserialize translation texts (new approach, see below)\"]},\"102\":{\"h\":\"Generic Class\",\"t\":[\"If it's not possible to provide a native implementation for an object serializer, using generic class ZCL_ABAPGIT_OBJECTS_GENERIC is possible for logical transport objects (see table OBJH, object type L).\",\"Example: IWMO.\"]},\"103\":{\"h\":\"Serialize Object\",\"t\":[\"The serialize method shall produce one or several files containing the data that represents a given object. There are a few methods available to define files and attach data using ZIF_ABAPGIT_OUTPUT_XML (input parameter IO_XML).\",\"Method\",\"Description\",\"ADD\",\"Append a value, structure, or internal table to the output (using ID transformation to XML suppressing initial fields)\",\"ADD_XML\",\"Append an instance of an XML document to the output (IF_XML_ELEMENT)\",\"SET_RAW\",\"Set the output to an instance of an XML document (IF_XML_ELEMENT)\",\"I18N_PARAMS\",\"Get the settings for internationalization (see below)\"]},\"104\":{\"h\":\"Deserialize Object\",\"t\":[\"The deserialize method shall read the file or files representing a given object and create the object in the system. If the object already exists, it shall be updated according to the definition in the file or files. There are a few methods available to process files using ZIF_ABAPGIT_INPUT_XML (input parameter IO_XML).\",\"Method\",\"Description\",\"READ\",\"Return a value, structure, or internal table from the input (using ID transformation from XML accepting data loss)\",\"GET_RAW\",\"Return the input as an instance of an XML document (IF_XML_ELEMENT)\",\"GET_METADATA\",\"Return the metadata used at the time of serializing the object\",\"I18N_PARAMS\",\"Get the settings for internationalization (see below)\",\"In addition, the deserialize method must add or update the TADIR entry for the given object and insert the object into a transport request (for transportable packages). If the used SAP APIs are not performing these tasks, TADIR_INSERT( iv_package ) and CORR_INSERT( iv_package ) shall be called by the deserialize method.\"]},\"105\":{\"h\":\"Activate Object\",\"t\":[\"After deserializing, an object (or dependent objects) might have to be activated. Add such objects to the activation queue using [ZCL_ABAPGIT_OBJECTS_ACTIVATION]:\",\"Method\",\"Description\",\"ADD\",\"Append a given object type and name to the queue (for example, INDX{table} for database indexes when deserializing tables)\",\"ADD_ITEM\",\"Append a given object to the queue (for example, use ms_item for activating the object itself)\",\"The activation queue is built separately for each phase (see 'Deserialize Process' below).\"]},\"106\":{\"h\":\"Internationalization (I18N)\",\"t\":[\"In general, the serializer class shall process texts of an object in all available languages i.e. the original language as well as any translations. It shall respect the \\\"Serialize Main Language Only\\\" setting of a repository and limit the texts to the language provided to the constructor (MV_LANGUAGE).\",\"The recommended approach is to check io_xml->i18n_params( )-main_language_only = abap_false and then serialize the additional translations in the XML (typically using the I18N prefix). During deserialize, the translation languages can then be retrieved and processed accordingly.\",\"Example: TABL.\",\"Note: A new approach for serializing translations based on LXE is under development. See #4470 for further details and discussion.\"]},\"107\":{\"h\":\"Testing\",\"t\":[\"When adding new serializers, add at least one test repository to the organization abapGit-tests with the name of the object type in capitals (for example, TABL. This test will be used by abapGit Continuous Integration.\",\"Example (using SUSH):\",\"Go to https://github.com/abapGit-tests/SUSH and create a fork\",\"In your system (where you have the new SUSH class), start abapGit and create a new online repo for the URL of your fork (pick any local package like $SUSH).\",\"Add one SUSH object to this package (like ZAG_UNIT_TEST)\",\"Go back to abapGit and you should see the new object in the object list of the repo\",\"Stage everything and commit\",\"Go to your forked repo and create a pull request (at the top there's a section showing the delta to the original and a compare button which you can click to create the PR)\"]},\"108\":{\"h\":\"Processing Order and Dependencies\"},\"109\":{\"h\":\"Serialize Process\",\"t\":[\"abapGit determines which objects need to be serialized based on the SAP package assigned to a repository (including sub-packages unless \\\"Ignore sub-packages\\\" is selected in the repository settings). The list of objects is then sorted by package, object type, and object name.\",\"If a sufficient number of work processes is available, abapGit will activate objects in parallel (unless \\\"Disable Parallel Processing\\\" is selected in the repository settings).\",\"For details, see ZCL_ABAPGIT_SERIALIZE.\"]},\"110\":{\"h\":\"Deserialize Process\",\"t\":[\"Objects are deserialized in three phases. After each phase, all objects included in the phase will be activated.\",\"Step\",\"Description\",\"Activation\",\"EARLY\",\"Used for objects (like classes and interfaces) that are dependencies for DDIC objects\",\"None\",\"DDIC\",\"Used for DDIC objects which require processing and activation before other object types\",\"DDIC Mass Activation\",\"ABAP\",\"Used for non-DDIC objects (code or mostly anything else) which might depend on DDIC objects\",\"Workbench Mass Activation\",\"LATE\",\"Used for objects that depend on other objects processed in the previous two phases\",\"DDIC & Workbench Mass Activation\",\"Within each phase, the sequence of objects is determined by abapGit based on known object type dependencies. For details, see method PRIORITIZE_DESER in ZCL_ABAPGIT_FILE_DESERIALIZE.\"]},\"111\":{\"h\":\"Uninstall Process\",\"t\":[\"During the uninstallation of a repository, abapGit will determine the objects in the same fashion as the serialize process. The sequence of objects is determined by abapGit based on known object type dependencies. For details, see method RESOLVE in ZCL_ABAPGIT_DEPENDENCIES.\",\"Note: There are suggestions to refactor the logic to determine the processing order.\"]},\"112\":{\"c\":[\"serializers\"]},\"113\":{\"h\":\"New Serializers\"},\"114\":{\"h\":\"Task List for New Serializers\",\"t\":[\"The following list includes the mandatory and recommended tasks for adding a new serializer to abapGit:\",\"Check Support for New Object Types\",\"If the object type is listed already (and not implemented), check the corresponding issue. Typically, you will find valuable discussions to continue or previous work to use as a starting point.\",\"If the object type is not included in the list, create an issue with the title \\\": Support for \\\" (for example, \\\"TABL: Support for Tables\\\"). Briefly describe why the object is needed and outline the implementation approach.\",\"Wait for the OK from abapGit maintainers\",\"Before starting the implementation, it's best to wait for feedback from the community. Once you get the go-ahead, the issue will be assigned to you.\",\"Info\",\"abapGit maintainers will add your issue to a central list and, if there's no further discussion required, close it.\",\"Implement the serializer class\",\"Follow the instructions below. Often, it makes sense to use an existing serializer class as a template. This can save a lot of work especially if the new object type is similar to others.\",\"Note\",\"Your code must comply with the development guidelines for abapGit. Most notably your code must be compatible with 7.02 ABAP syntax and available standard SAP objects, use prefixing of variables, be pretty-printed, and pass all abaplint checks.\",\"You might get lots of abaplint errors. If you are uncertain how to resolve these, maintainers are happy to help.\",\"Create a test repository\",\"Define a minimal test case for the new object type and commit it to a test repo in abapGit Test Repositories. If you don't have access, use the issue you created initially to ask for it. See \\\"Testing\\\" below for an example.\",\"Test your implementation\",\"Perform a complete test cycle with your test repository:\",\"Create New Online Repo for a local package (for example $TABL)\",\"Execute a Pull (should install without any diffs)\",\"Uninstall the repository (should not leave any objects of TADIR entries behind)\",\"Repeat the process for a transportable package (for example ZTABL)\",\"Create a pull request for your implementation\",\"Fork the abapGit repository and add a branch for your serializer class. Commit your implementation (the zcl_abapgit_object_ class) to the branch, and create a pull request to the abapGit repository. Reference your issue in the pull request and add a link to the test repository.\",\"Note: Object types using the ABAP File Format must be added to the AFF Registry as well.\",\"Update documentation\",\"Add the new object type to the list of supported objects. If the object type is using the ABAP File Format (JSON), add a link to the corresponding JSON schema in the AFF repository.\",\"Wait for feedback from and merge by abapGit maintainers\",\"One of the maintainers will typically do a code review, run the test themselves, and either provide feedback or merge the pull request.\",\"Completing tasks\",\"After a successful merge, abapGit developer and standalone version will support the new object type. Congratulations. Feel free to tell the world about it!\"]},\"115\":{\"c\":[\"serializers\"]},\"116\":{\"h\":\"Technical Details\"},\"117\":{\"h\":\"Catalog\",\"t\":[\"Documentation\",\"Links\"]},\"118\":{\"h\":\"Documentation\",\"t\":[\"abapGit uses GitHub Pages for documentation.\",\"The website itself is created via VuePress (v2) together with the MIT licensed theme Hope Theme.\",\"All used icons are freely available at Font Awesome.\"]},\"119\":{\"h\":\"Running the site locally\",\"t\":[\"npm install\",\"npm run docs:dev\",\"Open the URL http://localhost:8080 in a browser\"]},\"120\":{\"c\":[\"details\"]},\"121\":{\"h\":\"Links\"},\"122\":{\"h\":\"Collection of links to various git-related documentation\",\"t\":[\"Git HTTP transport protocol documentation\",\"git reference\",\"git protocol capabilities\",\"git HTTP protocol\",\"git PACK protocol\",\"git pack format\",\"Git Tip of the Week: Objects\",\"Git Internals - Transfer Protocols\",\"Git receive-pack.c Source\",\"Reimplementing “git clone” in Haskell from the bottom up\",\"set GIT_CURL_VERBOSE=1 $env:GIT_CURL_VERBOSE=1 $env:GIT_TRACE=1 git config --global http.proxy %HTTP_PROXY% git config --global --unset http.proxy git config --global http.sslVerify false GIT_TRACE=2 GIT_CURL_VERBOSE=2 GIT_TRACE_PERFORMANCE=2 GIT_TRACE_PACK_ACCESS=2 GIT_TRACE_PACKET=2 GIT_TRACE_PACKFILE=2 GIT_TRACE_SETUP=2 GIT_TRACE_SHALLOW=2 \"]},\"123\":{\"c\":[\"details\"]},\"124\":{\"h\":\"Testing\"},\"125\":{\"h\":\"Catalog\",\"t\":[\"Debugging\",\"Unit Tests\",\"CI Tests\"]},\"126\":{\"h\":\"CI Tests\",\"t\":[\"Results from latest CI run: https://ci.abapgit.org\",\"Repo abapGit CI provides basic continuous integration capabilities for abapGit. The repository aims to test the serialization and deserialization of object types, as these cannot be unit-tested properly.\",\"The CI process fetches abapGit test repos from abapGit Tests. Then for each repository, the following steps are executed:\",\"create a package (if needed)\",\"clone\",\"pull\",\"syntax check\",\"object check\",\"create transport request\",\"purge (uninstall)\",\"delete transport request\",\"check for leftovers\",\"Additionally, a set of generic tests is performed checking the latest abapGit build.\",\"If there is any error in these steps abapGit CI will indicate that.\",\"Run report ZABAPGIT_CI_UPDATE_ABAPGIT to update the abapGit repo.\",\"Run report ZABAPGIT_CI_UPDATE_ABAPGIT_CI to update the abapGit CI repo.\",\"There are currently three possibilities to run abapGit CI:\"]},\"127\":{\"h\":\"1. Adhoc CI with report ZABAPGIT_CI\",\"t\":[\"Selection screen:\",\"abapGit CI selection screen\",\"Result list:\",\"abapGit CI results\"]},\"128\":{\"h\":\"2. REST API\",\"t\":[\"POST /sap/zabapgit_ci/run\",\"response.json\"]},\"129\":{\"h\":\"3. Schedule job sequence with report ZABAPGIT_CI_JOB_SCHEDULER\",\"t\":[\"A job sequence is created with\",\"Update abapGit repo\",\"Update abapGit CI repo\",\"Run abapGit CI\",\"abapGit CI job scheduler\"]},\"130\":{\"h\":\"Check transportable packages\",\"t\":[\"Optionally you can also let abapGit CI create the repositories in transportable packages. You need to activate the checkbox in the selection screen and specify the transport layer. Then the pull and purge actions will each get recorded into a transport request per repository. These get released and their content is checked to ensure it matches the objects in the repository.\",\"To set up a suitable transport landscape on the AS ABAP Developer Edition you need to create a new virtual system in STMS (for example EXP, Virtual export system). This serves as a dummy export target for transport requests. Next, you need to create a new transport layer (for example ZEXP) and connect the current system and the virtual system with it. Then save and activate the configuration.\",\"STMS transports landscape\"]},\"131\":{\"h\":\"Prerequisites\",\"t\":[\"There are a few prerequisites for running the CI test suite:\",\"abapGit developer version must be installed\",\"SAP Basis 7.50 or higher\",\"Tests are hosted at https://github.com/abapGit-tests\",\"Test objects shall be included in SAP Basis 7.50 (Exception: the main object type is only available in higher releases)\",\"Test objects from SAP ERP or industry solutions shall be avoided (Exception: the main object type is only available in ERP)\"]},\"132\":{\"c\":[\"testing\"]},\"133\":{\"h\":\"Debugging\"},\"134\":{\"h\":\"ABAP\",\"t\":[\"Using the standalone version for debugging is not recommended since the very large source will have to be loaded and parsed by the debugger. It's much more efficient to debug using the developer version.\",\"If you suspect an issue in the object serializer classes, then be sure to disable parallel processing in the abapGit settings. Otherwise, the debugger will not stop at your break points.\",\"In case you can't resolve or pinpoint the issue, try to reproduce it using a case from the abapGit-test organization. If you don't find a test case, open an issue and we will create a new repo for it.\"]},\"135\":{\"h\":\"JavaScript\",\"t\":[\"Some pages in abapGit contain JavaScript. If the script fails, you typically see the following banner:\",\"Script Issue\",\"Also, the lower right corner of the HTML output will NOT show \\\"JS OK\\\". Troubleshooting depends on the type of SAP GUI you are using.\",\"Note\",\"Check SAP GUI Setup for known issues related to SAP GUI.\"]},\"136\":{\"h\":\"SAP GUI for Windows\",\"t\":[\"If you are using SAP GUI 7.6 or below, or SAP GUI 7.7 and higher with Internet Explorer browser control, then follow these instructions on how to use the IE Debugger in abapGit:\",\"Obscure productivity tips: Debug Javascript running within SAPGUI browser\",\"If you are using SAP GUI 7.7 or higher with Edge (Chrome) browser control, use the developer tools that come with WebView2:\",\"General: Debug WebView2 Apps SAP Note 3099670 - SAP GUI for Windows Chromium-based Edge Control: Adding remote debugging featureHow to Debug WebView2 in SAP GUI\"]},\"137\":{\"h\":\"SAP GUI for HTML (Web)\",\"t\":[\"Troubleshooting depends on the type of browser you are using.\"]},\"138\":{\"h\":\"SAP GUI for Java\",\"t\":[\"JavaScript is not supported with this SAP GUI.\"]},\"139\":{\"h\":\"Web Edition\",\"t\":[\"Running abapGit completely in a browser is still a proof-of-concept. Open an issue here.\"]},\"140\":{\"c\":[\"testing\"]},\"141\":{\"h\":\"Unit Tests\",\"t\":[\"abapGit uses dependency lookup as an approach for writing unit tests, see examples in ZCL_ABAPGIT_TADIR, ZCL_ABAPGIT_FACTORY, and ZCL_ABAPGIT_INJECTOR.\",\"Unit tests that create and delete objects in the system are categorized as dangerous, these tests can be enabled via \\\"Advanced > Settings\\\".\",\"Use organization abapGit-tests for storing serialization test cases.\"]},\"142\":{\"c\":[\"testing\"]},\"143\":{\"h\":\"User Interface\"},\"144\":{\"h\":\"Catalog\",\"t\":[\"HTML Pages\",\"HTML Forms\",\"HTML Popups\",\"CSS and Assets\",\"JavaScript\",\"Icons\"]},\"145\":{\"h\":\"Icons\",\"t\":[\"abapGit uses SIL and MIT-licensed fonts, they are included in the distribution as a MIME object. This includes MIME objects:\",\"ZABAPGIT_ICON_FONT - font in WOFF format containing the custom icon set. WOFF is used due to compatibility, SAP GUI for Windows reusing Internet Explorer control (IE 11)\",\"ZABAPGIT_ICON_FONT_CSS - CSS icon map\",\"To add an icon to the icon set follow the next procedure:\",\"Add the icon to repo abapGit Icon Font as documented here\",\"Get the new abapGit font and icon files from the icon-font GitHub action\",\"Go to transaction SMW0 and display the abapGit MIME objects (Binary > Package $abapgit)\",\"Upload the new font file to ZABAPGIT_ICON_FONT\",\"Upload the new CSS file to ZABAPGIT_ICON_FONT_CSS\",\"Start abapGit and commit the changes the abapGit/abapGit repo (preferably in a separate commit)\",\"Please mind the licensing when adding icons that are not from Font Awesome.\",\"Info\",\"Alternatively you can use w3mipoller for the upload step. See also UI - CSS and assets.\"]},\"146\":{\"c\":[\"ui\"]},\"147\":{\"h\":\"CSS and Assets\",\"t\":[\"This documentation covers asset management, CSS processing, and recommended asset development flow. See also the UI - HTML Pages.\"]},\"148\":{\"h\":\"TL;DR\",\"t\":[\"If you add an asset - code it in ZCL_ABAPGIT_UI_FACTORY=>INIT_ASSET_MANAGER\",\"There are 3 main CSS sheets to mind: ag-icons.css with icon definitions, common.css with layouts (don't use for colors!), and theme-default.css for colors\",\"Custom themes (\\\"Dark\\\" and \\\"Belize\\\") are combined with \\\"Default\\\" so that missing attributes are inherited from the default one\",\"abapGit uses internal CSS preprocessing to support CSS variables (which are otherwise not supported by IE - undercover browser of SAP GUI)\",\"A convenient way for changing and uploading CSS and other assets is W3MIPOLLER\"]},\"149\":{\"h\":\"Asset Manager\",\"t\":[\"ZCL_ABAPGIT_GUI_ASSET_MANAGER class is responsible for managing static assets. Very briefly: relevant assets must be registered in the asset manager instance during GUI initiation so that they can be used in the browser UI. The registration happens in ZCL_ABAPGIT_UI_FACTORY=>INIT_ASSET_MANAGER. Here is an abstract from the method for example:\",\"DEFINE _inline. APPEND &1 TO lt_inline. \\\" <<< THIS IS USED TO INCLUDE ASSET IN-CODE WITH ABAPMERGE END-OF-DEFINITION. DATA lt_inline TYPE string_table. CLEAR lt_inline. \\\" @@abapmerge include zabapgit_css_common.w3mi.data.css > _inline '$$'. ro_asset_man->register_asset( iv_url = 'css/common.css' \\\" <<< PATH TO THE ASSET FROM HTML, WHICH IS ALSO IT'S UNIQUE NAME iv_type = 'text/css' \\\" <<< CONTENT TYPE OF THE ASSET iv_mime_name = 'ZABAPGIT_CSS_COMMON' \\\" <<< MIME OBJECT NAME iv_inline = concat_lines_of( table = lt_inline sep = cl_abap_char_utilities=>newline ) ). CLEAR lt_inline. \\\" @@abapmerge include-base64 zabapgit_icon_font.w3mi.data.woff > _inline '$$'. \\\" <<< THE FILE BINARY !!! ro_asset_man->register_asset( iv_url = 'font/ag-icons.woff' iv_type = 'font/woff' iv_mime_name = 'ZABAPGIT_ICON_FONT' iv_base64 = concat_lines_of( table = lt_inline ) ). \\\" see https://github.com/abapGit/abapGit/issues/201 for source SVG ro_asset_man->register_asset( iv_url = 'img/logo' iv_type = 'image/png' iv_base64 = 'iVBORw0KGgoAAAANSUhENCSVQICAgIfAhkiAAA...'. \",\"There are several ways to store the content of a static asset in abapGit.\",\"Pass the asset inline. e.g. the logo at the end is a PNG image. It is encoded as BASE64 and passed as iv_base64 param\",\"Inline can be also a text then should be passed with iv_inline\",\"Read from a MIME object - if inline is not passed, the asset falls back to the MIME\"]},\"150\":{\"h\":\"Compiling Standalone Version of abapGit (abapmerge)\",\"t\":[\"The tricky thing is that abapGit can be either installed as a development version, deploying all the MIME objects in particular or as a single program (standalone version). This program must contain all the assets (images, CSS, JavaScript, and fonts) in-code. This is enabled by abapmerge tool. Consider the css/common.css registration above.\",\"First, lt_inline is cleared. And in the development version of abapGit, it is then just passed to register_asset being initial. The asset manager thus falls back to ZABAPGIT_CSS_COMMON MIME object (which is conveniently deployed with the developer version).\",\"In case of the standalone version of abapGit, there is no MIME object. However, @@abapmerge include statement is processed by abapmerge and the file zabapgit_css_common.w3mi.data.css is included to the code line by line in form of _inline '$$', where $$ is the text file line. Thus, at the moment of register_asset the content of lt_inline is not initial and takes the priority over the missing MIME.\",\"Note: for the binary files, like fonts, use @@abapmerge include-base64 pragma.\"]},\"151\":{\"h\":\"CSS Structure and Themes\",\"t\":[\"abapGit uses several CSS sheets to style its visual design:\",\"ag-icons.css (ZABAPGIT_ICON_FONT_CSS) - defines the icons. See Adding Icons for details\",\"common.css (ZABAPGIT_CSS_COMMON) - main CSS sheet which defines the layout. Please don't define colors in it\",\"theme-default.css (ZABAPGIT_CSS_THEME_DEFAULT) - default color scheme\",\"theme-belize-blue.css and theme-dark.css ( ZABAPGIT_CSS_THEME_BELIZE_BLUE and ZABAPGIT_CSS_THEME_DARK ) - custom color schemes.\",\"A regular page loads: icons, common, default theme, and optionally, one of the custom themes. So the resulting style is defined by a combination of them. Importantly custom themes take the default one as the basis, so colors and variables not defined explicitly in the theme will be taken from the default one.\"]},\"152\":{\"h\":\"CSS Variables Support\",\"t\":[\"Internet explorer - which is the undercover browser component of SAP GUI - does not support CSS variables which are quite useful, for example, color definitions. However, abapGit preprocesses theme-* files, detecting the variables and applying them explicitly to other attributes and classes.\",\"Internally this is done by a combination of ZCL_ABAPGIT_GUI_HTML_PROCESSOR and ZCL_ABAPGIT_GUI_CSS_PROCESSOR. The first one detects CSS links in the HTML head, the second one merges them into bundle.css which is then re-linked from the HTML head instead of theme-*.\",\"Debugging note: the links to the replaced CSS files remain in the HTML head, they are just commented out. So if you what to edit UI files locally, just uncomment them and comment out the bundle.css link.\",\" ... \"]},\"153\":{\"h\":\"Recommended Asset Development Flow\",\"t\":[\"To edit CSS files you have to download them to the frontend, edit, debug in IE or Chrome Devtools, and upload them back. Doing so via SMW0 may be inconvenient for multiple assets (main CSS + themes + js). One of the solutions is to use W3MIPOLLER. The idea of the tool is to define a connection between a MIME asset and a frontend file and then monitor file changes - as soon as you save the file, the poller detects it and automatically uploads it to the MIME storage.\",\"sel.screen\",\"In the selection screen, you define one or several pairs MIME-to-File. You can also save them as variants. Choose the right option at the bottom:\",\"Just start polling - just start the detection of changes\",\"Download before polling - take existing MIME object and overwrite the files - useful for initial setup or after remote AG changes\",\"Upload before polling - overwrites MIME object with existing files\",\"Just a handy recommendation: if you save a variant, save it with \\\"just start polling\\\", not to overwrite something occasionally.\",\"Run the program. After the initial action (if chosen) it will start monitoring file changes - leave it running. Eventually, after a file was modified, it will report the upload on the screen.\",\"result\",\"The latest version of the w3mipoller has also an option to track all W3MI files in the package (and its sub-packages) at once. This can be convenient in case of simultaneous multiple file editing. Briefly:\",\"choose the $ABAPGIT package\",\"choose the root directory to save files to\",\"optionally enter regex for file names (e.g. \\\".*css$\\\" if you intend to edit css file only)\",\"optionally select \\\"Sort by ...\\\" flag to split files by sub-directories by extension (since abapgit html pages refer to css/.. and js/.. URIs is may be helpful)\",\"see more in project readme\",\"whole project\"]},\"154\":{\"c\":[\"ui\"]},\"155\":{\"h\":\"HTML Forms\",\"t\":[\"This doc covers the HTML form component in abapGit UI. See also the UI - HTML pages.\"]},\"156\":{\"h\":\"General\",\"t\":[\"There is a helper class to render HTML forms - zcl_abapgit_html_form. To see an example - open the online repo creation dialog (code: class zcl_abapgit_gui_page_addonline). Typical usage:\",\"create the form (preferably in constructor - it is descriptive)\",\"add fields one by one\",\"for complex fields (radio) - add options right after the field\",\"on render - pass zcl_abapgit_string_map instance of values and, optionally, a map of validation results (see below)\",\"fields can be required (iv_required = abap_true)\",\"fields can have tooltips (iv_hint = 'help for the field')\",\"text fields may have placeholders (iv_placeholder = '...')\",\"text fields may be uppercased (iv_upper_case = abap_bool - for normalization - see below)\",\"text fields may have side-actions - button next to them - passing current form state to abap for additional logic and re-render\",\"a form may have one or more commands at the bottom. Main ones (iv_is_main = abap_true) - will be highlighted\",\" DATA lo_form TYPE REF TO zcl_abapgit_html_form. lo_form = zcl_abapgit_html_form=>create( iv_form_id = 'add-repo-online-form' ). lo_form->text( iv_name = c_id-package iv_side_action = c_event-choose_package iv_required = abap_true iv_label = 'Package' iv_hint = 'SAP package for the code (should be a dedicated one)' iv_placeholder = 'Z... / $...' ). lo_form->radio( iv_name = c_id-folder_logic iv_default_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix iv_label = 'Folder logic' iv_hint = 'Define how package folders are named in the repo' ). lo_form->option( iv_label = 'Prefix' iv_value = zif_abapgit_dot_abapgit=>c_folder_logic-prefix ). lo_form->option( iv_label = 'Full' iv_value = zif_abapgit_dot_abapgit=>c_folder_logic-full ). lo_form->checkbox( iv_name = c_id-ignore_subpackages iv_label = 'Ignore subpackages' iv_hint = 'Syncronize root package only' ). lo_form->command( iv_label = 'Clone online repo' iv_is_main = abap_true iv_action = c_event-add_online_repo ). ro_html->add( lo_form->render( iv_form_class = 'dialog w600px m-em5-sides margin-v1' io_values = mo_form_data io_validation_log = mo_validation_log ) ). \"]},\"157\":{\"h\":\"Values Normalization\",\"t\":[\"The class has validate_normalize_form_data method as a default validator/normalizer. It accepts string_map with field key-values. And they run through them doing the following:\",\"fields, missing in the form definition will raise an exception\",\"text fields, marked with upper_case during definition, are converted to uppercase\",\"checkbox fields, convert on value (HTML default), to abap_true\",\"\\\" lo_field_map: \\\" 'name' = 'xxx' \\\" 'package' = '$mypack' <-- with 'iv_upper_case = true' during definition \\\" 'my_checkbox' = 'on' lo_field_map = lo_form->validate_normalize_form_data( lo_field_map ). \\\" 'name' = 'xxx' \\\" 'package' = '$MYPACK' \\\" 'my_checkbox' = 'X' \"]},\"158\":{\"h\":\"Values and Validation\",\"t\":[\"The class is designed so that its instance is more a declaration of the form, that can be created once and then rendered each time with different values. On render you pass a CSS class of the form, values, and optionally validation results.\",\"Values is an instance of zcl_abapgit_string_map - key-value map, where the key must be the same as the field name (thus it's recommended to define names as constants). E.g.\",\"lo_form->text( iv_name = c_id-package \\\" <<<<< NAME iv_label = 'Package' ). ... DATA mo_form_data TYPE REF TO zcl_abapgit_string_map. CREATE OBJECT mo_form_data. mo_form_data->set( iv_key = c_id-package iv_val = 'XYZ' ). \\\" <<<<< VALUE ... lo_form->render( iv_form_class = 'dialog w600px m-em5-sides margin-v1' io_values = mo_form_data ). \",\"If a validation log is passed, then it's checked for a non-empty value of the field name, and renders it as the error message.\",\"lo_form->text( iv_name = c_id-package \\\" <<<<< NAME iv_label = 'Package' ). ... DATA mo_validation_log TYPE REF TO zcl_abapgit_string_map. CREATE OBJECT mo_validation_log. mo_form_data->set( iv_key = c_id-package \\\" <<<<< SAME NAME iv_val = 'OMG! It crushed!' ). \\\" <<<<< ERROR MESSAGE ... lo_form->render( iv_form_class = 'dialog w600px m-em5-sides margin-v1' io_values = mo_form_data io_validation_log = mo_validation_log ) ). \\\" <<< ERRORS HERE \"]},\"159\":{\"c\":[\"ui\"]},\"160\":{\"h\":\"JavaScript\",\"t\":[\"This documentation covers java script specifics in abapGit UI. See also the UI - HTML Pages.\"]},\"161\":{\"h\":\"General\",\"t\":[\"abapGit UI contains JavaScript code. Some of the dynamic features rely on it e.g. keyboard navigation. The JS code is located in ui/zabapgit_js_common.w3mi.data.js - the recommended way to modify it is described in the \\\"Recommended asset development flow\\\" section of UI - CSS and Assets.\",\"As SAP GUI uses Internet Explorer component to render HTML the JS code must be optimized for IE11 (and use the features available in it). Although some polyfills are available (and more can be added) at the beginning of the code (like String.includes).\",\"The pull request CI check includes a run of eslint, so any new code should conform to the rules defined for the abapGit repository.\"]},\"162\":{\"h\":\"Components\",\"t\":[\"The JS library contains several components which can be reused in different places.\"]},\"163\":{\"h\":\"Command Palette\",\"t\":[\"To add a command palette add the following code in the script method of the page.\",\"ro_html->add( 'var gCommandPalette = new CommandPalette(enumerateFn, {' ). ro_html->add( ' toggleKey: \\\"F1\\\",' ). ro_html->add( ' hotkeyDescription: \\\"Command ...\\\"' ). ro_html->add( '});' ). \",\"where:\",\"enumerateFn is a function that returns a list of commands in the form of an array of\",\"{ action: \\\"go_home\\\", // sapevent action or js function iconClass: \\\"icon icon-star\\\", // class for item icon, OPTIONAL !!! title: \\\"Go home\\\" // title of the command } \",\"toggleKey is a key to toggle the palette. \\\"^\\\" at the beginning requires Ctrl (\\\"^g\\\" = Ctrl+g )\",\"hotkeyDescription is the description that is a) added to the shortkey help popup b) used as a placeholder in the command palette\",\"See an example of enumerators - enumerateToolbarActions and enumerateTocAllRepos.\"]},\"164\":{\"h\":\"To-Do\",\"t\":[\"debugOutput\",\"submitSapeventForm\",\"setInitialFocus\",\"setInitialFocusWithQuerySelector\",\"submitFormById\",\"findStyleSheetByName\",\"getIndocStyleSheet\",\"toggleDisplay\",\"Hotkeys.addHotkeyToHelpSheet\",\"...\"]},\"165\":{\"c\":[\"ui\"]},\"166\":{\"h\":\"HTML Pages\",\"t\":[\"This documentation covers page creation, HTML rendering, and event handling.\",\"See also UI - CSS and Assets\",\"See also UI - JavaScript\",\"See also HTML Forms\"]},\"167\":{\"h\":\"TL;DR\",\"t\":[\"To create a new page in abapGit you subclass ZCL_ABAPGIT_GUI_PAGE and redefine RENDER_CONTENT method (also consider separating components that implement ZIF_ABAPGIT_GUI_RENDERABLE directly, this will probably become the primary approach in future)\",\"Use ZCL_ABAPGIT_HTML to collect HTML content - method add accepts strings, string_tables, and instances of ZCL_ABAPGIT_HTML\",\"Use ZCL_ABAPGIT_HTML=>ICON to render icons\",\"Use ZCL_ABAPGIT_HTML=>A to render anchors, don't render them manually ...\",\"Please, please, care about usability, content readability, and style in general 🙏 😉\",\"Check ZCL_ABAPGIT_GUI_CHUNK_LIB for some existing HTML chunks like render_error\",\"To register postponed HTML parts, scripts, and hotkeys - access corresponding methods via gui_services method of zcl_abapgit_gui_component\"]},\"168\":{\"h\":\"GUI Components\",\"t\":[\"abapGit UI is based on HTML and CL_GUI_HTML_VIEWER. The main parts are:\",\"ZCL_ABAPGIT_GUI - the class which initializes CL_GUI_HTML_VIEWER and manages page stack\",\"ZCL_ABAPGIT_GUI_ASSET_MANAGER - manages static assets like images, CSS, JS code, and fonts\",\"ZCL_ABAPGIT_HTML - helper for HTML accumulation and rendering\",\"ZCL_ABAPGIT_GUI_ROUTER - abapGit specific global event handling, main to route between the pages or run globally defined actions like repo installation\",\"ZCL_ABAPGIT_GUI_PAGE - base class for pages. It renders typical HTML headers and abapGit-related java scripts. ~So in most cases you probably just want to subclass it and render just the content~\",\"ZCL_ABAPGIT_GUI_COMPONENT - base class for GUI components. Gives access to gui_services to register postponed HTML parts, scripts, and hotkeys. Usually, it is a good idea to subclass from it, if you want to use these features.\",\"ZIF_ABAPGIT_GUI_RENDERABLE - interface which a renderable component must expose to be able to interact with ZCL_ABAPGIT_GUI\",\"ZIF_ABAPGIT_GUI_EVENT_HANDLER - interface which a component must expose to be able to register itself as an event handler in ZCL_ABAPGIT_GUI\",\"ZIF_ABAPGIT_GUI_HOTKEYS - interface which a component must expose to be able to register hotkey actions\"]},\"169\":{\"h\":\"Rendering Content\",\"t\":[\"An example of RENDER_CONTENT (or any other helper method with HTML output)\",\"METHOD render_content. CREATE OBJECT ro_html. ro_html->add( '
    ' ). ro_html->add( '

    My content

    ' ). ro_html->add_icon( 'star/error' ). ro_html->add_a( iv_txt = 'click me' iv_act = 'some_event_handled_in_abap' ). ro_html->add( render_some_complex_stuff( ) ). ro_html->add( '
    ' ). ENDMETHOD. \"]},\"170\":{\"h\":\"HTML Helper\",\"t\":[\"ro_html which is the instance of ZCL_ABAPGIT_HTML is a helper tool for HTML rendering. It accumulates HTML content and then can output it with render method. It has a couple of important methods:\",\"ADD - adds a chunk to accumulated HTML. You can pass a string or another ZCL_ABAPGIT_HTML instance. In the example above render_some_stuff may either return a string or have the same pattern as render_content (retuning ZCL_ABAPGIT_HTML instance)\",\"ADD_ICON and ICON - renders an icon. abapGit uses web fonts to render icons (see adding icons). The method accepts the icon name and a CSS class name which represents a color separated by '/'. E.g., in the example above it will render 'star' icon and assign 'error' CSS class to it which has red color in the abapGit styles. The method has its static brother ZCL_ABAPGIT_HTML=>ICON which is more convenient in some cases and just returns a rendered HTML string.\",\"ADD_A and A - render a link (anchor) (A - static method). It is strongly suggested that you use this method instead of rendering tags directly. Params: \",\"IV_TXT - text to be rendered inside the anchor\",\"IV_TYP - the type of action done on click. 3 options: \",\"zif_abapgit_html=>c_action_type-url- direct link to an URL,\",\"...-sapevent (the default) - pass an event to sap handler,\",\"...-onclick - call a JS function,\",\"...-dummy - just render an anchor but no action\",\"IV_ACT - depending on the type should be either URL or sapevent name or JS function to call\",\"IV_OPT - zif_abapgit_html=>c_html_opt-strong or ...-cancel or ...-crossout - some semantic predefined styles to add to the link\",\"IV_CLASS - additional CSS class, if needed\",\"IV_STYLE - additional direct styles to use (generally discouraged, please use CSS classes instead)\",\"IV_ID - id of the anchor (may be needed for JS code)\",\"SET_TITLE - the method is used for debugging purposes for postponed HTML parts. As it is not visible which class registered an HTML part, the title can be used to specify the origin.\"]},\"171\":{\"h\":\"Renderables\",\"t\":[\"Sub-classing ZCL_ABAPGIT_GUI_PAGE is not the only way to render the content. You may want to separate some visual component that is not a page e.g. ZCL_ABAPGIT_GUI_VIEW_REPO is a class like that. In essence, you have to implement ZIF_ABAPGIT_GUI_RENDERABLE and its method - render. Then you can reuse it or even pass it directly to the GUI class as a page to render.\",\"It makes sense to also subclass your component from ZCL_ABAPGIT_GUI_COMPONENT. This class has a protected gui_services method returning the singleton instance of ZIF_ABAPGIT_GUI_SERVICES. The GUI services are good for:\",\"registering self as an event handler (register_event_handler). Importantly, later registered event handlers have higher priority (processing is done from bottom to top)\",\"accessing hotkey services (get_hotkeys_ctl) - to register own hotkeys for the page (hotkeys are combined from the whole component stack)\",\"registering postponed HTML parts (get_html_parts)\"]},\"172\":{\"h\":\"Postponed HTML Parts\",\"t\":[\"Components may have postponed parts, e.g. scripts or hidden forms. These chunks may need to be rendered in another location on the page (e.g. scripts are rendered at the end). There is a mechanism to enable it:\",\" \\\" ... somewhere within render gui_services( )->get_html_parts( )->add_part( iv_collection = c_html_parts-scripts ii_part = render_my_scripts( ) ). \",\"where render_my_scripts( ) must return an instance of ZCL_ABAPGIT_HTML.\",\"Currently, two collections are supported out of the box - scripts and hidden_forms (see definition of zcl_abapgit_gui_component). Scripts rendered after the page body. Hidden forms right before the end of the body. But this does not limit you to these categories only - you may register your own collections to exchange postponed parts between components supported by you. The collection is just a named list of ZCL_ABAPGIT_HTML instances.\"]},\"173\":{\"h\":\"Router and Event Handlers\",\"t\":[\"To process sapevents in abap the component (page) must implement ZIF_ABAPGIT_GUI_EVENT_HANDLER=>on_event. It imports ii_event instance which represents sapevent handler of cl_gui_html_viewer. In particular:\",\"ii_event->mv_action - sapevent code (part of URL before ?)\",\"ii_event->mv_getdata - raw URL query (part of URL after ?)\",\"ii_event->mt_postdata - raw post data (if present)\",\"ii_event->mi_gui_services - the instance of GUI services for easier access\",\"ii_event->query() - returns parsed url query (k1=v1&k2=v2...) in form of string_map. Param names are uppercased (by default). Params that are not uniform are not parsed (k1=v1&k2 - will result in k1 only). Params can be addressed in 2 typical ways: \",\"ii_event->query( )->get( 'XXX' )\",\"or ii_event->query( )->to_abap( changing cs_container = ls_struc_with_fields )\",\"query string_map is immutable (attempt to set will raise an exception)\",\"accepts optional iv_upper_cased param to unify param names (default = true)\",\"ii_event->form_data() - attempts to parse post_data assuming it is set of key value pairs. Returns a string map. Otherwise behaves as query() above. iv_upper_cased = false by default.\",\"Events can be processed on 2 levels - in page/component or in the router. On new event:\",\"the GUI goes through the event handlers stack - a list of components that registered themselves as event handlers during rendering via gui_services\",\"the processing is done from the last registered handler to the first one (stack top to bottom)\",\"the first event handler that returns \\\"handled\\\" status breaks the cycle (see below how this is indicated)\",\"if the event was not handled by the handlers in the stack the event would be passed to the router\",\"Router (ZCL_ABAPGIT_GUI_ROUTER) is the class that handles global abapGit commands like opening specific pages and actions like repo installation/deletion.\",\"In order to indicate the result of event handling an on_event implementation must return rs_handled-state (element of zcl_abapgit_gui=>c_event_state) and, optionally, rs_handled-page:\",\"not_handled (same as initial) - the event was not handled, process it by the next handler (e.g. the router)\",\"re_render - just re-render the current page (probably an internal state of the page object was changed so the visualization should too)\",\"new_page - render ei_page\",\"go_back - render the previous page in the call stack (e.g. user pressed F3)no_more_act - the action was handled, no further processing required, and in particular no re-rendering\",\"new_page_w_bookmark - ei_page and put a bookmark - allows using go_back_to_bookmark action that will skip all the page stack till the first bookmark\",\"new_page_replacing - ei_page and replace the current page in stack (so that F3 returns to the parent of the current page)\",\"go_back_to_bookmark - go back and skip all the page stack till the first bookmark (works with new_page_w_bookmark)\"]},\"174\":{\"h\":\"Hotkey\",\"t\":[\"In a nutshell:\",\" \\\" somewhere within render gui_services( )->get_hotkeys_ctl( )->register_hotkeys( me ). \",\"The component must implement zif_abapgit_gui_hotkeys and return the list of keys, their human-readable meaning, and the corresponding event to invoke.\",\" METHOD zif_abapgit_gui_hotkeys~get_hotkey_actions. DATA ls_hotkey_action LIKE LINE OF rt_hotkey_actions. ls_hotkey_action-ui_component = 'Stage'. \\\" <<< This is to define origin of hotkeys ls_hotkey_action-description = |Patch|. \\\" <<< Human readable description ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_patch. \\\" <<< abapgit-wide action to open patch page ls_hotkey_action-hotkey = |p|. \\\" <<< Key INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. ls_hotkey_action-description = |Diff|. ls_hotkey_action-action = zif_abapgit_definitions=>c_action-go_diff. ls_hotkey_action-hotkey = |d|. INSERT ls_hotkey_action INTO TABLE rt_hotkey_actions. ENDMETHOD. \"]},\"175\":{\"c\":[\"ui\"]},\"176\":{\"h\":\"HTML Popups\",\"t\":[\"Disclaimer: this functionality is new and may change potentially.\"]},\"177\":{\"h\":\"Architecture comments\",\"t\":[\"Kinds of popups:\",\"\\\"in-page\\\" - a hovering form, blocking the regular content\",\"\\\"separate page\\\" - a regular page, yet that does not allow any page transitions others that go back\",\"Ideally, a visualization component should not know that it is a popup (being agnostic). It is its wrapper that should know and manage the aspects. For example: zcl_abapgit_gui_picklist - a component that renders a list to choose an item from. This very same component can be rendered as a part of the page, as an in-page popup, or as a separate page popup.\"]},\"178\":{\"h\":\"Separate-page popup\",\"t\":[\"Calling a separate-page popup would be initiated in the event handler and thus would look like this:\",\" rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page. rs_handled-page = zcl_abapgit_gui_page_hoc=>create( ii_child_component = mo_popup_picklist \\\" Or another component iv_show_as_modal = abap_true ). \",\"Thus wrapping the popup component (e.g. mo_popup_picklist in this example) into the High Order page component. Passing iv_show_as_modal to zcl_abapgit_gui_page_hoc has the following effects on GUI:\",\"only re_render, go_back, and no_more_act states are accepted from the modal event handler (thus guaranteeing that popup will not forward to any other page rather than its caller)\",\"router is excluded from the event chain (thus also removing the main source of page redirections)\"]},\"179\":{\"h\":\"Calling a popup in-page\",\"t\":[\"The example below focuses on the functionality of zcl_abapgit_gui_picklist, yet it can be any other properly designed component in a popup.\",\"take into account that re-rendering in-page popup also re-renders the underlying page. If the caller page is potentially large, probably, an in-page popup is a sub-optimal choice.\",\"the caller page should not interfere with the popup in terms of event and hotkey handling. Thus it must not register the handler if an in-page popup is visible.\",\"Sample implementation can be found for example in zcl_abapgit_gui_page_sett_remo, it includes these treats:\",\"mo_popup_picklist - an instance of a popup (one of - the page can show several, yet all of them are managed by zcl_abapgit_gui_picklist)\",\"in the event handler: the code that auto-detects if the popup is an in-page or independent\",\" IF mo_popup_picklist IS BOUND. \\\" Uniform popup state handling IF mo_popup_picklist->is_in_page( ) = abap_true. rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. \\\" in-page popup -> rerender the page together with the popup ELSE. rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page. rs_handled-page = zcl_abapgit_gui_page_hoc=>create( ii_child_component = mo_popup_picklist iv_show_as_modal = abap_true ). \\\" separate page popup -> switch to it ENDIF. ENDIF. \",\"in render: if an \\\"in-page\\\" popup was initiated - skip own register_handlers (to avoid interference). Otherwise, add the popup to the render result.\",\" IF mo_popup_picklist IS NOT BOUND OR mo_popup_picklist->is_in_page( ) = abap_false. register_handlers( ). ELSEIF mo_popup_picklist->is_in_page( ) = abap_true. \\\" Block usual page events if the popup is an in-page popup ri_html->add( zcl_abapgit_gui_in_page_modal=>create( mo_popup_picklist ) ). ENDIF. \"]},\"180\":{\"h\":\"Initiating the popup and retrieving the result\",\"t\":[\"Problem: SAP does not allow modal HTML forms, thus initialization and retrieving the result happens asynchronously and independently. It is more the developer's responsibility to keep this code readable.\",\"The current \\\"state-of-art\\\" approach suggests (though can potentially be improved): process initiation and result reading in the same method, the \\\"mode\\\" should be dictated by parameters (e.g. iv_is_return = abap_true)\",\"e.g. let's consider the zcl_abapgit_gui_page_sett_remo->choose_branch:\",\"initiation would end up with mo_popup_picklist = ... (create the component), thus marking the presence of the popup for the further code\",\"the returning part iv_is_return = abap_true is checking if the popup was canceled by user mo_popup_picklist->was_cancelled( ) and retrieves the chosen entry mo_popup_picklist->get_result_item( ... )\",\"Now, it is important to uniformly initiate the return flow. In zcl_abapgit_gui_page_sett_remo this is done by handle_picklist_state which is called at the very beginning of the render. The method checks if the popup claims that it was fulfilled (confirmed or canceled) and, if yes, calls the appropriate choose_* method based on mo_popup_picklist->id( ).\",\"Finally, one more way to escape the popup is by pressing the F3 or ESC - which are handled by GUI, not by the popup component. As a result of this:\",\"popup does not know that it was canceled\",\"even further, the back will be applied to the caller page and not to the in-page popup!\",\"The solution to that is the graceful back procedure. Before going back the GUI send an event go_back to the top-most component (which happens to be the popup). Thus the component has a chance to:\",\"properly process the request to exit\",\"send back the re_render or no_more_act states \",\"the re_render will result in the re-rendering of the parent (caller) page, yet with the popup in canceled/fulfilled state\",\"the no_more_act gives a possibility to cancel the go_back action (e.g. to prevent exiting the popup when data was not saved)\"]},\"181\":{\"c\":[\"ui\"]},\"182\":{\"h\":\"Getting Started\"},\"183\":{\"h\":\"Catalog\",\"t\":[\"Installation\",\"Upgrading\",\"Uninstalling\",\"UI Layout\",\"UI Features\"]},\"184\":{\"h\":\"Installation\"},\"185\":{\"h\":\"Summary\",\"t\":[\"abapGit exists in 2 flavours: standalone version or developer version.\",\"The standalone version is targeted at users. It consists of one (huge) program which contains all the needed code. You run the standalone version in transaction SE38, executing the program you created.\",\"The developer version is targeted at developers contributing to the abapGit codebase. It consists of all the ABAP programs/classes/interfaces/etc. of the abapGit project. You run the developer version with transaction ZABAPGIT. Only the developer version supports parallel processing, so it might be of interest to you even if you do not intend to contribute.\"]},\"186\":{\"h\":\"Prerequisites\",\"t\":[\"abapGit requires SAP BASIS version 702 or higher.\",\"abapGit works best with SAP GUI for Windows. Check SAP GUI for details about the SAP GUI Browser Control and other SAP GUI versions (for Java or for HTML).\",\"You can check your system for recommended SAP Notes using Note Analyzer.\"]},\"187\":{\"h\":\"Install Standalone Version\",\"t\":[\"Download the ABAP code (right click -> save-as) to a file.\",\"Via SE38, SE80, or ADT, create a new report named ZABAPGIT_STANDALONE (formerly ZABAPGIT_FULL). Note: Do not use the name ZABAPGIT if you plan to install the developer version.\",\"In source code change mode, upload the code from the file using Utilities -> More Utilities -> Upload/Download -> Upload\",\"Activate\",\"Typically, abapGit will only be used in the development system, so it can be installed in a local $ package (e.g. $ZABAPGIT).\",\"Now you can use abapGit by executing the report in transaction SE38.\"]},\"188\":{\"h\":\"Install Developer Version\",\"t\":[\"In order to contribute to the abapGit project, you install the developer version. First, log on to your SAP system in English (language EN) and install the standalone version (see above).\"]},\"189\":{\"h\":\"Online (Recommended)\",\"t\":[\"The prerequisite to using the online feature is that SSL must be set up. If your system is not connected to the Internet (e.g. behind a firewall) or doesn't allow proper SSL configuration, then you can use the offline scenario (see below).\",\"Run the standalone version of abapGit\",\"On the repository list page, select \\\"New Online\\\"\",\"Enter https://github.com/abapGit/abapGit/ for the URL\",\"Enter package name $ABAPGIT (or select an existing or create a new package)\",\"Select \\\"Create Online Repo\\\"\",\"Select \\\"Pull\\\"\",\"Transaction ZABAPGIT is now available to run the developer version.\"]},\"190\":{\"h\":\"Offline\",\"t\":[\"Download the latest version of the abapGit developer version from https://github.com/abapGit/abapGit/. Select Code > Download ZIP and save the file locally.\",\"Run the standalone version of abapGit\",\"On the repository list page, select \\\"New Offline\\\"\",\"Enter repo name abapGit and package name $ABAPGIT (or select an existing or create a new package)\",\"Select \\\"Create Offline Repo\\\"\",\"Select \\\"Import zip\\\"\",\"Select the abapGit-main.zip file\",\"Select \\\"Pull zip\\\"\",\"Transaction ZABAPGIT is now available to run the developer version.\"]},\"191\":{\"c\":[\"getting-started\"]},\"192\":{\"h\":\"UI Layout\",\"t\":[\"The abapGit user interface is based on HTML. Each page is structured into four sections: top, header, content, and footer.\"]},\"193\":{\"h\":\"Page Top\",\"t\":[\"At the top of each page, abapGit displays its logo and the current page title on the left, and optionally menu items on the right.\",\"This section is \\\"sticky\\\" and remains at the top of the page when scrolling downwards.\"]},\"194\":{\"h\":\"Page Header\",\"t\":[\"Pages in abapGit that are related to a repository contain a header including essential repository information and some useful features.\"]},\"195\":{\"h\":\"Icon and Description\",\"t\":[\"Online Repositories:\",\"Offline Repositories:\"]},\"196\":{\"h\":\"Repository\",\"t\":[\"For online repositories, abapGit shows the URL, a button to change the remote settings, a button to copy the URL, the current commit, and a button to show the changelog.\"]},\"197\":{\"h\":\"Changelog\",\"t\":[\"abapGit allows to display the changelog of a repository and alert the user if a new release is available. You can read instructions on how to add a changelog to your own repository here.\"]},\"198\":{\"h\":\"Favorite\",\"t\":[\"An icon indicates if a repository is marked as a favorite. Click the icon to toggle the state.\"]},\"199\":{\"h\":\"Write Protection\",\"t\":[\"If a repository is protected against changes (in local settings), then the header will show a lock icon.\"]},\"200\":{\"h\":\"Background Mode\",\"t\":[\"For repositories that have a defined background mode (in settings), a \\\"BG\\\" icon will be shown.\"]},\"201\":{\"h\":\"Branch / Tag / Commit\",\"t\":[\"The currently selected remote is shown on the right of the header. This can be either a branch like \\\"main\\\", a tag, or a commit (hash).\",\"Click the name to select a different branch or tag.\"]},\"202\":{\"h\":\"Package\",\"t\":[\"The root package of the repository is shown on the far right. Click the name to jump to the package maintenance.\"]},\"203\":{\"h\":\"Page Content\",\"t\":[\"The area between header and footer is filled differently depending on the selected page or command. Some pages like the repository list and repository view contain an additional menu bar. Pages that contain input forms, use the top menu bar to switch between forms (like tabs) and a row of buttons at the bottom to select commands.\"]},\"204\":{\"h\":\"Page Footer\",\"t\":[\"At the end of each page, abapGit displays a footer.\"]},\"205\":{\"h\":\"Sponsor Us\",\"t\":[\"On the left, you find a link to the Sponsor Us page. abapGit is exclusively developed and maintained by volunteers. Any donations are highly appreciated.\"]},\"206\":{\"h\":\"Version\",\"t\":[\"In the middle under the abapGit logo, you see the current version of abapGit. This includes version number and a description whether you are running the standalone or the developer version.\",\"Hovering of the logo shows the backend runtime of the last navigation step. Clicking the logo takes you to the abapGit Homepage.\"]},\"207\":{\"h\":\"JavaScript\",\"t\":[\"On the right, a small texts shows the state of any JavaScript that may be included on the page. In general, this should show \\\"js: OK\\\". In case of issues, the text might show debugging information or no text at all. For details, see here.\"]},\"208\":{\"c\":[\"getting-started\"]},\"209\":{\"h\":\"UI Features\",\"t\":[\"abapGit UI has several unobvious but convenient features.\"]},\"210\":{\"h\":\"Command Palettes\",\"t\":[\"Command palettes are a popular UI control available in modern editors like Sublime, VSCode, Atom and others. There are two command palettes available in abapGit.\"]},\"211\":{\"h\":\"Command Selector\",\"t\":[\"Pressing the F1 key anywhere in abapGit will open a palette of all possible commands. Type one or more letters contained in the description of the command to narrow down the list. Then use the arrow keys and Enter to select and execute a command.\",\"If you don't want to run any command, press F1 again to close the palette.\",\"Command Palette\"]},\"212\":{\"h\":\"Repository Selector\",\"t\":[\"Pressing the F2 key anywhere in abapGit will open a palette of all existing repositories. Type one or more letters contained in the description of the repository to narrow down the list. Then use the arrow keys and Enter to select and jump to a repository.\",\"If you don't want to select any repository, press F2 again to close the palette.\",\"Repository Palette\"]},\"213\":{\"h\":\"Keyboard Navigation\"},\"214\":{\"h\":\"General\",\"t\":[\"abapGit supports the general browser control keys:\",\"Escape, F3, and Alt + Left Arrow go a page back\",\"Alt + Right Arrow goes a page forward\"]},\"215\":{\"h\":\"Hotkeys\",\"t\":[\"For each page, abapGit defines certain hotkeys (or keyboard shortcuts). If you press a hotkey, it will execute the corresponding command immediately. You can display the list of possible hotkeys by pressing ? anywhere in abapGit. You can find a Hotkeys Cheat Sheet under references.\",\"Hotkeys\",\"To close the hotkey popup, press ? again.\"]},\"216\":{\"h\":\"Link Hints\",\"t\":[\"abapGit provides a clever feature to highlight and select any link (including buttons and menu items) on a page. You can activate link hint in your personal settings.\"]},\"217\":{\"c\":[\"getting-started\"]},\"218\":{\"h\":\"Uninstalling\",\"t\":[\"Delete ABAP reports ZABAPGIT* using SE38 or SE80\",\"Delete EZABAPGIT enqueue object via SE11\",\"Delete ZABAPGIT transparent table via SE11\",\"Delete mime objects ZABAPGIT_CSS_COMMON and ZABAPGIT_JS_COMMON in transaction SMW0\",\"Delete interface ZIF_APACK_MANIFEST using SE24 or SE80 (optional, cloned repositories may still use this interface)\"]},\"219\":{\"c\":[\"getting-started\"]},\"220\":{\"h\":\"Upgrading\"},\"221\":{\"h\":\"Standalone Version\",\"t\":[\"To update to the current version, upload the code from zabapgit_standalone.prog.abap into the ZABAPGIT_STANDALONE report (formerly ZABAPGIT_FULL) and activate the program.\"]},\"222\":{\"h\":\"Developer Version\",\"t\":[\"If you have installed the abapGit developer version (in a separate package like $ABAPGIT), you can update the code automatically.\"]},\"223\":{\"h\":\"Online project\",\"t\":[\"If your system is connected to the Internet, create an online repository for your abapGit package. When you view the repository and updates are available, a \\\"Pull\\\" link will appear in the menu. When you select \\\"Pull\\\", the system will download and install the latest version of the code.\"]},\"224\":{\"h\":\"Offline project\",\"t\":[\"If your system is not connected to the Internet, create an offline repository. To update abapGit download the ZIP file from https://github.com/abapGit/abapGit/archive/main.zip, and select \\\"Import ZIP\\\" in your abapGit repository.\"]},\"225\":{\"h\":\"User Exits\",\"t\":[\"Occasionally, abapGit will add new user exits. This might cause syntax errors in abapGit since the exit code is embedded as an include. It is therefore recommended to update the following together and run a syntax check of the main programs:\",\"abapGit Standalone Version + zabapgit_user_exit\",\"abapGit Developer Version + zcl_abapgit_user_exit\"]},\"226\":{\"h\":\"Troubleshooting\",\"t\":[\"Updates to abapGit can on occasion be quite significant and cause issues like inactive objects, diffs, or even dumps. If you run into such issues, please proceed as follows:\",\"Install and activate the latest standalone version (see above).\",\"Run the standalone version to update the abapGit developer version.\",\"If the update is not complete, delete any inactive objects or objects with diffs completely (like inactive classes in SE24).\",\"Restart the standalone version and perform a new \\\"Pull\\\" or \\\"Import ZIP\\\".\",\"If this does not resolve the problem, open an issue on GitHub.\"]},\"227\":{\"c\":[\"getting-started\"]},\"228\":{\"h\":\"Other\"},\"229\":{\"h\":\"Catalog\",\"t\":[\"Regular Backup\",\"Migrating from SAPlink\",\"Articles and Presentations\",\"Who Uses abapGit?\",\"Logos\",\"XML Mismatch\"]},\"230\":{\"h\":\"Articles and Presentations\"},\"231\":{\"h\":\"2014\",\"t\":[\"Git client for ABAP – alpha release -Lars Hvam\"]},\"232\":{\"h\":\"2015\",\"t\":[\"How can I use Git and GitHub for SAP software development? -Ethan Jewett\"]},\"233\":{\"h\":\"2016\",\"t\":[\"Implementing modern practices in an ABAP development shop -Ethan Jewett\",\"SAP Inside Track Hamburg -Lars Hvam\",\"SAP Inside Track Munich -Hendrik Neumann\",\"SAP Teched Barcelona -Lars Hvam\"]},\"234\":{\"h\":\"2017\",\"t\":[\"SAP d-kom Karlsruhe -Lars Hvam\",\"First look at ABAPGit & ideas on a feature -Alex Cook\",\"SAP Inside Track Ballerup, May 6th -Lars Hvam\",\"ABAP – Using git for safety and transparency -Lars Hvam\",\"Mastering SAP Technologies, Melbourne, May 23rd -Graham Robinson\",\"abapGit – so easy -Graham Robinson\",\"SAUG National Summit 2017, September 5th -Graham Robinson\",\"abapGit Branching Strategy Discussion -André Schaarschmidt\",\"SAP Teched Las Vegas -Graham Robinson\",\"abapGit, IT Conference on SAP Technologies, Cluj -Lars Hvam\",\"abapGit NET53819 SAP Teched Barcelona -Lars Hvam\",\"Getting started – Open sourcing ABAP code -Lars Hvam\",\"ABAP and the Cloud -Karl Kessler\",\"Innovative, Disruptive, Enterprise Focused and Boring – Choose Four. Reflections on SAP TechEd -RedMonk\"]},\"235\":{\"h\":\"2018\",\"t\":[\"abapGit (in German) -Enno Wulff\",\"ABAP Code Reviews with abapGit -Eduardo Copat\",\"Get into Git! - Mike Pokraka\",\"ABAP – The Special Snowflake - Nigel James\",\"Is SAP’s ABAP a special snowflake or has a Git run it over? - Den Howlett\",\"ORGANISIERE DEINE ARBEIT MIT ABAPGIT -Andra Atanasoaie\",\"Moderne ABAP Entwicklung mit abapGit - Christian Günter\",\"Coffee Corner Radio - ABAP - The Special Snowflake with Nigel & Graham, Jacob, Nigel, Graham\",\"DSAG Tech Days 2018 - DevOps in SAP ABAP Landscapes, Sascha Junkert\",\"SAP Inside Track Berlin 2018 - DevOps in SAP ABAP Landscapes, Sascha Junkert\",\"SAP Inside Track Bern 2018 - modern ABAP development with abapGit, Christian Günter\",\"DSAG - abapGit, Lars Hvam\",\"abapGit & lint, Mustafa Kerim Yılmaz\",\"Using abapGit and Phabricator for easy and simultaneously development on different multi-system-landscapes, Sascha Wächter\"]},\"236\":{\"h\":\"2019\",\"t\":[\"abapGit for enterprise, executive summary, Alexander Tsybulsky\",\"Introducing APACK – A Package and Dependency Manager for ABAP, Sebastian Wolf\",\"ASUG82855 - How Microsoft Uses Git for ABAP Code Management, Gopal Nair and Ram Bairavarsu\",\"Brainstorming on abapGIT, Jörg Krause\",\"APACK - ABAP Package and Dependency Manager, Sebastian Wolf\",\"Versioning your local objects using abapgit, Frederik Hudak\",\"Improving your ABAP code quality with open-source tools, Johan Wigert (in Swedish)\",\"Doing DevOps with SAP, Abel Wang, Ram and Gopal\"]},\"237\":{\"h\":\"2020\",\"t\":[\"How we do ABAP code review using abapGit, Michael Pang\",\"The journey to Git-based ABAP development: Part 1, Marcello Urbani\",\"The journey to Git-based ABAP development: Part 2, Marcello Urbani\",\"The journey to Git-based ABAP development: Part 3, Marcello Urbani\",\"Inside Steampunk – Vital parts of Steampunk’s abapGit, Andre Becker\",\"Automatically generate issues from source code, Enno Wulff\",\"CTS is beautiful, Lars Hvam\",\"abapGit and namespace, Michael Keller\",\"Data exchange with your github repository using abapGit, Enno Wulff\"]},\"238\":{\"h\":\"2021\",\"t\":[\"Our Journey with SAP ERP DevOps Part 1/2, Nestor Lara\",\"Our Journey with SAP ERP DevOps Part 2/2, Nestor Lara\",\"ABAP Code Review Guideline is out, Christoph Pohl\",\"Automagic standalone renaming of ABAP objects, Lars Hvam\",\"abapGit for Beginners, Marc Bernard\",\"A Practical Guide to DevOps for SAP ERP, Nestor Lara\"]},\"239\":{\"h\":\"2022\",\"t\":[\"Export Objects from SAP System to Github Indirectly (ABAPGIT Offline Mode), Aditya Aufar\",\"Storing ABAP build artifacts in OCI registry, Lars Hvam\",\"Managing SAP Application Dependencies with abapGit and APACK, Limor Wainstein (archived)\",\"Part 5: Using ABAPGit to Transfer On-Premise ABAP Source Code to SAP BW bridge, Wilson Kurian\",\"4 abapGit Use Cases That Will Blow Your Mind (and gCTS won’t help a bit), Marc Bernard\",\"ABAP File Formats, Albert Mink & Lars Hvam\"]},\"240\":{\"h\":\"2023\",\"t\":[\"7 ways abapGit can transform your development approach for internal development, Ryan Fleischmann\",\"ABAPGit Installation on SAP NetWeaver developer edition 7.52, Ali Jibran\",\"Undo with abapGit, Nuno Godinho\",\"What is abapGit?, Colby Hemond\",\"Managing Updates to abapGit in Shared Development Systems, Fabian Lupa\"]},\"241\":{\"c\":[\"other\"]},\"242\":{\"h\":\"Logos\",\"t\":[\"favicon.png\",\"favicon.svg\",\"logo.png\",\"logo.svg\",\"Git Logo by Jason Long is licensed under the Creative Commons Attribution 3.0 Unported License.\"]},\"243\":{\"c\":[\"other\"]},\"244\":{\"h\":\"Regular Backup\",\"t\":[\"Using abapGit and abapGitServer for regular backup.\",\"Info\",\"Instead of abapGitServer, GitHub or similar can also be used.\"]},\"245\":{\"h\":\"Steps\",\"t\":[\"Install abapGit\",\"Use abapGit to install abapGitServer\",\"Create repository in abapGitServer via the web interface\",\"Clone the repository using abapGit, into the package that should be backed up. abapGit will not delete any objects in the package\",\"Enable write protection\",\"Test backup by staging + commit + pushing from abapGit manually\",\"Configure \\\"background mode\\\" for the repository, Advanced -> Background mode.\",\"Set to \\\"Automatic push, auto author\\\" this will find the user which last changed the objects and use these in the commits.\",\"... or set to \\\"Automatic push, fixed author\\\" this will use the user of the background job\",\"Enter username and password(note: password will be stored in clear text). If abapGit and abapGitServer runs on the same ABAP server, then no password is required, as it will automatically use logon tickets.\",\"On the background mode page: click \\\"Run background logic\\\" to test the setup works\",\"Configure ZABAPGIT to run as a background job(SM36/SM37). Note: a dummy variant has to be created for the program, use SE38 to create the variant, values in the variant are not used for anything in background mode.\",\"Tips\",\"To restore only some objects, use \\\"Advanced > Update Local Checksums\\\"\"]},\"246\":{\"c\":[\"other\"]},\"247\":{\"h\":\"Migrating from SAPlink\",\"t\":[\"Install the slinkee/nuggets into the ABAP system using saplink\",\"Use abapGit to export the objects as normal, see Moving Package into Git\"]},\"248\":{\"c\":[\"other\"]},\"249\":{\"h\":\"Who Uses abapGit?\"},\"250\":{\"h\":\"Customer\",\"t\":[\"bonprix Handelsgesellschaft mbH, Germany\",\"City of Zurich\",\"CHS Inc.\",\"Endress+Hauser InfoServe GmbH+Co. KG\",\"Hansgrohe\",\"Haufe Group\",\"Inchcape Australia\",\"Linde Engineering\",\"Orica\",\"Queensland Health\",\"RheinEnergie AG, Cologne, Germany\",\"Schwarz Group\",\"Sword Holdings\",\"TRR, Sweden\"]},\"251\":{\"h\":\"SAP\",\"t\":[\"SAP IBSO\",\"SAP Labs Czech Republic\"]},\"252\":{\"h\":\"Consulting and Partner\",\"t\":[\"abat AG\",\"adesso orange AG\",\"asbrucon GmbH\",\"Computerservice Wolf\",\"CQSE\",\"Discovery Consulting\",\"dbosoft\",\"emineo\",\"FASTEC\",\"Hochfrequenz Unternehmensberatung GmbH\",\"INVIXO\",\"IT Culture\",\"majcon\",\"Marc Bernard Tools\",\"Microsoft Azure\",\"Nuve Platform\",\"objective partner\",\"OREXES GmbH\",\"percept ltd\",\"PM Eleven\",\"Progress Management\",\"Provide Technologies Inc\",\"Regesta Italia\",\"rku.it GmbH\",\"Resulto Consultoria\",\"SBCG\",\"SE38 IT-Engineering, Neuss, Germany\",\"SoftwareONE\",\"Tricktresor\",\"Yelcho Systems Consulting\"]},\"253\":{\"h\":\"Projects\",\"t\":[\"Projects using abapGit are listed on dotabap.org.\"]},\"254\":{\"h\":\"Updates\",\"t\":[\"Feel free to add your company to this list via pull request (the initial list came from #1574).\"]},\"255\":{\"c\":[\"other\"]},\"256\":{\"h\":\"XML Mismatch\"},\"257\":{\"h\":\"For end-users\",\"t\":[\"Make sure you have the latest version of abapGit installed, see upgrading, after updating try again.\",\"If the error persists, submit an issue to the maintainer of the repository requesting to update to latest version of abapGit serialized files pointing to the guide below.\",\"Or alternatively install an old version of abapGit to allow for installing the files, see next section \\\"For maintainers\\\"\"]},\"258\":{\"h\":\"For maintainers\",\"t\":[\"If the latest version of abapGit is installed and the error message is shown, then the serialized files should be updated to the latest version.\",\"The steps are:\",\"Install the old abapGit version, matching the serialized files\",\"Install the objects into the ABAP system\",\"Install the newest abapGit version\",\"Use the new abapGit to save the files to the git repository\",\"This will overwrite the files in the repository to have the latest format, compatible with the newest abapGit release.\",\"abapGit\",\"Download\",\"XML Serialization\",\"v1.0.0 to current\",\"Link\",\"v1.0.0\"]},\"259\":{\"c\":[\"other\"]},\"260\":{\"h\":\"Projects\"},\"261\":{\"h\":\"Catalog\"},\"262\":{\"h\":\"Online\",\"t\":[\"Installation\",\"Keeping Code Up-to-date\",\"First Project\",\"Moving Package into Git\",\"Pushing Changes to Git\",\"Contributing to a Project\",\"Authentication\"]},\"263\":{\"h\":\"Offline\",\"t\":[\"Installation\",\"Import ZIP\",\"Export ZIP\",\"Compare RFC\"]},\"264\":{\"h\":\"Remove\",\"t\":[\"Uninstall\"]},\"265\":{\"h\":\"Reference\"},\"266\":{\"h\":\"Catalog\",\"t\":[\"Translations and I18n\",\"Supported Object Types\",\"Icon Legend\",\"Hotkeys Legend\",\"User Exits\",\"Authorizations\",\"Namespaces\",\"Packages & Transports\",\"Folders & Files\",\"ABAP Language Version\",\"Note Analyzer\",\"APACK\",\"Database Utility\"]},\"267\":{\"h\":\"ABAP Language Version\"},\"268\":{\"h\":\"ABAP Language Version\",\"t\":[\"With the 7.52 release, SAP provides the usage of the ABAP language version information in the on-premises world.\",\"abapGit has been enhanced to support consistent handling of the ABAP language version across the different abapGit \\\"flavors\\\" (open-source / part of SAP BTP ABAP environment).\",\"Note\",\"Using ABAP language version in abapGit is still an experimental feature.\",\"So far, abapGit handles ABAP language version only for a limited set of object types. See Supported Object Types, below.\"]},\"269\":{\"h\":\"Settings\",\"t\":[\"There are five possible settings for defining how the ABAP language version is handled by abapGit:\",\"Setting\",\"Description\",\"Any (default)\",\"Object-specific ABAP language version\",\"Ignore\",\"ABAP language version not serialized\",\"Standard ABAP\",\"Only objects with \\\"Standard ABAP\\\" are allowed\",\"ABAP for Key Users\",\"Only objects with \\\"ABAP for Key Users\\\" are allowed\",\"ABAP for Cloud Development\",\"Only objects with \\\"ABAP for Cloud Development\\\" are allowed\"]},\"270\":{\"h\":\"Any ABAP Language Version\",\"t\":[\"If you do not define the ABAP language version (default setting \\\"Any\\\"), you can mix objects of any ABAP language version in a repository.\",\"Info\",\"This setting is recommended for repositories containing objects of more than one ABAP language version, which you would like to keep during import.\"]},\"271\":{\"h\":\"Export\",\"t\":[\"When serializing objects, the ABAP language version will be part of the metadata of each object.\"]},\"272\":{\"h\":\"Import\",\"t\":[\"When deserializing objects, abapGit will set the ABAP language version according to the metadata of each object.\",\"Note\",\"The ABAP language version of an object might lead to errors during import or when trying to activate objects. For example, if you try to import \\\"Standard ABAP\\\" into BTP which requires \\\"ABAP for Cloud Development\\\" you might get syntax errors.\"]},\"273\":{\"h\":\"Ignore ABAP Language Version\",\"t\":[\"If you set the ABAP language version to \\\"Ignore\\\" it will not be serialized. This avoids diffs due to variations in development and target environments.\",\"Info\",\"This setting is recommended for cross-platform repositories with code running on-premises and BTP.\"]},\"274\":{\"h\":\"Export\",\"t\":[\"When serializing objects, the ABAP language version will not be part of the object metadata.\"]},\"275\":{\"h\":\"Import\",\"t\":[\"When deserializing objects, abapGit will set the ABAP language version according to the target SAP package (software component).\",\"Note\",\"The ABAP language version of an object might lead to errors during import or when trying to activate objects.\"]},\"276\":{\"h\":\"Standard ABAP, ABAP for Key Users, ABAP for Cloud Development\",\"t\":[\"If a specific ABAP language version is defined, then all objects in the repository must adhere to this ABAP language version. If not, you will receive an error message.\",\"Info\",\"This setting is recommended for repositories that support only one platform.\"]},\"277\":{\"h\":\"Export\",\"t\":[\"When serializing objects, the ABAP language version will be part of the metadata of each object.\"]},\"278\":{\"h\":\"Import\",\"t\":[\"We distinguish two cases:\",\"The root package has the same or an undefined ABAP language version as specified in the repository\",\"When deserializing objects, abapGit will set the ABAP language version according to the setting in the repository.\",\"The root package has a different ABAP language version than specified in the repository\",\"When deserializing objects, abapGit will raise an error message alerting you to the mismatch. To import objects, change the ABAP language version of your root package to match the repository. However, this might not be possible since you can't use \\\"Standard ABAP\\\" on BTP, for example.\"]},\"279\":{\"h\":\"Summary\",\"t\":[\"The following table shows the combinations of ABAP language settings of the repository and of the root package used for importing:\",\"Root Package:\",\"Repo:Any or Ignore\",\"Repo:Standard ABAP\",\"Repo:ABAP for Key Users\",\"Repo:ABAP for Cloud Development\",\"Undefined (Any)\",\"(1)\",\"(1)\",\"(1)\",\"(1)\",\"Standard ABAP\",\"(1)\",\"(2)\",\"(3)\",\"(3)\",\"ABAP for Key Users\",\"(1)\",\"(3)\",\"(2)\",\"(3)\",\"ABAP for Cloud Development\",\"(1)\",\"(3)\",\"(3)\",\"(2)\",\"(1) Import possible (success if the individual objects are compatible with the target system and ABAP language version)\",\"(2) Import possible\",\"(3) Import not possible (error message)\"]},\"280\":{\"h\":\"Examples\",\"t\":[\"If your project uses programs, function modules, or classes not released for \\\"ABAP for Cloud Development\\\", set the ABAP language version to \\\"Standard ABAP\\\". This will ensure that users will not be able to install the project in systems where the use of \\\"ABAP for Cloud Development\\\" is enforced*.\",\"Conversely, if your project uses exclusively objects and code released for ABAP for Key Users or Cloud Development, set the ABAP language version accordingly. This will ensure that only objects compatible with systems will be included in your project, where the use of \\\"ABAP for Cloud Development\\\" is enforced*.\",\"When transferring code from an on premise system to a system where the use of \\\"ABAP for Cloud Development\\\" is enforced* you can use the repository setting Ignore ABAP Language Version if your code has been developed using ABAP language version \\\"Standard ABAP\\\" though it could be activated using ABAP language version \\\"ABAP for Cloud Development\\\" as well. An example for this would be a RAP business object that uses tables with custom developed data elements. In this case the ABAP language version would be set to \\\"ABAP for Cloud Development\\\" based on the settings of the target package.\",\"*(SAP BTP ABAP Environment, SAP S/4HANA ABAP Environment or SAP S/4HANA on prem / private cloud when using a software component with ABAP language version \\\"ABAP for Cloud Development\\\")\",\"Info\",\"You can use abaplint to automatically check for compatibility.\"]},\"281\":{\"h\":\"Supported Object Types\",\"t\":[\"So far, handling of ABAP language version is implemented for the following object types:\",\"CLAS, DEVC, FUGR, INTF, PROG, and objects based on the ABAP file format.\",\"It's planned to support other object types that include the ABAP language version as well.\",\"See Supported Object Types for details.\"]},\"282\":{\"h\":\"Further Information\",\"t\":[\"Standard DocumentationCloud DocumentationBlog and FAQObject Types Supporting ABAP Language Version (in general)\"]},\"283\":{\"c\":[\"reference\"]},\"284\":{\"h\":\"APACK\",\"t\":[\"Packages with a class that implements ZIF_APACK_MANIFEST (the interface is automatically created at the initial start of abapGit) can define metadata that is interpreted by clients that support the APACK package and dependency management framework.\",\"Info\",\"APACK including dependencies is currently only supported by abapGit for ABAP Development Tools (ADT). Please also see the respective tutorial for details.\",\"Such an APACK implementation class must reside in the top-level ABAP package which is serialized by abapGit so that it can be detected properly. After the class is instantiated, it needs to have the field ZIF_APACK_MANIFEST~DESCRIPTOR populated with the respective APACK metadata.\",\"Note: Don't put any functionality in such implementation classes, only use them to advertise APACK metadata.\",\"The metadata follows the POM format by Apache Maven and specifies additional information as well:\",\"group_id: Unique name for your organization or project, e.g. github.com/abapGit\",\"artifact_id: The name for the project, needs to be unique together with the specified group_id, e.g. abapGit\",\"version: The version of your project, should adhere to the semantic versioning concept, e.g. 1.85\",\"repository_type: Currently fixed to abapGit as it's currently the only supported repository type and is set automatically during serialization\",\"git_url: The URL where your main repository is located, e.g. https://github.com/abapGit/abapGit.git\",\"dependencies: Optional, only needs to be filled if this project has dependencies to other projects. You only need to specify group_id, artifact_id, version, and git_url to identify the dependency. target_package is ignored during serialization. Note: Be sure to specify the git_url for each dependency properly as this is currently the only way how dependencies can automatically be resolved.\",\"If such an implementation class is detected during the serialization process, a corresponding .apack-manifest.xml file will be created on the top level of the Git repository. This contains the APACK metadata information.\"]},\"285\":{\"h\":\"APACK in Namespaces\",\"t\":[\"If your project is using a namespace, then using ZIF_APACK_MANIFEST will not work (since it's not part of the namespace, obviously). Simply copy ZIF_APACK_MANIFEST to /namespace/ZIF_APACK_MANIFEST and use this interface in your APACK implementation class (requires abapGit v1.126.0 or higher).\"]},\"286\":{\"h\":\"Transporting APACK implementation classes\",\"t\":[\"The interface ZIF_APACK_MANIFEST is automatically created as a local object, i.e. in package $TMP. If you intend to transport projects containing an implementation class to follow-on systems, you either need to remove the implementation class from the transport or ensure that ZIF_APACK_MANIFEST is available on each follow-on system to avoid syntax errors. So, either let abapGit create it in all systems (don't do that on production) or change the package assignment to a package with the same transport target as your projects and transport them together.\"]},\"287\":{\"h\":\"Examples\",\"t\":[\"See the sample code on GitHub (uses IF_APACK_MANIFEST which is exclusively available on the SAP Cloud Platform ABAP Environment. However, the descriptor format is compatible with ZIF_APACK_MANIFEST.):\",\"YY Data Service\",\"JSON ABAP Konverter (specifies a dependency on the YY Data Service)\"]},\"288\":{\"c\":[\"reference\"]},\"289\":{\"h\":\"Authorizations\",\"t\":[\"You can block actions from users using Authorizations.\",\"You need to create a class named ZCL_ABAPGIT_AUTH_EXIT implementing interface ZIF_ABAPGIT_AUTH, and put inside include ZABAPGIT_AUTHORIZATIONS_EXIT¹ .\",\"Note: If you are using the abapGit development version, do not create the class in the abapGit package.\",\"The interface ZIF_ABAPGIT_AUTH has a constant with all the possible authorizations. Such as:\",\"uninstall\",\"transport_to_branch\",\"update_local_checksum\"]},\"290\":{\"h\":\"Example\",\"t\":[\"Suppose you want to limit the uninstalling of packages to a user named Admin. Your code could look like:\",\"*&---------------------------------------------------------------------* *& Include zabapgit_authorizations_exit *&---------------------------------------------------------------------* CLASS zcl_abapgit_auth_exit DEFINITION CREATE PUBLIC. PUBLIC SECTION. INTERFACES zif_abapgit_auth. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS zcl_abapgit_auth_exit IMPLEMENTATION. METHOD zif_abapgit_auth~is_allowed. IF iv_authorization = zif_abapgit_auth~gc_authorization-uninstall. IF sy-uname = 'ADMIN'. rv_allowed = abap_true. ELSE. rv_allowed = abap_false. ENDIF. ENDIF. ENDMETHOD. ENDCLASS. \"]},\"291\":{\"c\":[\"reference\"]},\"292\":{\"h\":\"Database Utility\",\"t\":[\"Database Utility is a tool for managing database entries created by abapGit. You can access the tool via the tools icon in the top right corner of the abapGit home page .\",\"It's possible to edit database entries of type\",\"SETTINGS\",\"USER\",\"REPO\",\"REPO_CS\",\"BACKGROUND\",\"PACKAGES\",\"Caution: Backup all abapGit database entries, first! Be careful when you edit these entries from within abapGit. Corrupting the XML or setting invalid options might break your abapGit!\"]},\"293\":{\"h\":\"Global Settings\",\"t\":[\"The SETTINGS entries contain global (not user-specific) settings for your abapGit installation. This is an example:\",\" myproxy.com 8080 X I dont.use.proxy.com 50 Update $OBJECT 72 \"]},\"294\":{\"h\":\"User Settings\",\"t\":[\"A USER entry contains meta information like the favorites of an user and their repository configurations e. g. name and email address for Git. This is an example of a USER entry:\",\" 000000000001 000000000002 000000000003 https://[...]/file.git my_username First and Last Name email@example.com https://[...]/file.git my_second_user First and Last Name email@example.com 0 \"]},\"295\":{\"h\":\"Repository Meta Data\",\"t\":[\"The REPO entries contain meta data like Git repository URL, branch, and package information and information about files known and to be excluded.\",\"Info\",\"Older versions of abapGit also stored local checksums under REPO. These have been migrated to REPO_CS (see below).\",\"This is an example:\",\" https://[...]/file.git refs/heads/my_branch Z_MY_PACKAGE my_user 20200418201549.200418 my_user 20200507134505.184445 E /src/ PREFIX /.gitignore /LICENSE /README.md /package.json /.travis.yml /.gitlab-ci.yml /abaplint.json /azure-pipelines.yml /src/.gitkeep My Test Repository ZMY_CHECK_VARIANT X \",\"If you remove a repository entry from the database util, the repository is not shown in abapGit anymore. This is useful for example if you want to remove a repository which has a non-existing package assigned and thus can't be opened and deleted normally.\"]},\"296\":{\"h\":\"Repository Checksums\",\"t\":[\"abapGit persists the checksum (SHA1) of repository files under REPO_CS. For optimized storage, these entries do not use XML but a condensed text format:\",\"Repository name\",\"For each object: \",\"Object Type | Object Name | Package\",\"Path | Filename | Checksum\",\"Example:\",\"#repo_name#abapGit @ /|.abapgit.xml|7c0506a2af34fd1b42027e0288198a00d933d3d4 CLAS|ZCL_ABAPGIT_ADT_LINK|$ABAPGIT_UTILS /src/utils/|zcl_abapgit_adt_link.clas.abap|909437692c00ea4b93c708d2572eb4f014756b2e /src/utils/|zcl_abapgit_adt_link.clas.xml|b171192bcffce8241f08dbd70ed2d5bcfab17f76 CLAS|ZCL_ABAPGIT_AJSON|$ABAPGIT_JSON /src/json/|zcl_abapgit_ajson.clas.abap|ed2a5c09e6cde2c79d667747c42743f60b84e23d /src/json/|zcl_abapgit_ajson.clas.locals_imp.abap|5faf4e8b3bef9ba5033b5e2d325a2b751379b1c3 /src/json/|zcl_abapgit_ajson.clas.testclasses.abap|aa76c1c55421c3b84d52fb79e568f258c3526f55 /src/json/|zcl_abapgit_ajson.clas.xml|94cbfc7bed436a920ed8806359d5323cd8def85e ... \"]},\"297\":{\"h\":\"Background\",\"t\":[\"The BACKGROUND entries show the method and the repository key for which the background action will be executed:\",\"The respective XML file contains the method and optionally the credentials needed for a push:\",\" ZCL_ABAPGIT_BACKGROUND_PULL \"]},\"298\":{\"h\":\"Backup & Restore\",\"t\":[\"You can backup the abapGit database entries using the menu. Entries are stored in a separate XML-file and combined into a single ZIP-archive named abapGit_Backup__